]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame_incremental - server/helpers/custom-validators/videos.ts
Fix tests
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / videos.ts
... / ...
CommitLineData
1import { values } from 'lodash'
2import * as validator from 'validator'
3import 'multer'
4
5import {
6 CONSTRAINTS_FIELDS,
7 VIDEO_CATEGORIES,
8 VIDEO_LICENCES,
9 VIDEO_LANGUAGES,
10 VIDEO_RATE_TYPES
11} from '../../initializers'
12import { isUserUsernameValid } from './users'
13import { isArray, exists } from './misc'
14import { VideoRateType } from '../../../shared'
15
16const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
17const VIDEO_ABUSES_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_ABUSES
18const VIDEO_EVENTS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_EVENTS
19
20function isVideoIdOrUUIDValid (value: string) {
21 return validator.isInt(value) || isVideoUUIDValid(value)
22}
23
24function isVideoAuthorValid (value: string) {
25 return isUserUsernameValid(value)
26}
27
28function isVideoDateValid (value: string) {
29 return exists(value) && validator.isISO8601(value)
30}
31
32function isVideoCategoryValid (value: number) {
33 return VIDEO_CATEGORIES[value] !== undefined
34}
35
36function isVideoLicenceValid (value: number) {
37 return VIDEO_LICENCES[value] !== undefined
38}
39
40function isVideoLanguageValid (value: number) {
41 return value === null || VIDEO_LANGUAGES[value] !== undefined
42}
43
44function isVideoNSFWValid (value: any) {
45 return typeof value === 'boolean' || (typeof value === 'string' && validator.isBoolean(value))
46}
47
48function isVideoDescriptionValid (value: string) {
49 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION)
50}
51
52function isVideoDurationValid (value: string) {
53 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
54}
55
56function isVideoExtnameValid (value: string) {
57 return VIDEOS_CONSTRAINTS_FIELDS.EXTNAME.indexOf(value) !== -1
58}
59
60function isVideoInfoHashValid (value: string) {
61 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
62}
63
64function isVideoNameValid (value: string) {
65 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
66}
67
68function isVideoTagsValid (tags: string[]) {
69 return isArray(tags) &&
70 validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
71 tags.every(tag => {
72 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
73 })
74}
75
76function isVideoThumbnailValid (value: string) {
77 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL)
78}
79
80function isVideoThumbnailDataValid (value: string) {
81 return exists(value) && validator.isByteLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL_DATA)
82}
83
84function isVideoUUIDValid (value: string) {
85 return exists(value) && validator.isUUID('' + value, 4)
86}
87
88function isVideoAbuseReasonValid (value: string) {
89 return exists(value) && validator.isLength(value, VIDEO_ABUSES_CONSTRAINTS_FIELDS.REASON)
90}
91
92function isVideoAbuseReporterUsernameValid (value: string) {
93 return isUserUsernameValid(value)
94}
95
96function isVideoViewsValid (value: string) {
97 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
98}
99
100function isVideoLikesValid (value: string) {
101 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.LIKES)
102}
103
104function isVideoDislikesValid (value: string) {
105 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DISLIKES)
106}
107
108function isVideoEventCountValid (value: string) {
109 return exists(value) && validator.isInt(value + '', VIDEO_EVENTS_CONSTRAINTS_FIELDS.COUNT)
110}
111
112function isVideoRatingTypeValid (value: string) {
113 return values(VIDEO_RATE_TYPES).indexOf(value as VideoRateType) !== -1
114}
115
116function isVideoFile (value: string, files: { [ fieldname: string ]: Express.Multer.File[] }) {
117 // Should have files
118 if (!files) return false
119
120 // Should have videofile file
121 const videofile = files.videofile
122 if (!videofile || videofile.length === 0) return false
123
124 // The file should exist
125 const file = videofile[0]
126 if (!file || !file.originalname) return false
127
128 return new RegExp('^video/(webm|mp4|ogg)$', 'i').test(file.mimetype)
129}
130
131// ---------------------------------------------------------------------------
132
133export {
134 isVideoIdOrUUIDValid,
135 isVideoAuthorValid,
136 isVideoDateValid,
137 isVideoCategoryValid,
138 isVideoLicenceValid,
139 isVideoLanguageValid,
140 isVideoNSFWValid,
141 isVideoDescriptionValid,
142 isVideoDurationValid,
143 isVideoInfoHashValid,
144 isVideoNameValid,
145 isVideoTagsValid,
146 isVideoThumbnailValid,
147 isVideoThumbnailDataValid,
148 isVideoExtnameValid,
149 isVideoUUIDValid,
150 isVideoAbuseReasonValid,
151 isVideoAbuseReporterUsernameValid,
152 isVideoFile,
153 isVideoViewsValid,
154 isVideoLikesValid,
155 isVideoRatingTypeValid,
156 isVideoDislikesValid,
157 isVideoEventCountValid
158}
159
160declare global {
161 namespace ExpressValidator {
162 export interface Validator {
163 isVideoIdOrUUIDValid,
164 isVideoAuthorValid,
165 isVideoDateValid,
166 isVideoCategoryValid,
167 isVideoLicenceValid,
168 isVideoLanguageValid,
169 isVideoNSFWValid,
170 isVideoDescriptionValid,
171 isVideoDurationValid,
172 isVideoInfoHashValid,
173 isVideoNameValid,
174 isVideoTagsValid,
175 isVideoThumbnailValid,
176 isVideoThumbnailDataValid,
177 isVideoExtnameValid,
178 isVideoUUIDValid,
179 isVideoAbuseReasonValid,
180 isVideoAbuseReporterUsernameValid,
181 isVideoFile,
182 isVideoViewsValid,
183 isVideoLikesValid,
184 isVideoRatingTypeValid,
185 isVideoDislikesValid,
186 isVideoEventCountValid
187 }
188 }
189}