]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame_incremental - server/helpers/custom-validators/misc.ts
Merge branch 'release/2.2.0' into develop
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / misc.ts
... / ...
CommitLineData
1import 'multer'
2import validator from 'validator'
3import { sep } from 'path'
4
5function exists (value: any) {
6 return value !== undefined && value !== null
7}
8
9function isSafePath (p: string) {
10 return exists(p) &&
11 (p + '').split(sep).every(part => {
12 return [ '..' ].includes(part) === false
13 })
14}
15
16function isArray (value: any) {
17 return Array.isArray(value)
18}
19
20function isNotEmptyIntArray (value: any) {
21 return Array.isArray(value) && value.every(v => validator.isInt('' + v)) && value.length !== 0
22}
23
24function isArrayOf (value: any, validator: (value: any) => boolean) {
25 return isArray(value) && value.every(v => validator(v))
26}
27
28function isDateValid (value: string) {
29 return exists(value) && validator.isISO8601(value)
30}
31
32function isIdValid (value: string) {
33 return exists(value) && validator.isInt('' + value)
34}
35
36function isUUIDValid (value: string) {
37 return exists(value) && validator.isUUID('' + value, 4)
38}
39
40function isIdOrUUIDValid (value: string) {
41 return isIdValid(value) || isUUIDValid(value)
42}
43
44function isBooleanValid (value: any) {
45 return typeof value === 'boolean' || (typeof value === 'string' && validator.isBoolean(value))
46}
47
48function toIntOrNull (value: string) {
49 const v = toValueOrNull(value)
50
51 if (v === null || v === undefined) return v
52 if (typeof v === 'number') return v
53
54 return validator.toInt('' + v)
55}
56
57function toBooleanOrNull (value: any) {
58 const v = toValueOrNull(value)
59
60 if (v === null || v === undefined) return v
61 if (typeof v === 'boolean') return v
62
63 return validator.toBoolean('' + v)
64}
65
66function toValueOrNull (value: string) {
67 if (value === 'null') return null
68
69 return value
70}
71
72function toArray (value: any) {
73 if (value && isArray(value) === false) return [ value ]
74
75 return value
76}
77
78function toIntArray (value: any) {
79 if (!value) return []
80 if (isArray(value) === false) return [ validator.toInt(value) ]
81
82 return value.map(v => validator.toInt(v))
83}
84
85function isFileValid (
86 files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[],
87 mimeTypeRegex: string,
88 field: string,
89 maxSize: number | null,
90 optional = false
91) {
92 // Should have files
93 if (!files) return optional
94 if (isArray(files)) return optional
95
96 // Should have a file
97 const fileArray = files[field]
98 if (!fileArray || fileArray.length === 0) {
99 return optional
100 }
101
102 // The file should exist
103 const file = fileArray[0]
104 if (!file || !file.originalname) return false
105
106 // Check size
107 if ((maxSize !== null) && file.size > maxSize) return false
108
109 return new RegExp(`^${mimeTypeRegex}$`, 'i').test(file.mimetype)
110}
111
112// ---------------------------------------------------------------------------
113
114export {
115 exists,
116 isArrayOf,
117 isNotEmptyIntArray,
118 isArray,
119 isIdValid,
120 isSafePath,
121 isUUIDValid,
122 isIdOrUUIDValid,
123 isDateValid,
124 toValueOrNull,
125 toBooleanOrNull,
126 isBooleanValid,
127 toIntOrNull,
128 toArray,
129 toIntArray,
130 isFileValid
131}