]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/custom-validators/videos.ts
Type functions
[github/Chocobozzz/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, exists } 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: string) {
19 return isUserUsernameValid(value)
20 }
21
22 function isVideoDateValid (value: string) {
23 return exists(value) && validator.isISO8601(value)
24 }
25
26 function isVideoCategoryValid (value: number) {
27 return VIDEO_CATEGORIES[value] !== undefined
28 }
29
30 function isVideoLicenceValid (value: number) {
31 return VIDEO_LICENCES[value] !== undefined
32 }
33
34 function isVideoLanguageValid (value: number) {
35 return value === null || VIDEO_LANGUAGES[value] !== undefined
36 }
37
38 function isVideoNSFWValid (value: any) {
39 return typeof value === 'boolean' || (typeof value === 'string' && validator.isBoolean(value))
40 }
41
42 function isVideoDescriptionValid (value: string) {
43 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION)
44 }
45
46 function isVideoDurationValid (value: string) {
47 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
48 }
49
50 function isVideoExtnameValid (value: string) {
51 return VIDEOS_CONSTRAINTS_FIELDS.EXTNAME.indexOf(value) !== -1
52 }
53
54 function isVideoInfoHashValid (value: string) {
55 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
56 }
57
58 function isVideoNameValid (value: string) {
59 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
60 }
61
62 function isVideoTagsValid (tags: string[]) {
63 return isArray(tags) &&
64 validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
65 tags.every(function (tag) {
66 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
67 })
68 }
69
70 function isVideoThumbnailValid (value: string) {
71 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL)
72 }
73
74 function isVideoThumbnailDataValid (value: string) {
75 return exists(value) && validator.isByteLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL_DATA)
76 }
77
78 function isVideoRemoteIdValid (value: string) {
79 return exists(value) && validator.isUUID(value, 4)
80 }
81
82 function isVideoAbuseReasonValid (value: string) {
83 return exists(value) && validator.isLength(value, VIDEO_ABUSES_CONSTRAINTS_FIELDS.REASON)
84 }
85
86 function isVideoAbuseReporterUsernameValid (value: string) {
87 return isUserUsernameValid(value)
88 }
89
90 function isVideoViewsValid (value: string) {
91 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
92 }
93
94 function isVideoLikesValid (value: string) {
95 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.LIKES)
96 }
97
98 function isVideoDislikesValid (value: string) {
99 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DISLIKES)
100 }
101
102 function isVideoEventCountValid (value: string) {
103 return exists(value) && validator.isInt(value + '', VIDEO_EVENTS_CONSTRAINTS_FIELDS.COUNT)
104 }
105
106 function isVideoRatingTypeValid (value: string) {
107 return values(VIDEO_RATE_TYPES).indexOf(value) !== -1
108 }
109
110 function isVideoFile (value: string, files: { [ fieldname: string ]: Express.Multer.File[] }) {
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 }
152
153 declare global {
154 namespace ExpressValidator {
155 export interface Validator {
156 isVideoAuthorValid,
157 isVideoDateValid,
158 isVideoCategoryValid,
159 isVideoLicenceValid,
160 isVideoLanguageValid,
161 isVideoNSFWValid,
162 isVideoDescriptionValid,
163 isVideoDurationValid,
164 isVideoInfoHashValid,
165 isVideoNameValid,
166 isVideoTagsValid,
167 isVideoThumbnailValid,
168 isVideoThumbnailDataValid,
169 isVideoExtnameValid,
170 isVideoRemoteIdValid,
171 isVideoAbuseReasonValid,
172 isVideoAbuseReporterUsernameValid,
173 isVideoFile,
174 isVideoViewsValid,
175 isVideoLikesValid,
176 isVideoRatingTypeValid,
177 isVideoDislikesValid,
178 isVideoEventCountValid
179 }
180 }
181 }