2018-04-08 21:08:56 +02:00
|
|
|
import uploadFromUrl from '../../../services/drive/upload-from-url';
|
|
|
|
import { IRemoteUser } from '../../../models/user';
|
2018-10-13 10:57:40 +02:00
|
|
|
import DriveFile, { IDriveFile } from '../../../models/drive-file';
|
2018-04-08 22:14:47 +02:00
|
|
|
import Resolver from '../resolver';
|
2018-11-07 11:43:21 +01:00
|
|
|
import fetchMeta from '../../../misc/fetch-meta';
|
2019-02-03 08:45:13 +01:00
|
|
|
import { apLogger } from '../logger';
|
2018-04-08 21:08:56 +02:00
|
|
|
|
2019-02-03 08:45:13 +01:00
|
|
|
const logger = apLogger;
|
2018-04-08 21:08:56 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Imageを作成します。
|
|
|
|
*/
|
2018-06-18 07:28:43 +02:00
|
|
|
export async function createImage(actor: IRemoteUser, value: any): Promise<IDriveFile> {
|
2018-04-19 11:54:34 +02:00
|
|
|
// 投稿者が凍結されていたらスキップ
|
|
|
|
if (actor.isSuspended) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2018-07-19 19:40:37 +02:00
|
|
|
const image = await new Resolver().resolve(value) as any;
|
2018-04-08 22:14:47 +02:00
|
|
|
|
|
|
|
if (image.url == null) {
|
|
|
|
throw new Error('invalid image: url not privided');
|
|
|
|
}
|
|
|
|
|
2019-02-03 08:45:13 +01:00
|
|
|
logger.info(`Creating the Image: ${image.url}`);
|
2018-04-08 21:08:56 +02:00
|
|
|
|
2018-11-07 11:43:21 +01:00
|
|
|
const instance = await fetchMeta();
|
|
|
|
const cache = instance.cacheRemoteFiles;
|
|
|
|
|
2019-03-10 14:27:25 +01:00
|
|
|
let file;
|
|
|
|
try {
|
|
|
|
file = await uploadFromUrl(image.url, actor, null, image.url, image.sensitive, false, !cache);
|
|
|
|
} catch (e) {
|
|
|
|
// 4xxの場合は添付されてなかったことにする
|
|
|
|
if (e >= 400 && e < 500) {
|
|
|
|
logger.warn(`Ignored image: ${image.url} - ${e}`);
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
throw e;
|
|
|
|
}
|
2018-10-13 10:57:40 +02:00
|
|
|
|
2018-10-16 15:21:08 +02:00
|
|
|
if (file.metadata.isRemote) {
|
|
|
|
// URLが異なっている場合、同じ画像が以前に異なるURLで登録されていたということなので、
|
|
|
|
// URLを更新する
|
|
|
|
if (file.metadata.url !== image.url) {
|
|
|
|
file = await DriveFile.findOneAndUpdate({ _id: file._id }, {
|
|
|
|
$set: {
|
|
|
|
'metadata.url': image.url,
|
|
|
|
'metadata.uri': image.url
|
|
|
|
}
|
|
|
|
}, {
|
|
|
|
returnNewDocument: true
|
|
|
|
});
|
|
|
|
}
|
2018-10-13 10:57:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return file;
|
2018-04-08 21:08:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Imageを解決します。
|
|
|
|
*
|
|
|
|
* Misskeyに対象のImageが登録されていればそれを返し、そうでなければ
|
|
|
|
* リモートサーバーからフェッチしてMisskeyに登録しそれを返します。
|
|
|
|
*/
|
|
|
|
export async function resolveImage(actor: IRemoteUser, value: any): Promise<IDriveFile> {
|
|
|
|
// TODO
|
|
|
|
|
|
|
|
// リモートサーバーからフェッチしてきて登録
|
|
|
|
return await createImage(actor, value);
|
|
|
|
}
|