summaryrefslogtreecommitdiff
path: root/src/remote/activitypub/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/remote/activitypub/kernel')
-rw-r--r--src/remote/activitypub/kernel/delete/index.ts42
1 files changed, 32 insertions, 10 deletions
diff --git a/src/remote/activitypub/kernel/delete/index.ts b/src/remote/activitypub/kernel/delete/index.ts
index be7779e026..4fb3d40577 100644
--- a/src/remote/activitypub/kernel/delete/index.ts
+++ b/src/remote/activitypub/kernel/delete/index.ts
@@ -1,26 +1,48 @@
-import Resolver from '../../resolver';
import deleteNote from './note';
import { IRemoteUser } from '../../../../models/entities/user';
-import { IDelete, getApId, validPost } from '../../type';
-import { apLogger } from '../../logger';
+import { IDelete, getApId, isTombstone, IObject, validPost, validActor } from '../../type';
+import { toSingle } from '../../../../prelude/array';
/**
* 削除アクティビティを捌きます
*/
-export default async (actor: IRemoteUser, activity: IDelete): Promise<void> => {
+export default async (actor: IRemoteUser, activity: IDelete): Promise<string> => {
if ('actor' in activity && actor.uri !== activity.actor) {
throw new Error('invalid actor');
}
- const resolver = new Resolver();
+ // 削除対象objectのtype
+ let formarType: string | undefined;
- const object = await resolver.resolve(activity.object);
+ if (typeof activity.object === 'string') {
+ // typeが不明だけど、どうせ消えてるのでremote resolveしない
+ formarType = undefined;
+ } else {
+ const object = activity.object as IObject;
+ if (isTombstone(object)) {
+ formarType = toSingle(object.formerType);
+ } else {
+ formarType = toSingle(object.type);
+ }
+ }
+
+ const uri = getApId(activity.object);
- const uri = getApId(object);
+ // type不明でもactorとobjectが同じならばそれはPersonに違いない
+ if (!formarType && actor.uri === uri) {
+ formarType = 'Person';
+ }
+
+ // それでもなかったらおそらくNote
+ if (!formarType) {
+ formarType = 'Note';
+ }
- if (validPost.includes(object.type) || object.type === 'Tombstone') {
- deleteNote(actor, uri);
+ if (validPost.includes(formarType)) {
+ return await deleteNote(actor, uri);
+ } else if (validActor.includes(formarType)) {
+ return `Delete Actor is not implanted`;
} else {
- apLogger.warn(`Unknown type: ${object.type}`);
+ return `Unknown type ${formarType}`;
}
};