diff options
Diffstat (limited to 'src/remote/activitypub/kernel/index.ts')
| -rw-r--r-- | src/remote/activitypub/kernel/index.ts | 83 |
1 files changed, 34 insertions, 49 deletions
diff --git a/src/remote/activitypub/kernel/index.ts b/src/remote/activitypub/kernel/index.ts index a0646bdd67..c8298dc797 100644 --- a/src/remote/activitypub/kernel/index.ts +++ b/src/remote/activitypub/kernel/index.ts @@ -1,4 +1,4 @@ -import { Object } from '../type'; +import { IObject, isCreate, isDelete, isUpdate, isFollow, isAccept, isReject, isAdd, isRemove, isAnnounce, isLike, isUndo, isBlock, isCollectionOrOrderedCollection, isCollection } from '../type'; import { IRemoteUser } from '../../../models/entities/user'; import create from './create'; import performDeleteActivity from './delete'; @@ -13,68 +13,53 @@ import add from './add'; import remove from './remove'; import block from './block'; import { apLogger } from '../logger'; +import Resolver from '../resolver'; +import { toArray } from '../../../prelude/array'; -const self = async (actor: IRemoteUser, activity: Object): Promise<void> => { +export async function performActivity(actor: IRemoteUser, activity: IObject) { + if (isCollectionOrOrderedCollection(activity)) { + const resolver = new Resolver(); + for (const item of toArray(isCollection(activity) ? activity.items : activity.orderedItems)) { + const act = await resolver.resolve(item); + try { + await performOneActivity(actor, act); + } catch (e) { + apLogger.error(e); + } + } + } else { + await performOneActivity(actor, activity); + } +} + +async function performOneActivity(actor: IRemoteUser, activity: IObject): Promise<void> { if (actor.isSuspended) return; - switch (activity.type) { - case 'Create': + if (isCreate(activity)) { await create(actor, activity); - break; - - case 'Delete': + } else if (isDelete(activity)) { await performDeleteActivity(actor, activity); - break; - - case 'Update': + } else if (isUpdate(activity)) { await performUpdateActivity(actor, activity); - break; - - case 'Follow': + } else if (isFollow(activity)) { await follow(actor, activity); - break; - - case 'Accept': + } else if (isAccept(activity)) { await accept(actor, activity); - break; - - case 'Reject': + } else if (isReject(activity)) { await reject(actor, activity); - break; - - case 'Add': + } else if (isAdd(activity)) { await add(actor, activity).catch(err => apLogger.error(err)); - break; - - case 'Remove': + } else if (isRemove(activity)) { await remove(actor, activity).catch(err => apLogger.error(err)); - break; - - case 'Announce': + } else if (isAnnounce(activity)) { await announce(actor, activity); - break; - - case 'Like': + } else if (isLike(activity)) { await like(actor, activity); - break; - - case 'Undo': + } else if (isUndo(activity)) { await undo(actor, activity); - break; - - case 'Block': + } else if (isBlock(activity)) { await block(actor, activity); - break; - - case 'Collection': - case 'OrderedCollection': - // TODO - break; - - default: + } else { apLogger.warn(`unknown activity type: ${(activity as any).type}`); - return; } -}; - -export default self; +} |