Add action hooks to user routes
[oweals/peertube.git] / server / helpers / custom-validators / users.ts
1 import * as validator from 'validator'
2 import { UserRole } from '../../../shared'
3 import { CONSTRAINTS_FIELDS, NSFW_POLICY_TYPES } from '../../initializers/constants'
4 import { exists, isArray, isBooleanValid, isFileValid } from './misc'
5 import { values } from 'lodash'
6
7 const USERS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.USERS
8
9 function isUserPasswordValid (value: string) {
10   return validator.isLength(value, USERS_CONSTRAINTS_FIELDS.PASSWORD)
11 }
12
13 function isUserVideoQuotaValid (value: string) {
14   return exists(value) && validator.isInt(value + '', USERS_CONSTRAINTS_FIELDS.VIDEO_QUOTA)
15 }
16
17 function isUserVideoQuotaDailyValid (value: string) {
18   return exists(value) && validator.isInt(value + '', USERS_CONSTRAINTS_FIELDS.VIDEO_QUOTA_DAILY)
19 }
20
21 function isUserUsernameValid (value: string) {
22   const max = USERS_CONSTRAINTS_FIELDS.USERNAME.max
23   const min = USERS_CONSTRAINTS_FIELDS.USERNAME.min
24   return exists(value) && validator.matches(value, new RegExp(`^[a-z0-9._]{${min},${max}}$`))
25 }
26
27 function isUserDisplayNameValid (value: string) {
28   return value === null || (exists(value) && validator.isLength(value, CONSTRAINTS_FIELDS.USERS.NAME))
29 }
30
31 function isUserDescriptionValid (value: string) {
32   return value === null || (exists(value) && validator.isLength(value, CONSTRAINTS_FIELDS.USERS.DESCRIPTION))
33 }
34
35 function isUserEmailVerifiedValid (value: any) {
36   return isBooleanValid(value)
37 }
38
39 const nsfwPolicies = values(NSFW_POLICY_TYPES)
40 function isUserNSFWPolicyValid (value: any) {
41   return exists(value) && nsfwPolicies.indexOf(value) !== -1
42 }
43
44 function isUserWebTorrentEnabledValid (value: any) {
45   return isBooleanValid(value)
46 }
47
48 function isUserVideosHistoryEnabledValid (value: any) {
49   return isBooleanValid(value)
50 }
51
52 function isUserAutoPlayVideoValid (value: any) {
53   return isBooleanValid(value)
54 }
55
56 function isUserVideoLanguages (value: any) {
57   return value === null || (isArray(value) && value.length < CONSTRAINTS_FIELDS.USERS.VIDEO_LANGUAGES.max)
58 }
59
60 function isUserAdminFlagsValid (value: any) {
61   return exists(value) && validator.isInt('' + value)
62 }
63
64 function isUserBlockedValid (value: any) {
65   return isBooleanValid(value)
66 }
67
68 function isUserAutoPlayNextVideoValid (value: any) {
69   return isBooleanValid(value)
70 }
71
72 function isNoInstanceConfigWarningModal (value: any) {
73   return isBooleanValid(value)
74 }
75
76 function isNoWelcomeModal (value: any) {
77   return isBooleanValid(value)
78 }
79
80 function isUserBlockedReasonValid (value: any) {
81   return value === null || (exists(value) && validator.isLength(value, CONSTRAINTS_FIELDS.USERS.BLOCKED_REASON))
82 }
83
84 function isUserRoleValid (value: any) {
85   return exists(value) && validator.isInt('' + value) && UserRole[value] !== undefined
86 }
87
88 const avatarMimeTypes = CONSTRAINTS_FIELDS.ACTORS.AVATAR.EXTNAME
89   .map(v => v.replace('.', ''))
90   .join('|')
91 const avatarMimeTypesRegex = `image/(${avatarMimeTypes})`
92 function isAvatarFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
93   return isFileValid(files, avatarMimeTypesRegex, 'avatarfile', CONSTRAINTS_FIELDS.ACTORS.AVATAR.FILE_SIZE.max)
94 }
95
96 // ---------------------------------------------------------------------------
97
98 export {
99   isUserVideosHistoryEnabledValid,
100   isUserBlockedValid,
101   isUserPasswordValid,
102   isUserVideoLanguages,
103   isUserBlockedReasonValid,
104   isUserRoleValid,
105   isUserVideoQuotaValid,
106   isUserVideoQuotaDailyValid,
107   isUserUsernameValid,
108   isUserAdminFlagsValid,
109   isUserEmailVerifiedValid,
110   isUserNSFWPolicyValid,
111   isUserWebTorrentEnabledValid,
112   isUserAutoPlayVideoValid,
113   isUserAutoPlayNextVideoValid,
114   isUserDisplayNameValid,
115   isUserDescriptionValid,
116   isNoInstanceConfigWarningModal,
117   isNoWelcomeModal,
118   isAvatarFile
119 }