require -> import
[oweals/peertube.git] / server / helpers / custom-validators / videos.ts
1 import { values } from 'lodash'
2 import * as validator from 'validator'
3
4 import {
5   CONSTRAINTS_FIELDS,
6   VIDEO_CATEGORIES,
7   VIDEO_LICENCES,
8   VIDEO_LANGUAGES,
9   VIDEO_RATE_TYPES
10 } from '../../initializers'
11 import { isUserUsernameValid } from './users'
12 import { isArray } from './misc'
13
14 const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
15 const VIDEO_ABUSES_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_ABUSES
16 const VIDEO_EVENTS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_EVENTS
17
18 function isVideoAuthorValid (value) {
19   return isUserUsernameValid(value)
20 }
21
22 function isVideoDateValid (value) {
23   return validator.isDate(value)
24 }
25
26 function isVideoCategoryValid (value) {
27   return VIDEO_CATEGORIES[value] !== undefined
28 }
29
30 function isVideoLicenceValid (value) {
31   return VIDEO_LICENCES[value] !== undefined
32 }
33
34 function isVideoLanguageValid (value) {
35   return value === null || VIDEO_LANGUAGES[value] !== undefined
36 }
37
38 function isVideoNSFWValid (value) {
39   return validator.isBoolean(value)
40 }
41
42 function isVideoDescriptionValid (value) {
43   return validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION)
44 }
45
46 function isVideoDurationValid (value) {
47   return validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
48 }
49
50 function isVideoExtnameValid (value) {
51   return VIDEOS_CONSTRAINTS_FIELDS.EXTNAME.indexOf(value) !== -1
52 }
53
54 function isVideoInfoHashValid (value) {
55   return validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
56 }
57
58 function isVideoNameValid (value) {
59   return validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
60 }
61
62 function isVideoTagsValid (tags) {
63   return isArray(tags) &&
64          validator.isInt(tags.length, VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
65          tags.every(function (tag) {
66            return validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
67          })
68 }
69
70 function isVideoThumbnailValid (value) {
71   return validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL)
72 }
73
74 function isVideoThumbnailDataValid (value) {
75   return validator.isByteLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL_DATA)
76 }
77
78 function isVideoRemoteIdValid (value) {
79   return validator.isUUID(value, 4)
80 }
81
82 function isVideoAbuseReasonValid (value) {
83   return validator.isLength(value, VIDEO_ABUSES_CONSTRAINTS_FIELDS.REASON)
84 }
85
86 function isVideoAbuseReporterUsernameValid (value) {
87   return isUserUsernameValid(value)
88 }
89
90 function isVideoViewsValid (value) {
91   return validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
92 }
93
94 function isVideoLikesValid (value) {
95   return validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.LIKES)
96 }
97
98 function isVideoDislikesValid (value) {
99   return validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DISLIKES)
100 }
101
102 function isVideoEventCountValid (value) {
103   return validator.isInt(value + '', VIDEO_EVENTS_CONSTRAINTS_FIELDS.COUNT)
104 }
105
106 function isVideoRatingTypeValid (value) {
107   return values(VIDEO_RATE_TYPES).indexOf(value) !== -1
108 }
109
110 function isVideoFile (value, files) {
111   // Should have files
112   if (!files) return false
113
114   // Should have videofile file
115   const videofile = files.videofile
116   if (!videofile || videofile.length === 0) return false
117
118   // The file should exist
119   const file = videofile[0]
120   if (!file || !file.originalname) return false
121
122   return new RegExp('^video/(webm|mp4|ogg)$', 'i').test(file.mimetype)
123 }
124
125 // ---------------------------------------------------------------------------
126
127 export {
128   isVideoAuthorValid,
129   isVideoDateValid,
130   isVideoCategoryValid,
131   isVideoLicenceValid,
132   isVideoLanguageValid,
133   isVideoNSFWValid,
134   isVideoDescriptionValid,
135   isVideoDurationValid,
136   isVideoInfoHashValid,
137   isVideoNameValid,
138   isVideoTagsValid,
139   isVideoThumbnailValid,
140   isVideoThumbnailDataValid,
141   isVideoExtnameValid,
142   isVideoRemoteIdValid,
143   isVideoAbuseReasonValid,
144   isVideoAbuseReporterUsernameValid,
145   isVideoFile,
146   isVideoViewsValid,
147   isVideoLikesValid,
148   isVideoRatingTypeValid,
149   isVideoDislikesValid,
150   isVideoEventCountValid
151 }