paricafe/src/remote/activitypub/models/image.ts

72 lines
2 KiB
TypeScript
Raw Normal View History

2018-04-08 14:08:56 -05:00
import uploadFromUrl from '../../../services/drive/upload-from-url';
import { IRemoteUser } from '../../../models/user';
2018-10-13 03:57:40 -05:00
import DriveFile, { IDriveFile } from '../../../models/drive-file';
2018-04-08 15:14:47 -05:00
import Resolver from '../resolver';
2018-11-07 04:43:21 -06:00
import fetchMeta from '../../../misc/fetch-meta';
2019-02-03 01:45:13 -06:00
import { apLogger } from '../logger';
2018-04-08 14:08:56 -05:00
2019-02-03 01:45:13 -06:00
const logger = apLogger;
2018-04-08 14:08:56 -05:00
/**
* Imageを作成します
*/
2018-06-18 00:28:43 -05:00
export async function createImage(actor: IRemoteUser, value: any): Promise<IDriveFile> {
2018-04-19 04:54:34 -05:00
// 投稿者が凍結されていたらスキップ
if (actor.isSuspended) {
return null;
}
2018-07-19 12:40:37 -05:00
const image = await new Resolver().resolve(value) as any;
2018-04-08 15:14:47 -05:00
if (image.url == null) {
throw new Error('invalid image: url not privided');
}
2019-02-03 01:45:13 -06:00
logger.info(`Creating the Image: ${image.url}`);
2018-04-08 14:08:56 -05:00
2018-11-07 04:43:21 -06:00
const instance = await fetchMeta();
const cache = instance.cacheRemoteFiles;
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 03:57:40 -05:00
2018-10-16 08:21:08 -05: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 03:57:40 -05:00
}
return file;
2018-04-08 14:08:56 -05:00
}
/**
* Imageを解決します
*
* Misskeyに対象のImageが登録されていればそれを返し
* Misskeyに登録しそれを返します
*/
export async function resolveImage(actor: IRemoteUser, value: any): Promise<IDriveFile> {
// TODO
// リモートサーバーからフェッチしてきて登録
return await createImage(actor, value);
}