]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/helpers/custom-validators/videos.ts
Fix lint
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / videos.ts
CommitLineData
35bf0c83
C
1import * as Promise from 'bluebird'
2import * as express from 'express'
fdbda9e3 3import 'express-validator'
79d5caf9 4import { values } from 'lodash'
1840c2f7 5import 'multer'
79d5caf9
C
6import * as validator from 'validator'
7import { VideoRateType } from '../../../shared'
8import { logger } from '../../helpers'
65fcc311
C
9import {
10 CONSTRAINTS_FIELDS,
79d5caf9 11 database as db,
65fcc311 12 VIDEO_CATEGORIES,
65fcc311 13 VIDEO_LANGUAGES,
79d5caf9 14 VIDEO_LICENCES,
fd45e8f4 15 VIDEO_PRIVACIES,
79d5caf9 16 VIDEO_RATE_TYPES
65fcc311 17} from '../../initializers'
35bf0c83 18import { VideoInstance } from '../../models'
e34c85e5 19import { isActivityPubUrlValid } from './activitypub/misc'
79d5caf9 20import { exists, isArray } from './misc'
65fcc311
C
21
22const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
23const VIDEO_ABUSES_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_ABUSES
24const VIDEO_EVENTS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_EVENTS
0b697522 25
69818c93 26function isVideoCategoryValid (value: number) {
65fcc311 27 return VIDEO_CATEGORIES[value] !== undefined
6e07c3de
C
28}
29
51c443db
C
30// Maybe we don't know the remote category, but that doesn't matter
31function isRemoteVideoCategoryValid (value: string) {
32 return validator.isInt('' + value)
33}
34
e34c85e5
C
35function isVideoUrlValid (value: string) {
36 return isActivityPubUrlValid(value)
37}
38
69818c93 39function isVideoLicenceValid (value: number) {
65fcc311 40 return VIDEO_LICENCES[value] !== undefined
6f0c39e2
C
41}
42
fd45e8f4
C
43function isVideoPrivacyValid (value: string) {
44 return VIDEO_PRIVACIES[value] !== undefined
45}
46
47// Maybe we don't know the remote privacy setting, but that doesn't matter
48function isRemoteVideoPrivacyValid (value: string) {
49 return validator.isInt('' + value)
50}
51
51c443db
C
52// Maybe we don't know the remote licence, but that doesn't matter
53function isRemoteVideoLicenceValid (value: string) {
54 return validator.isInt('' + value)
55}
56
69818c93 57function isVideoLanguageValid (value: number) {
65fcc311 58 return value === null || VIDEO_LANGUAGES[value] !== undefined
3092476e
C
59}
60
51c443db
C
61// Maybe we don't know the remote language, but that doesn't matter
62function isRemoteVideoLanguageValid (value: string) {
63 return validator.isInt('' + value)
64}
65
69818c93
C
66function isVideoNSFWValid (value: any) {
67 return typeof value === 'boolean' || (typeof value === 'string' && validator.isBoolean(value))
31b59b47
C
68}
69
8e10cf1a
C
70function isVideoDurationValid (value: string) {
71 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
72}
73
9567011b
C
74function isVideoTruncatedDescriptionValid (value: string) {
75 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.TRUNCATED_DESCRIPTION)
76}
77
69818c93
C
78function isVideoDescriptionValid (value: string) {
79 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION)
be587647
C
80}
81
69818c93
C
82function isVideoNameValid (value: string) {
83 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
be587647
C
84}
85
0d0e8dd0
C
86function isVideoTagValid (tag: string) {
87 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
88}
89
69818c93 90function isVideoTagsValid (tags: string[]) {
65fcc311 91 return isArray(tags) &&
69818c93 92 validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
0d0e8dd0 93 tags.every(tag => isVideoTagValid(tag))
be587647
C
94}
95
69818c93
C
96function isVideoThumbnailValid (value: string) {
97 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL)
aaf61f38
C
98}
99
69818c93
C
100function isVideoThumbnailDataValid (value: string) {
101 return exists(value) && validator.isByteLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL_DATA)
be587647
C
102}
103
69818c93
C
104function isVideoAbuseReasonValid (value: string) {
105 return exists(value) && validator.isLength(value, VIDEO_ABUSES_CONSTRAINTS_FIELDS.REASON)
e4c55619
C
106}
107
69818c93
C
108function isVideoViewsValid (value: string) {
109 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
9e167724
C
110}
111
69818c93
C
112function isVideoLikesValid (value: string) {
113 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.LIKES)
9e167724
C
114}
115
69818c93
C
116function isVideoDislikesValid (value: string) {
117 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DISLIKES)
e4c87ec2
C
118}
119
69818c93
C
120function isVideoEventCountValid (value: string) {
121 return exists(value) && validator.isInt(value + '', VIDEO_EVENTS_CONSTRAINTS_FIELDS.COUNT)
9e167724
C
122}
123
69818c93 124function isVideoRatingTypeValid (value: string) {
ee9e7b61 125 return values(VIDEO_RATE_TYPES).indexOf(value as VideoRateType) !== -1
d38b8281
C
126}
127
b60e5f38 128function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
f6f7dfee
C
129 // Should have files
130 if (!files) return false
b60e5f38 131 if (isArray(files)) return false
f6f7dfee
C
132
133 // Should have videofile file
b60e5f38 134 const videofile = files['videofile']
f6f7dfee
C
135 if (!videofile || videofile.length === 0) return false
136
137 // The file should exist
138 const file = videofile[0]
139 if (!file || !file.originalname) return false
140
141 return new RegExp('^video/(webm|mp4|ogg)$', 'i').test(file.mimetype)
142}
143
93e1258c
C
144function isVideoFileSizeValid (value: string) {
145 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE)
146}
147
148function isVideoFileResolutionValid (value: string) {
14d3270f 149 return exists(value) && validator.isInt(value + '')
93e1258c
C
150}
151
152function isVideoFileExtnameValid (value: string) {
153 return VIDEOS_CONSTRAINTS_FIELDS.EXTNAME.indexOf(value) !== -1
154}
155
156function isVideoFileInfoHashValid (value: string) {
157 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
158}
159
35bf0c83
C
160function checkVideoExists (id: string, res: express.Response, callback: () => void) {
161 let promise: Promise<VideoInstance>
162 if (validator.isInt(id)) {
60862425 163 promise = db.Video.loadAndPopulateAccountAndServerAndTags(+id)
35bf0c83 164 } else { // UUID
60862425 165 promise = db.Video.loadByUUIDAndPopulateAccountAndServerAndTags(id)
35bf0c83
C
166 }
167
168 promise.then(video => {
169 if (!video) {
170 return res.status(404)
171 .json({ error: 'Video not found' })
172 .end()
173 }
174
175 res.locals.video = video
176 callback()
177 })
178 .catch(err => {
179 logger.error('Error in video request validator.', err)
180 return res.sendStatus(500)
181 })
182}
183
55fa55a9
C
184// ---------------------------------------------------------------------------
185
65fcc311 186export {
65fcc311
C
187 isVideoCategoryValid,
188 isVideoLicenceValid,
189 isVideoLanguageValid,
190 isVideoNSFWValid,
9567011b 191 isVideoTruncatedDescriptionValid,
65fcc311 192 isVideoDescriptionValid,
93e1258c 193 isVideoFileInfoHashValid,
65fcc311
C
194 isVideoNameValid,
195 isVideoTagsValid,
196 isVideoThumbnailValid,
197 isVideoThumbnailDataValid,
93e1258c 198 isVideoFileExtnameValid,
65fcc311 199 isVideoAbuseReasonValid,
65fcc311
C
200 isVideoFile,
201 isVideoViewsValid,
202 isVideoLikesValid,
203 isVideoRatingTypeValid,
204 isVideoDislikesValid,
93e1258c
C
205 isVideoEventCountValid,
206 isVideoFileSizeValid,
fd45e8f4
C
207 isVideoPrivacyValid,
208 isRemoteVideoPrivacyValid,
8e10cf1a 209 isVideoDurationValid,
35bf0c83 210 isVideoFileResolutionValid,
51c443db 211 checkVideoExists,
0d0e8dd0 212 isVideoTagValid,
51c443db
C
213 isRemoteVideoCategoryValid,
214 isRemoteVideoLicenceValid,
e34c85e5 215 isVideoUrlValid,
51c443db 216 isRemoteVideoLanguageValid
65fcc311 217}