]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/custom-validators/remote/videos.ts
Move video file metadata in their own table
[github/Chocobozzz/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 isVideoUUIDValid,
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 isVideoFileInfoHashValid,
27 isVideoNameValid,
28 isVideoTagsValid,
29 isVideoFileExtnameValid,
30 isVideoFileResolutionValid
31 } from '../videos'
32
33 const ENDPOINT_ACTIONS = REQUEST_ENDPOINT_ACTIONS[REQUEST_ENDPOINTS.VIDEOS]
34
35 function isEachRemoteRequestVideosValid (requests: any[]) {
36 return isArray(requests) &&
37 requests.every(request => {
38 const video = request.data
39
40 if (!video) return false
41
42 return (
43 isRequestTypeAddValid(request.type) &&
44 isCommonVideoAttributesValid(video) &&
45 isVideoAuthorValid(video.author) &&
46 isVideoThumbnailDataValid(video.thumbnailData)
47 ) ||
48 (
49 isRequestTypeUpdateValid(request.type) &&
50 isCommonVideoAttributesValid(video)
51 ) ||
52 (
53 isRequestTypeRemoveValid(request.type) &&
54 isVideoUUIDValid(video.uuid)
55 ) ||
56 (
57 isRequestTypeReportAbuseValid(request.type) &&
58 isVideoUUIDValid(request.data.videoUUID) &&
59 isVideoAbuseReasonValid(request.data.reportReason) &&
60 isVideoAbuseReporterUsernameValid(request.data.reporterUsername)
61 )
62 })
63 }
64
65 function isEachRemoteRequestVideosQaduValid (requests: any[]) {
66 return isArray(requests) &&
67 requests.every(request => {
68 const video = request.data
69
70 if (!video) return false
71
72 return (
73 isVideoUUIDValid(video.uuid) &&
74 (has(video, 'views') === false || isVideoViewsValid(video.views)) &&
75 (has(video, 'likes') === false || isVideoLikesValid(video.likes)) &&
76 (has(video, 'dislikes') === false || isVideoDislikesValid(video.dislikes))
77 )
78 })
79 }
80
81 function isEachRemoteRequestVideosEventsValid (requests: any[]) {
82 return isArray(requests) &&
83 requests.every(request => {
84 const eventData = request.data
85
86 if (!eventData) return false
87
88 return (
89 isVideoUUIDValid(eventData.uuid) &&
90 values(REQUEST_VIDEO_EVENT_TYPES).indexOf(eventData.eventType) !== -1 &&
91 isVideoEventCountValid(eventData.count)
92 )
93 })
94 }
95
96 // ---------------------------------------------------------------------------
97
98 export {
99 isEachRemoteRequestVideosValid,
100 isEachRemoteRequestVideosQaduValid,
101 isEachRemoteRequestVideosEventsValid
102 }
103
104 declare global {
105 namespace ExpressValidator {
106 export interface Validator {
107 isEachRemoteRequestVideosValid,
108 isEachRemoteRequestVideosQaduValid,
109 isEachRemoteRequestVideosEventsValid
110 }
111 }
112 }
113
114 // ---------------------------------------------------------------------------
115
116 function isCommonVideoAttributesValid (video: any) {
117 return isVideoDateValid(video.createdAt) &&
118 isVideoDateValid(video.updatedAt) &&
119 isVideoCategoryValid(video.category) &&
120 isVideoLicenceValid(video.licence) &&
121 isVideoLanguageValid(video.language) &&
122 isVideoNSFWValid(video.nsfw) &&
123 isVideoDescriptionValid(video.description) &&
124 isVideoDurationValid(video.duration) &&
125 isVideoNameValid(video.name) &&
126 isVideoTagsValid(video.tags) &&
127 isVideoUUIDValid(video.uuid) &&
128 isVideoViewsValid(video.views) &&
129 isVideoLikesValid(video.likes) &&
130 isVideoDislikesValid(video.dislikes) &&
131 isArray(video.files) &&
132 video.files.every(videoFile => {
133 if (!videoFile) return false
134
135 return (
136 isVideoFileInfoHashValid(videoFile.infoHash) &&
137 isVideoFileExtnameValid(videoFile.extname) &&
138 isVideoFileResolutionValid(videoFile.resolution)
139 )
140 })
141 }
142
143 function isRequestTypeAddValid (value: string) {
144 return value === ENDPOINT_ACTIONS.ADD
145 }
146
147 function isRequestTypeUpdateValid (value: string) {
148 return value === ENDPOINT_ACTIONS.UPDATE
149 }
150
151 function isRequestTypeRemoveValid (value: string) {
152 return value === ENDPOINT_ACTIONS.REMOVE
153 }
154
155 function isRequestTypeReportAbuseValid (value: string) {
156 return value === ENDPOINT_ACTIONS.REPORT_ABUSE
157 }