1 import { values } from 'lodash'
2 import * as validator from 'validator'
3 import * as Promise from 'bluebird'
4 import * as express from 'express'
5 import 'express-validator'
15 } from '../../initializers'
16 import { isUserUsernameValid } from './users'
17 import { isArray, exists } from './misc'
18 import { VideoInstance } from '../../models'
19 import { logger } from '../../helpers'
20 import { VideoRateType } from '../../../shared'
22 const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
23 const VIDEO_ABUSES_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_ABUSES
24 const VIDEO_EVENTS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_EVENTS
26 function isVideoCategoryValid (value: number) {
27 return VIDEO_CATEGORIES[value] !== undefined
30 function isVideoLicenceValid (value: number) {
31 return VIDEO_LICENCES[value] !== undefined
34 function isVideoLanguageValid (value: number) {
35 return value === null || VIDEO_LANGUAGES[value] !== undefined
38 function isVideoNSFWValid (value: any) {
39 return typeof value === 'boolean' || (typeof value === 'string' && validator.isBoolean(value))
42 function isVideoDescriptionValid (value: string) {
43 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION)
46 function isVideoDurationValid (value: string) {
47 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
50 function isVideoNameValid (value: string) {
51 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
54 function isVideoTagsValid (tags: string[]) {
55 return isArray(tags) &&
56 validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
58 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
62 function isVideoThumbnailValid (value: string) {
63 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL)
66 function isVideoThumbnailDataValid (value: string) {
67 return exists(value) && validator.isByteLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL_DATA)
70 function isVideoAbuseReasonValid (value: string) {
71 return exists(value) && validator.isLength(value, VIDEO_ABUSES_CONSTRAINTS_FIELDS.REASON)
74 function isVideoAbuseReporterUsernameValid (value: string) {
75 return isUserUsernameValid(value)
78 function isVideoViewsValid (value: string) {
79 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
82 function isVideoLikesValid (value: string) {
83 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.LIKES)
86 function isVideoDislikesValid (value: string) {
87 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DISLIKES)
90 function isVideoEventCountValid (value: string) {
91 return exists(value) && validator.isInt(value + '', VIDEO_EVENTS_CONSTRAINTS_FIELDS.COUNT)
94 function isVideoRatingTypeValid (value: string) {
95 return values(VIDEO_RATE_TYPES).indexOf(value as VideoRateType) !== -1
98 function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
100 if (!files) return false
101 if (isArray(files)) return false
103 // Should have videofile file
104 const videofile = files['videofile']
105 if (!videofile || videofile.length === 0) return false
107 // The file should exist
108 const file = videofile[0]
109 if (!file || !file.originalname) return false
111 return new RegExp('^video/(webm|mp4|ogg)$', 'i').test(file.mimetype)
114 function isVideoFileSizeValid (value: string) {
115 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE)
118 function isVideoFileResolutionValid (value: string) {
119 return exists(value) && validator.isInt(value + '')
122 function isVideoFileExtnameValid (value: string) {
123 return VIDEOS_CONSTRAINTS_FIELDS.EXTNAME.indexOf(value) !== -1
126 function isVideoFileInfoHashValid (value: string) {
127 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
130 function checkVideoExists (id: string, res: express.Response, callback: () => void) {
131 let promise: Promise<VideoInstance>
132 if (validator.isInt(id)) {
133 promise = db.Video.loadAndPopulateAuthorAndPodAndTags(+id)
135 promise = db.Video.loadByUUIDAndPopulateAuthorAndPodAndTags(id)
138 promise.then(video => {
140 return res.status(404)
141 .json({ error: 'Video not found' })
145 res.locals.video = video
149 logger.error('Error in video request validator.', err)
150 return res.sendStatus(500)
154 // ---------------------------------------------------------------------------
157 isVideoCategoryValid,
159 isVideoLanguageValid,
161 isVideoDescriptionValid,
162 isVideoDurationValid,
163 isVideoFileInfoHashValid,
166 isVideoThumbnailValid,
167 isVideoThumbnailDataValid,
168 isVideoFileExtnameValid,
169 isVideoAbuseReasonValid,
170 isVideoAbuseReporterUsernameValid,
174 isVideoRatingTypeValid,
175 isVideoDislikesValid,
176 isVideoEventCountValid,
177 isVideoFileSizeValid,
178 isVideoFileResolutionValid,