]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/custom-validators/videos.ts
A few updates for the watch video view (#181)
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / videos.ts
1 import { Response } from 'express'
2 import 'express-validator'
3 import { values } from 'lodash'
4 import 'multer'
5 import * as validator from 'validator'
6 import { VideoRateType } from '../../../shared'
7 import {
8 CONSTRAINTS_FIELDS,
9 VIDEO_CATEGORIES,
10 VIDEO_LANGUAGES,
11 VIDEO_LICENCES,
12 VIDEO_PRIVACIES,
13 VIDEO_RATE_TYPES
14 } from '../../initializers'
15 import { VideoModel } from '../../models/video/video'
16 import { exists, isArray } from './misc'
17
18 const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
19 const VIDEO_ABUSES_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_ABUSES
20
21 function isVideoCategoryValid (value: number) {
22 return value === null || VIDEO_CATEGORIES[value] !== undefined
23 }
24
25 function isVideoLicenceValid (value: number) {
26 return value === null || VIDEO_LICENCES[value] !== undefined
27 }
28
29 function isVideoLanguageValid (value: number) {
30 return value === null || VIDEO_LANGUAGES[value] !== undefined
31 }
32
33 function isVideoDurationValid (value: string) {
34 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
35 }
36
37 function isVideoTruncatedDescriptionValid (value: string) {
38 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.TRUNCATED_DESCRIPTION)
39 }
40
41 function isVideoDescriptionValid (value: string) {
42 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION))
43 }
44
45 function isVideoNameValid (value: string) {
46 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
47 }
48
49 function isVideoTagValid (tag: string) {
50 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
51 }
52
53 function 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
59 function isVideoAbuseReasonValid (value: string) {
60 return exists(value) && validator.isLength(value, VIDEO_ABUSES_CONSTRAINTS_FIELDS.REASON)
61 }
62
63 function isVideoViewsValid (value: string) {
64 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
65 }
66
67 function isVideoRatingTypeValid (value: string) {
68 return value === 'none' || values(VIDEO_RATE_TYPES).indexOf(value as VideoRateType) !== -1
69 }
70
71 function 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
87 function isVideoPrivacyValid (value: string) {
88 return validator.isInt(value + '') && VIDEO_PRIVACIES[value] !== undefined
89 }
90
91 function isVideoFileInfoHashValid (value: string) {
92 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
93 }
94
95 function isVideoFileResolutionValid (value: string) {
96 return exists(value) && validator.isInt(value + '')
97 }
98
99 function isVideoFileSizeValid (value: string) {
100 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE)
101 }
102
103 async 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
126 export {
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 }