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