1 import { values } from 'lodash'
2 import * as validator from 'validator'
11 } from '../../initializers'
12 import { isUserUsernameValid } from './users'
13 import { isArray, exists } from './misc'
15 const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
16 const VIDEO_ABUSES_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_ABUSES
17 const VIDEO_EVENTS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_EVENTS
19 function isVideoAuthorValid (value: string) {
20 return isUserUsernameValid(value)
23 function isVideoDateValid (value: string) {
24 return exists(value) && validator.isISO8601(value)
27 function isVideoCategoryValid (value: number) {
28 return VIDEO_CATEGORIES[value] !== undefined
31 function isVideoLicenceValid (value: number) {
32 return VIDEO_LICENCES[value] !== undefined
35 function isVideoLanguageValid (value: number) {
36 return value === null || VIDEO_LANGUAGES[value] !== undefined
39 function isVideoNSFWValid (value: any) {
40 return typeof value === 'boolean' || (typeof value === 'string' && validator.isBoolean(value))
43 function isVideoDescriptionValid (value: string) {
44 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION)
47 function isVideoDurationValid (value: string) {
48 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
51 function isVideoExtnameValid (value: string) {
52 return VIDEOS_CONSTRAINTS_FIELDS.EXTNAME.indexOf(value) !== -1
55 function isVideoInfoHashValid (value: string) {
56 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
59 function isVideoNameValid (value: string) {
60 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
63 function isVideoTagsValid (tags: string[]) {
64 return isArray(tags) &&
65 validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
66 tags.every(function (tag) {
67 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
71 function isVideoThumbnailValid (value: string) {
72 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL)
75 function isVideoThumbnailDataValid (value: string) {
76 return exists(value) && validator.isByteLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL_DATA)
79 function isVideoRemoteIdValid (value: string) {
80 return exists(value) && validator.isUUID(value, 4)
83 function isVideoAbuseReasonValid (value: string) {
84 return exists(value) && validator.isLength(value, VIDEO_ABUSES_CONSTRAINTS_FIELDS.REASON)
87 function isVideoAbuseReporterUsernameValid (value: string) {
88 return isUserUsernameValid(value)
91 function isVideoViewsValid (value: string) {
92 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
95 function isVideoLikesValid (value: string) {
96 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.LIKES)
99 function isVideoDislikesValid (value: string) {
100 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DISLIKES)
103 function isVideoEventCountValid (value: string) {
104 return exists(value) && validator.isInt(value + '', VIDEO_EVENTS_CONSTRAINTS_FIELDS.COUNT)
107 function isVideoRatingTypeValid (value: string) {
108 return values(VIDEO_RATE_TYPES).indexOf(value) !== -1
111 function isVideoFile (value: string, files: { [ fieldname: string ]: Express.Multer.File[] }) {
113 if (!files) return false
115 // Should have videofile file
116 const videofile = files.videofile
117 if (!videofile || videofile.length === 0) return false
119 // The file should exist
120 const file = videofile[0]
121 if (!file || !file.originalname) return false
123 return new RegExp('^video/(webm|mp4|ogg)$', 'i').test(file.mimetype)
126 // ---------------------------------------------------------------------------
131 isVideoCategoryValid,
133 isVideoLanguageValid,
135 isVideoDescriptionValid,
136 isVideoDurationValid,
137 isVideoInfoHashValid,
140 isVideoThumbnailValid,
141 isVideoThumbnailDataValid,
143 isVideoRemoteIdValid,
144 isVideoAbuseReasonValid,
145 isVideoAbuseReporterUsernameValid,
149 isVideoRatingTypeValid,
150 isVideoDislikesValid,
151 isVideoEventCountValid
155 namespace ExpressValidator {
156 export interface Validator {
159 isVideoCategoryValid,
161 isVideoLanguageValid,
163 isVideoDescriptionValid,
164 isVideoDurationValid,
165 isVideoInfoHashValid,
168 isVideoThumbnailValid,
169 isVideoThumbnailDataValid,
171 isVideoRemoteIdValid,
172 isVideoAbuseReasonValid,
173 isVideoAbuseReporterUsernameValid,
177 isVideoRatingTypeValid,
178 isVideoDislikesValid,
179 isVideoEventCountValid