Add videos list filters
[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 {
4   isActorAcceptActivityValid, isActorDeleteActivityValid, isActorFollowActivityValid, isActorRejectActivityValid,
5   isActorUpdateActivityValid
6 } from './actor'
7 import { isAnnounceActivityValid } from './announce'
8 import { isActivityPubUrlValid } from './misc'
9 import { isDislikeActivityValid, isLikeActivityValid } from './rate'
10 import { isUndoActivityValid } from './undo'
11 import { isVideoCommentCreateActivityValid, isVideoCommentDeleteActivityValid } from './video-comments'
12 import {
13   isVideoFlagValid,
14   sanitizeAndCheckVideoTorrentCreateActivity,
15   isVideoTorrentDeleteActivityValid,
16   sanitizeAndCheckVideoTorrentUpdateActivity
17 } from './videos'
18 import { isViewActivityValid } from './view'
19 import { exists } from '../misc'
20
21 function isRootActivityValid (activity: any) {
22   return Array.isArray(activity['@context']) && (
23     (
24       (activity.type === 'Collection' || activity.type === 'OrderedCollection') &&
25       validator.isInt(activity.totalItems, { min: 0 }) &&
26       Array.isArray(activity.items)
27     ) ||
28     (
29       isActivityPubUrlValid(activity.id) &&
30       exists(activity.actor) &&
31       (isActivityPubUrlValid(activity.actor) || isActivityPubUrlValid(activity.actor.id))
32     )
33   )
34 }
35
36 const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean } = {
37   Create: checkCreateActivity,
38   Update: checkUpdateActivity,
39   Delete: checkDeleteActivity,
40   Follow: checkFollowActivity,
41   Accept: checkAcceptActivity,
42   Reject: checkRejectActivity,
43   Announce: checkAnnounceActivity,
44   Undo: checkUndoActivity,
45   Like: checkLikeActivity
46 }
47
48 function isActivityValid (activity: any) {
49   const checker = activityCheckers[activity.type]
50   // Unknown activity type
51   if (!checker) return false
52
53   return checker(activity)
54 }
55
56 // ---------------------------------------------------------------------------
57
58 export {
59   isRootActivityValid,
60   isActivityValid
61 }
62
63 // ---------------------------------------------------------------------------
64
65 function checkCreateActivity (activity: any) {
66   return isViewActivityValid(activity) ||
67     isDislikeActivityValid(activity) ||
68     sanitizeAndCheckVideoTorrentCreateActivity(activity) ||
69     isVideoFlagValid(activity) ||
70     isVideoCommentCreateActivityValid(activity)
71 }
72
73 function checkUpdateActivity (activity: any) {
74   return sanitizeAndCheckVideoTorrentUpdateActivity(activity) ||
75     isActorUpdateActivityValid(activity)
76 }
77
78 function checkDeleteActivity (activity: any) {
79   return isVideoTorrentDeleteActivityValid(activity) ||
80     isActorDeleteActivityValid(activity) ||
81     isVideoCommentDeleteActivityValid(activity)
82 }
83
84 function checkFollowActivity (activity: any) {
85   return isActorFollowActivityValid(activity)
86 }
87
88 function checkAcceptActivity (activity: any) {
89   return isActorAcceptActivityValid(activity)
90 }
91
92 function checkRejectActivity (activity: any) {
93   return isActorRejectActivityValid(activity)
94 }
95
96 function checkAnnounceActivity (activity: any) {
97   return isAnnounceActivityValid(activity)
98 }
99
100 function checkUndoActivity (activity: any) {
101   return isUndoActivityValid(activity)
102 }
103
104 function checkLikeActivity (activity: any) {
105   return isLikeActivityValid(activity)
106 }