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