aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/controllers/activitypub/inbox.ts
diff options
context:
space:
mode:
Diffstat (limited to 'server/controllers/activitypub/inbox.ts')
-rw-r--r--server/controllers/activitypub/inbox.ts72
1 files changed, 72 insertions, 0 deletions
diff --git a/server/controllers/activitypub/inbox.ts b/server/controllers/activitypub/inbox.ts
new file mode 100644
index 000000000..79d989c2c
--- /dev/null
+++ b/server/controllers/activitypub/inbox.ts
@@ -0,0 +1,72 @@
1import * as express from 'express'
2
3import {
4 processCreateActivity,
5 processUpdateActivity,
6 processFlagActivity
7} from '../../lib'
8import {
9 Activity,
10 ActivityType,
11 RootActivity,
12 ActivityPubCollection,
13 ActivityPubOrderedCollection
14} from '../../../shared'
15import {
16 signatureValidator,
17 checkSignature,
18 asyncMiddleware
19} from '../../middlewares'
20import { logger } from '../../helpers'
21
22const processActivity: { [ P in ActivityType ]: (activity: Activity) => Promise<any> } = {
23 Create: processCreateActivity,
24 Update: processUpdateActivity,
25 Flag: processFlagActivity
26}
27
28const inboxRouter = express.Router()
29
30inboxRouter.post('/',
31 signatureValidator,
32 asyncMiddleware(checkSignature),
33 // inboxValidator,
34 asyncMiddleware(inboxController)
35)
36
37// ---------------------------------------------------------------------------
38
39export {
40 inboxRouter
41}
42
43// ---------------------------------------------------------------------------
44
45async function inboxController (req: express.Request, res: express.Response, next: express.NextFunction) {
46 const rootActivity: RootActivity = req.body
47 let activities: Activity[] = []
48
49 if ([ 'Collection', 'CollectionPage' ].indexOf(rootActivity.type) !== -1) {
50 activities = (rootActivity as ActivityPubCollection).items
51 } else if ([ 'OrderedCollection', 'OrderedCollectionPage' ].indexOf(rootActivity.type) !== -1) {
52 activities = (rootActivity as ActivityPubOrderedCollection).orderedItems
53 } else {
54 activities = [ rootActivity as Activity ]
55 }
56
57 await processActivities(activities)
58
59 res.status(204).end()
60}
61
62async function processActivities (activities: Activity[]) {
63 for (const activity of activities) {
64 const activityProcessor = processActivity[activity.type]
65 if (activityProcessor === undefined) {
66 logger.warn('Unknown activity type %s.', activity.type, { activityId: activity.id })
67 continue
68 }
69
70 await activityProcessor(activity)
71 }
72}