Begin moving video channel to actor
[oweals/peertube.git] / server / helpers / custom-validators / activitypub / activity.ts
1 import * as validator from 'validator'
2 import { Activity, ActivityType } from '../../../../shared/models/activitypub'
3 import { isActorAcceptActivityValid, isActorDeleteActivityValid, isActorFollowActivityValid } from './actor'
4 import { isAnnounceActivityValid } from './announce'
5 import { isActivityPubUrlValid } from './misc'
6 import { isDislikeActivityValid, isLikeActivityValid } from './rate'
7 import { isUndoActivityValid } from './undo'
8 import { isVideoChannelDeleteActivityValid, isVideoChannelUpdateActivityValid } from './video-channels'
9 import {
10   isVideoFlagValid,
11   isVideoTorrentCreateActivityValid,
12   isVideoTorrentDeleteActivityValid,
13   isVideoTorrentUpdateActivityValid
14 } from './videos'
15 import { isViewActivityValid } from './view'
16
17 function isRootActivityValid (activity: any) {
18   return Array.isArray(activity['@context']) &&
19     (
20       (activity.type === 'Collection' || activity.type === 'OrderedCollection') &&
21       validator.isInt(activity.totalItems, { min: 0 }) &&
22       Array.isArray(activity.items)
23     ) ||
24     (
25       isActivityPubUrlValid(activity.id) &&
26       isActivityPubUrlValid(activity.actor)
27     )
28 }
29
30 const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean } = {
31   Create: checkCreateActivity,
32   Update: checkUpdateActivity,
33   Delete: checkDeleteActivity,
34   Follow: checkFollowActivity,
35   Accept: checkAcceptActivity,
36   Announce: checkAnnounceActivity,
37   Undo: checkUndoActivity,
38   Like: checkLikeActivity
39 }
40
41 function isActivityValid (activity: any) {
42   const checker = activityCheckers[activity.type]
43   // Unknown activity type
44   if (!checker) return false
45
46   return checker(activity)
47 }
48
49 // ---------------------------------------------------------------------------
50
51 export {
52   isRootActivityValid,
53   isActivityValid
54 }
55
56 // ---------------------------------------------------------------------------
57
58 function checkCreateActivity (activity: any) {
59   return isViewActivityValid(activity) ||
60     isDislikeActivityValid(activity) ||
61     isVideoTorrentCreateActivityValid(activity) ||
62     isVideoFlagValid(activity)
63 }
64
65 function checkUpdateActivity (activity: any) {
66   return isVideoTorrentUpdateActivityValid(activity) ||
67     isVideoChannelUpdateActivityValid(activity)
68 }
69
70 function checkDeleteActivity (activity: any) {
71   return isVideoTorrentDeleteActivityValid(activity) ||
72     isVideoChannelDeleteActivityValid(activity) ||
73     isActorDeleteActivityValid(activity)
74 }
75
76 function checkFollowActivity (activity: any) {
77   return isActorFollowActivityValid(activity)
78 }
79
80 function checkAcceptActivity (activity: any) {
81   return isActorAcceptActivityValid(activity)
82 }
83
84 function checkAnnounceActivity (activity: any) {
85   return isAnnounceActivityValid(activity)
86 }
87
88 function checkUndoActivity (activity: any) {
89   return isUndoActivityValid(activity)
90 }
91
92 function checkLikeActivity (activity: any) {
93   return isLikeActivityValid(activity)
94 }