]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame_incremental - server/helpers/custom-validators/videos.ts
Move job queue to redis
[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 { VideoRateType } from '../../../shared'
7import {
8 CONSTRAINTS_FIELDS,
9 VIDEO_CATEGORIES,
10 VIDEO_LANGUAGES,
11 VIDEO_LICENCES,
12 VIDEO_PRIVACIES,
13 VIDEO_RATE_TYPES
14} from '../../initializers'
15import { VideoModel } from '../../models/video/video'
16import { exists, isArray } from './misc'
17
18const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
19const VIDEO_ABUSES_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_ABUSES
20
21function isVideoCategoryValid (value: number) {
22 return value === null || VIDEO_CATEGORIES[value] !== undefined
23}
24
25function isVideoLicenceValid (value: number) {
26 return value === null || VIDEO_LICENCES[value] !== undefined
27}
28
29function isVideoLanguageValid (value: number) {
30 return value === null || VIDEO_LANGUAGES[value] !== undefined
31}
32
33function isVideoDurationValid (value: string) {
34 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
35}
36
37function isVideoTruncatedDescriptionValid (value: string) {
38 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.TRUNCATED_DESCRIPTION)
39}
40
41function isVideoDescriptionValid (value: string) {
42 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION))
43}
44
45function isVideoNameValid (value: string) {
46 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
47}
48
49function isVideoTagValid (tag: string) {
50 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
51}
52
53function isVideoTagsValid (tags: string[]) {
54 return isArray(tags) &&
55 validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
56 tags.every(tag => isVideoTagValid(tag))
57}
58
59function isVideoAbuseReasonValid (value: string) {
60 return exists(value) && validator.isLength(value, VIDEO_ABUSES_CONSTRAINTS_FIELDS.REASON)
61}
62
63function isVideoViewsValid (value: string) {
64 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
65}
66
67function isVideoRatingTypeValid (value: string) {
68 return value === 'none' || values(VIDEO_RATE_TYPES).indexOf(value as VideoRateType) !== -1
69}
70
71function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
72 // Should have files
73 if (!files) return false
74 if (isArray(files)) return false
75
76 // Should have videofile file
77 const videofile = files['videofile']
78 if (!videofile || videofile.length === 0) return false
79
80 // The file should exist
81 const file = videofile[0]
82 if (!file || !file.originalname) return false
83
84 return new RegExp('^video/(webm|mp4|ogg)$', 'i').test(file.mimetype)
85}
86
87function isVideoPrivacyValid (value: string) {
88 return validator.isInt(value + '') && VIDEO_PRIVACIES[value] !== undefined
89}
90
91function isVideoFileInfoHashValid (value: string) {
92 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
93}
94
95function isVideoFileResolutionValid (value: string) {
96 return exists(value) && validator.isInt(value + '')
97}
98
99function isVideoFileSizeValid (value: string) {
100 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE)
101}
102
103async function isVideoExist (id: string, res: Response) {
104 let video: VideoModel
105
106 if (validator.isInt(id)) {
107 video = await VideoModel.loadAndPopulateAccountAndServerAndTags(+id)
108 } else { // UUID
109 video = await VideoModel.loadByUUIDAndPopulateAccountAndServerAndTags(id)
110 }
111
112 if (!video) {
113 res.status(404)
114 .json({ error: 'Video not found' })
115 .end()
116
117 return false
118 }
119
120 res.locals.video = video
121 return true
122}
123
124// ---------------------------------------------------------------------------
125
126export {
127 isVideoCategoryValid,
128 isVideoLicenceValid,
129 isVideoLanguageValid,
130 isVideoTruncatedDescriptionValid,
131 isVideoDescriptionValid,
132 isVideoFileInfoHashValid,
133 isVideoNameValid,
134 isVideoTagsValid,
135 isVideoAbuseReasonValid,
136 isVideoFile,
137 isVideoViewsValid,
138 isVideoRatingTypeValid,
139 isVideoDurationValid,
140 isVideoTagValid,
141 isVideoPrivacyValid,
142 isVideoFileResolutionValid,
143 isVideoFileSizeValid,
144 isVideoExist
145}