]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame_incremental - server/helpers/custom-validators/videos.ts
Add create-import-video-file-job command
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / videos.ts
... / ...
CommitLineData
1import { Response } from 'express'
2import 'express-validator'
3import { values } from 'lodash'
4import 'multer'
5import * as validator from 'validator'
6import { UserRight, VideoRateType } from '../../../shared'
7import {
8 CONSTRAINTS_FIELDS,
9 VIDEO_CATEGORIES,
10 VIDEO_LANGUAGES,
11 VIDEO_LICENCES, VIDEO_MIMETYPE_EXT,
12 VIDEO_PRIVACIES,
13 VIDEO_RATE_TYPES
14} from '../../initializers'
15import { VideoModel } from '../../models/video/video'
16import { exists, isArray, isFileValid } from './misc'
17import { VideoChannelModel } from '../../models/video/video-channel'
18import { UserModel } from '../../models/account/user'
19
20const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
21const VIDEO_ABUSES_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_ABUSES
22
23function isVideoCategoryValid (value: any) {
24 return value === null || VIDEO_CATEGORIES[value] !== undefined
25}
26
27function isVideoLicenceValid (value: any) {
28 return value === null || VIDEO_LICENCES[value] !== undefined
29}
30
31function isVideoLanguageValid (value: any) {
32 return value === null ||
33 (typeof value === 'string' && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.LANGUAGE))
34}
35
36function isVideoDurationValid (value: string) {
37 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
38}
39
40function isVideoTruncatedDescriptionValid (value: string) {
41 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.TRUNCATED_DESCRIPTION)
42}
43
44function isVideoDescriptionValid (value: string) {
45 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION))
46}
47
48function isVideoSupportValid (value: string) {
49 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.SUPPORT))
50}
51
52function isVideoNameValid (value: string) {
53 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
54}
55
56function isVideoTagValid (tag: string) {
57 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
58}
59
60function isVideoTagsValid (tags: string[]) {
61 return tags === null || (
62 isArray(tags) &&
63 validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
64 tags.every(tag => isVideoTagValid(tag))
65 )
66}
67
68function isVideoAbuseReasonValid (value: string) {
69 return exists(value) && validator.isLength(value, VIDEO_ABUSES_CONSTRAINTS_FIELDS.REASON)
70}
71
72function isVideoViewsValid (value: string) {
73 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
74}
75
76function isVideoRatingTypeValid (value: string) {
77 return value === 'none' || values(VIDEO_RATE_TYPES).indexOf(value as VideoRateType) !== -1
78}
79
80const videoFileTypes = Object.keys(VIDEO_MIMETYPE_EXT).map(m => `(${m})`)
81const videoFileTypesRegex = videoFileTypes.join('|')
82function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
83 return isFileValid(files, videoFileTypesRegex, 'videofile')
84}
85
86const videoImageTypes = CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME
87 .map(v => v.replace('.', ''))
88 .join('|')
89const videoImageTypesRegex = `image/(${videoImageTypes})`
90function isVideoImage (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], field: string) {
91 return isFileValid(files, videoImageTypesRegex, field, true)
92}
93
94function isVideoPrivacyValid (value: string) {
95 return validator.isInt(value + '') && VIDEO_PRIVACIES[value] !== undefined
96}
97
98function isVideoFileInfoHashValid (value: string) {
99 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
100}
101
102function isVideoFileResolutionValid (value: string) {
103 return exists(value) && validator.isInt(value + '')
104}
105
106function isVideoFileSizeValid (value: string) {
107 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE)
108}
109
110async function isVideoExist (id: string, res: Response) {
111 let video: VideoModel
112
113 if (validator.isInt(id)) {
114 video = await VideoModel.loadAndPopulateAccountAndServerAndTags(+id)
115 } else { // UUID
116 video = await VideoModel.loadByUUIDAndPopulateAccountAndServerAndTags(id)
117 }
118
119 if (!video) {
120 res.status(404)
121 .json({ error: 'Video not found' })
122 .end()
123
124 return false
125 }
126
127 res.locals.video = video
128 return true
129}
130
131async function isVideoChannelOfAccountExist (channelId: number, user: UserModel, res: Response) {
132 if (user.hasRight(UserRight.UPDATE_ANY_VIDEO) === true) {
133 const videoChannel = await VideoChannelModel.loadAndPopulateAccount(channelId)
134 if (!videoChannel) {
135 res.status(400)
136 .json({ error: 'Unknown video video channel on this instance.' })
137 .end()
138
139 return false
140 }
141
142 res.locals.videoChannel = videoChannel
143 return true
144 }
145
146 const videoChannel = await VideoChannelModel.loadByIdAndAccount(channelId, user.Account.id)
147 if (!videoChannel) {
148 res.status(400)
149 .json({ error: 'Unknown video video channel for this account.' })
150 .end()
151
152 return false
153 }
154
155 res.locals.videoChannel = videoChannel
156 return true
157}
158
159// ---------------------------------------------------------------------------
160
161export {
162 isVideoCategoryValid,
163 isVideoLicenceValid,
164 isVideoLanguageValid,
165 isVideoTruncatedDescriptionValid,
166 isVideoDescriptionValid,
167 isVideoFileInfoHashValid,
168 isVideoNameValid,
169 isVideoTagsValid,
170 isVideoAbuseReasonValid,
171 isVideoFile,
172 isVideoViewsValid,
173 isVideoRatingTypeValid,
174 isVideoDurationValid,
175 isVideoTagValid,
176 isVideoPrivacyValid,
177 isVideoFileResolutionValid,
178 isVideoFileSizeValid,
179 isVideoExist,
180 isVideoImage,
181 isVideoChannelOfAccountExist,
182 isVideoSupportValid
183}