]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame_incremental - server/helpers/custom-validators/videos.ts
Resolve enums at compile time
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / videos.ts
... / ...
CommitLineData
1import { UploadFilesForCheck } from 'express'
2import { values } from 'lodash'
3import magnetUtil from 'magnet-uri'
4import validator from 'validator'
5import { VideoFilter, VideoInclude, VideoPrivacy, VideoRateType } from '@shared/models'
6import {
7 CONSTRAINTS_FIELDS,
8 MIMETYPES,
9 VIDEO_CATEGORIES,
10 VIDEO_LICENCES,
11 VIDEO_LIVE,
12 VIDEO_PRIVACIES,
13 VIDEO_RATE_TYPES,
14 VIDEO_STATES
15} from '../../initializers/constants'
16import { exists, isArray, isDateValid, isFileMimeTypeValid, isFileValid } from './misc'
17
18const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
19
20function isVideoFilterValid (filter: VideoFilter) {
21 return filter === 'local' || filter === 'all-local' || filter === 'all'
22}
23
24function isVideoIncludeValid (include: VideoInclude) {
25 return exists(include) && validator.isInt('' + include)
26}
27
28function isVideoCategoryValid (value: any) {
29 return value === null || VIDEO_CATEGORIES[value] !== undefined
30}
31
32function isVideoStateValid (value: any) {
33 return exists(value) && VIDEO_STATES[value] !== undefined
34}
35
36function isVideoLicenceValid (value: any) {
37 return value === null || VIDEO_LICENCES[value] !== undefined
38}
39
40function isVideoLanguageValid (value: any) {
41 return value === null ||
42 (typeof value === 'string' && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.LANGUAGE))
43}
44
45function isVideoDurationValid (value: string) {
46 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
47}
48
49function isVideoTruncatedDescriptionValid (value: string) {
50 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.TRUNCATED_DESCRIPTION)
51}
52
53function isVideoDescriptionValid (value: string) {
54 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION))
55}
56
57function isVideoSupportValid (value: string) {
58 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.SUPPORT))
59}
60
61function isVideoNameValid (value: string) {
62 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
63}
64
65function isVideoTagValid (tag: string) {
66 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
67}
68
69function isVideoTagsValid (tags: string[]) {
70 return tags === null || (
71 isArray(tags) &&
72 validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
73 tags.every(tag => isVideoTagValid(tag))
74 )
75}
76
77function isVideoViewsValid (value: string) {
78 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
79}
80
81function isVideoRatingTypeValid (value: string) {
82 return value === 'none' || values(VIDEO_RATE_TYPES).includes(value as VideoRateType)
83}
84
85function isVideoFileExtnameValid (value: string) {
86 return exists(value) && (value === VIDEO_LIVE.EXTENSION || MIMETYPES.VIDEO.EXT_MIMETYPE[value] !== undefined)
87}
88
89function isVideoFileMimeTypeValid (files: UploadFilesForCheck) {
90 return isFileMimeTypeValid(files, MIMETYPES.VIDEO.MIMETYPES_REGEX, 'videofile')
91}
92
93const videoImageTypes = CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME
94 .map(v => v.replace('.', ''))
95 .join('|')
96const videoImageTypesRegex = `image/(${videoImageTypes})`
97
98function isVideoImage (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], field: string) {
99 return isFileValid(files, videoImageTypesRegex, field, CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max, true)
100}
101
102function isVideoPrivacyValid (value: number) {
103 return VIDEO_PRIVACIES[value] !== undefined
104}
105
106function isScheduleVideoUpdatePrivacyValid (value: number) {
107 return value === VideoPrivacy.UNLISTED || value === VideoPrivacy.PUBLIC || value === VideoPrivacy.INTERNAL
108}
109
110function isVideoOriginallyPublishedAtValid (value: string | null) {
111 return value === null || isDateValid(value)
112}
113
114function isVideoFileInfoHashValid (value: string | null | undefined) {
115 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
116}
117
118function isVideoFileResolutionValid (value: string) {
119 return exists(value) && validator.isInt(value + '')
120}
121
122function isVideoFPSResolutionValid (value: string) {
123 return value === null || validator.isInt(value + '')
124}
125
126function isVideoFileSizeValid (value: string) {
127 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE)
128}
129
130function isVideoMagnetUriValid (value: string) {
131 if (!exists(value)) return false
132
133 const parsed = magnetUtil.decode(value)
134 return parsed && isVideoFileInfoHashValid(parsed.infoHash)
135}
136
137// ---------------------------------------------------------------------------
138
139export {
140 isVideoCategoryValid,
141 isVideoLicenceValid,
142 isVideoLanguageValid,
143 isVideoTruncatedDescriptionValid,
144 isVideoDescriptionValid,
145 isVideoFileInfoHashValid,
146 isVideoNameValid,
147 isVideoTagsValid,
148 isVideoFPSResolutionValid,
149 isScheduleVideoUpdatePrivacyValid,
150 isVideoOriginallyPublishedAtValid,
151 isVideoMagnetUriValid,
152 isVideoStateValid,
153 isVideoIncludeValid,
154 isVideoViewsValid,
155 isVideoRatingTypeValid,
156 isVideoFileExtnameValid,
157 isVideoFileMimeTypeValid,
158 isVideoDurationValid,
159 isVideoTagValid,
160 isVideoPrivacyValid,
161 isVideoFileResolutionValid,
162 isVideoFileSizeValid,
163 isVideoImage,
164 isVideoSupportValid,
165 isVideoFilterValid
166}