1df7316aa8cbc2cc7cb766bfa8ea19ed31143adb
[oweals/peertube.git] / server / helpers / custom-validators / remote / videos.ts
1 import { has, values } from 'lodash'
2
3 import {
4   REQUEST_ENDPOINTS,
5   REQUEST_ENDPOINT_ACTIONS,
6   REQUEST_VIDEO_EVENT_TYPES
7 } from '../../../initializers'
8 import { isArray } from '../misc'
9 import {
10   isVideoAuthorValid,
11   isVideoThumbnailDataValid,
12   isVideoRemoteIdValid,
13   isVideoAbuseReasonValid,
14   isVideoAbuseReporterUsernameValid,
15   isVideoViewsValid,
16   isVideoLikesValid,
17   isVideoDislikesValid,
18   isVideoEventCountValid,
19   isVideoDateValid,
20   isVideoCategoryValid,
21   isVideoLicenceValid,
22   isVideoLanguageValid,
23   isVideoNSFWValid,
24   isVideoDescriptionValid,
25   isVideoDurationValid,
26   isVideoInfoHashValid,
27   isVideoNameValid,
28   isVideoTagsValid,
29   isVideoExtnameValid
30 } from '../videos'
31
32 const ENDPOINT_ACTIONS = REQUEST_ENDPOINT_ACTIONS[REQUEST_ENDPOINTS.VIDEOS]
33
34 function isEachRemoteRequestVideosValid (requests: any[]) {
35   return isArray(requests) &&
36     requests.every(function (request) {
37       const video = request.data
38
39       if (!video) return false
40
41       return (
42         isRequestTypeAddValid(request.type) &&
43         isCommonVideoAttributesValid(video) &&
44         isVideoAuthorValid(video.author) &&
45         isVideoThumbnailDataValid(video.thumbnailData)
46       ) ||
47       (
48         isRequestTypeUpdateValid(request.type) &&
49         isCommonVideoAttributesValid(video)
50       ) ||
51       (
52         isRequestTypeRemoveValid(request.type) &&
53         isVideoRemoteIdValid(video.remoteId)
54       ) ||
55       (
56         isRequestTypeReportAbuseValid(request.type) &&
57         isVideoRemoteIdValid(request.data.videoRemoteId) &&
58         isVideoAbuseReasonValid(request.data.reportReason) &&
59         isVideoAbuseReporterUsernameValid(request.data.reporterUsername)
60       )
61     })
62 }
63
64 function isEachRemoteRequestVideosQaduValid (requests: any[]) {
65   return isArray(requests) &&
66     requests.every(function (request) {
67       const video = request.data
68
69       if (!video) return false
70
71       return (
72         isVideoRemoteIdValid(video.remoteId) &&
73         (has(video, 'views') === false || isVideoViewsValid(video.views)) &&
74         (has(video, 'likes') === false || isVideoLikesValid(video.likes)) &&
75         (has(video, 'dislikes') === false || isVideoDislikesValid(video.dislikes))
76       )
77     })
78 }
79
80 function isEachRemoteRequestVideosEventsValid (requests: any[]) {
81   return isArray(requests) &&
82     requests.every(function (request) {
83       const eventData = request.data
84
85       if (!eventData) return false
86
87       return (
88         isVideoRemoteIdValid(eventData.remoteId) &&
89         values(REQUEST_VIDEO_EVENT_TYPES).indexOf(eventData.eventType) !== -1 &&
90         isVideoEventCountValid(eventData.count)
91       )
92     })
93 }
94
95 // ---------------------------------------------------------------------------
96
97 export {
98   isEachRemoteRequestVideosValid,
99   isEachRemoteRequestVideosQaduValid,
100   isEachRemoteRequestVideosEventsValid
101 }
102
103 declare global {
104   namespace ExpressValidator {
105     export interface Validator {
106       isEachRemoteRequestVideosValid,
107       isEachRemoteRequestVideosQaduValid,
108       isEachRemoteRequestVideosEventsValid
109     }
110   }
111 }
112
113 // ---------------------------------------------------------------------------
114
115 function isCommonVideoAttributesValid (video: any) {
116   return isVideoDateValid(video.createdAt) &&
117          isVideoDateValid(video.updatedAt) &&
118          isVideoCategoryValid(video.category) &&
119          isVideoLicenceValid(video.licence) &&
120          isVideoLanguageValid(video.language) &&
121          isVideoNSFWValid(video.nsfw) &&
122          isVideoDescriptionValid(video.description) &&
123          isVideoDurationValid(video.duration) &&
124          isVideoInfoHashValid(video.infoHash) &&
125          isVideoNameValid(video.name) &&
126          isVideoTagsValid(video.tags) &&
127          isVideoRemoteIdValid(video.remoteId) &&
128          isVideoExtnameValid(video.extname) &&
129          isVideoViewsValid(video.views) &&
130          isVideoLikesValid(video.likes) &&
131          isVideoDislikesValid(video.dislikes)
132 }
133
134 function isRequestTypeAddValid (value: string) {
135   return value === ENDPOINT_ACTIONS.ADD
136 }
137
138 function isRequestTypeUpdateValid (value: string) {
139   return value === ENDPOINT_ACTIONS.UPDATE
140 }
141
142 function isRequestTypeRemoveValid (value: string) {
143   return value === ENDPOINT_ACTIONS.REMOVE
144 }
145
146 function isRequestTypeReportAbuseValid (value: string) {
147   return value === ENDPOINT_ACTIONS.REPORT_ABUSE
148 }