]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/controllers/api/config.ts
move to boolean switch
[github/Chocobozzz/PeerTube.git] / server / controllers / api / config.ts
CommitLineData
4d4e5cd4 1import * as express from 'express'
36f9424f 2import { omit } from 'lodash'
fd206f0b 3import { ServerConfig, UserRight } from '../../../shared'
09cababd
C
4import { About } from '../../../shared/models/server/about.model'
5import { CustomConfig } from '../../../shared/models/server/custom-config.model'
06215f15 6import { isSignupAllowed, isSignupAllowedForCurrentIP } from '../../helpers/signup'
fd206f0b
C
7import { CONFIG, CONSTRAINTS_FIELDS, reloadConfig } from '../../initializers'
8import { asyncMiddleware, authenticate, ensureUserHasRight } from '../../middlewares'
9import { customConfigUpdateValidator } from '../../middlewares/validators/config'
e032aec9 10import { ClientHtml } from '../../lib/client-html'
993cef4b 11import { auditLoggerFactory, CustomConfigAuditView, getAuditIdFromRes } from '../../helpers/audit-logger'
62689b94 12import { remove, writeJSON } from 'fs-extra'
913f08f2 13import { getVersion } from '../../helpers/utils'
65fcc311 14
915c5bbe 15const packageJSON = require('../../../../package.json')
65fcc311
C
16const configRouter = express.Router()
17
80e36cd9
AB
18const auditLogger = auditLoggerFactory('config')
19
36f9424f 20configRouter.get('/about', getAbout)
eb080476
C
21configRouter.get('/',
22 asyncMiddleware(getConfig)
23)
36f9424f 24
fd206f0b
C
25configRouter.get('/custom',
26 authenticate,
27 ensureUserHasRight(UserRight.MANAGE_CONFIGURATION),
28 asyncMiddleware(getCustomConfig)
29)
30configRouter.put('/custom',
31 authenticate,
32 ensureUserHasRight(UserRight.MANAGE_CONFIGURATION),
33 asyncMiddleware(customConfigUpdateValidator),
34 asyncMiddleware(updateCustomConfig)
35)
36configRouter.delete('/custom',
37 authenticate,
38 ensureUserHasRight(UserRight.MANAGE_CONFIGURATION),
39 asyncMiddleware(deleteCustomConfig)
40)
65fcc311 41
abb2c792 42let serverCommit: string
eb080476
C
43async function getConfig (req: express.Request, res: express.Response, next: express.NextFunction) {
44 const allowed = await isSignupAllowed()
ff2c1fe8 45 const allowedForCurrentIP = isSignupAllowedForCurrentIP(req.ip)
499d9015 46 serverCommit = (serverCommit) ? serverCommit : await getVersion()
abb2c792 47 if (serverCommit === packageJSON.version) serverCommit = ''
291e8d3e 48
eb080476 49 const enabledResolutions = Object.keys(CONFIG.TRANSCODING.RESOLUTIONS)
41a676db 50 .filter(key => CONFIG.TRANSCODING.ENABLED === CONFIG.TRANSCODING.RESOLUTIONS[key] === true)
eb080476 51 .map(r => parseInt(r, 10))
6a84aafd 52
eb080476 53 const json: ServerConfig = {
36f9424f 54 instance: {
00b5556c 55 name: CONFIG.INSTANCE.NAME,
2e3a0215 56 shortDescription: CONFIG.INSTANCE.SHORT_DESCRIPTION,
901637bb 57 defaultClientRoute: CONFIG.INSTANCE.DEFAULT_CLIENT_ROUTE,
0883b324 58 defaultNSFWPolicy: CONFIG.INSTANCE.DEFAULT_NSFW_POLICY,
00b5556c
C
59 customizations: {
60 javascript: CONFIG.INSTANCE.CUSTOMIZATIONS.JAVASCRIPT,
61 css: CONFIG.INSTANCE.CUSTOMIZATIONS.CSS
62 }
36f9424f 63 },
915c5bbe 64 serverVersion: packageJSON.version,
abb2c792 65 serverCommit,
eb080476 66 signup: {
ff2c1fe8 67 allowed,
d9eaee39
JM
68 allowedForCurrentIP,
69 requiresEmailVerification: CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION
eb080476
C
70 },
71 transcoding: {
72 enabledResolutions
01de67b9 73 },
5d08a6a7 74 import: {
b2977eec 75 videos: {
5d08a6a7
C
76 http: {
77 enabled: CONFIG.IMPORT.VIDEOS.HTTP.ENABLED
a84b8fa5
C
78 },
79 torrent: {
80 enabled: CONFIG.IMPORT.VIDEOS.TORRENT.ENABLED
5d08a6a7
C
81 }
82 }
83 },
01de67b9
C
84 avatar: {
85 file: {
86 size: {
87 max: CONSTRAINTS_FIELDS.ACTORS.AVATAR.FILE_SIZE.max
88 },
89 extensions: CONSTRAINTS_FIELDS.ACTORS.AVATAR.EXTNAME
90 }
91 },
92 video: {
6de36768
C
93 image: {
94 extensions: CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME,
95 size: {
96 max: CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max
97 }
98 },
01de67b9
C
99 file: {
100 extensions: CONSTRAINTS_FIELDS.VIDEOS.EXTNAME
101 }
1869c875 102 },
40e87e9e
C
103 videoCaption: {
104 file: {
105 size: {
106 max: CONSTRAINTS_FIELDS.VIDEO_CAPTIONS.CAPTION_FILE.FILE_SIZE.max
107 },
108 extensions: CONSTRAINTS_FIELDS.VIDEO_CAPTIONS.CAPTION_FILE.EXTNAME
109 }
110 },
1869c875 111 user: {
bee0abff
FA
112 videoQuota: CONFIG.USER.VIDEO_QUOTA,
113 videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY
65fcc311 114 }
eb080476 115 }
6a84aafd 116
eb080476 117 return res.json(json)
65fcc311
C
118}
119
36f9424f
C
120function getAbout (req: express.Request, res: express.Response, next: express.NextFunction) {
121 const about: About = {
122 instance: {
123 name: CONFIG.INSTANCE.NAME,
2e3a0215 124 shortDescription: CONFIG.INSTANCE.SHORT_DESCRIPTION,
36f9424f
C
125 description: CONFIG.INSTANCE.DESCRIPTION,
126 terms: CONFIG.INSTANCE.TERMS
127 }
128 }
129
130 return res.json(about).end()
131}
132
fd206f0b
C
133async function getCustomConfig (req: express.Request, res: express.Response, next: express.NextFunction) {
134 const data = customConfig()
135
136 return res.json(data).end()
137}
138
139async function deleteCustomConfig (req: express.Request, res: express.Response, next: express.NextFunction) {
62689b94 140 await remove(CONFIG.CUSTOM_FILE)
fd206f0b 141
993cef4b 142 auditLogger.delete(getAuditIdFromRes(res), new CustomConfigAuditView(customConfig()))
80e36cd9 143
fd206f0b 144 reloadConfig()
e032aec9 145 ClientHtml.invalidCache()
fd206f0b
C
146
147 const data = customConfig()
148
149 return res.json(data).end()
150}
151
152async function updateCustomConfig (req: express.Request, res: express.Response, next: express.NextFunction) {
153 const toUpdate: CustomConfig = req.body
80e36cd9 154 const oldCustomConfigAuditKeys = new CustomConfigAuditView(customConfig())
fd206f0b 155
be1fc4bc
C
156 // Force number conversion
157 toUpdate.cache.previews.size = parseInt('' + toUpdate.cache.previews.size, 10)
40e87e9e 158 toUpdate.cache.captions.size = parseInt('' + toUpdate.cache.captions.size, 10)
be1fc4bc
C
159 toUpdate.signup.limit = parseInt('' + toUpdate.signup.limit, 10)
160 toUpdate.user.videoQuota = parseInt('' + toUpdate.user.videoQuota, 10)
bee0abff 161 toUpdate.user.videoQuotaDaily = parseInt('' + toUpdate.user.videoQuotaDaily, 10)
be1fc4bc
C
162 toUpdate.transcoding.threads = parseInt('' + toUpdate.transcoding.threads, 10)
163
164 // camelCase to snake_case key
d9eaee39
JM
165 const toUpdateJSON = omit(
166 toUpdate,
167 'user.videoQuota',
168 'instance.defaultClientRoute',
169 'instance.shortDescription',
170 'cache.videoCaptions',
171 'signup.requiresEmailVerification'
172 )
fd206f0b 173 toUpdateJSON.user['video_quota'] = toUpdate.user.videoQuota
9ee92651 174 toUpdateJSON.user['video_quota_daily'] = toUpdate.user.videoQuotaDaily
901637bb 175 toUpdateJSON.instance['default_client_route'] = toUpdate.instance.defaultClientRoute
2e3a0215 176 toUpdateJSON.instance['short_description'] = toUpdate.instance.shortDescription
0883b324 177 toUpdateJSON.instance['default_nsfw_policy'] = toUpdate.instance.defaultNSFWPolicy
d9eaee39 178 toUpdateJSON.signup['requires_email_verification'] = toUpdate.signup.requiresEmailVerification
fd206f0b 179
62689b94 180 await writeJSON(CONFIG.CUSTOM_FILE, toUpdateJSON, { spaces: 2 })
fd206f0b
C
181
182 reloadConfig()
e032aec9 183 ClientHtml.invalidCache()
fd206f0b
C
184
185 const data = customConfig()
80e36cd9
AB
186
187 auditLogger.update(
993cef4b 188 getAuditIdFromRes(res),
80e36cd9
AB
189 new CustomConfigAuditView(data),
190 oldCustomConfigAuditKeys
191 )
192
fd206f0b
C
193 return res.json(data).end()
194}
195
65fcc311
C
196// ---------------------------------------------------------------------------
197
198export {
199 configRouter
200}
fd206f0b
C
201
202// ---------------------------------------------------------------------------
203
204function customConfig (): CustomConfig {
205 return {
66b16caf
C
206 instance: {
207 name: CONFIG.INSTANCE.NAME,
2e3a0215 208 shortDescription: CONFIG.INSTANCE.SHORT_DESCRIPTION,
66b16caf 209 description: CONFIG.INSTANCE.DESCRIPTION,
00b5556c 210 terms: CONFIG.INSTANCE.TERMS,
901637bb 211 defaultClientRoute: CONFIG.INSTANCE.DEFAULT_CLIENT_ROUTE,
0883b324 212 defaultNSFWPolicy: CONFIG.INSTANCE.DEFAULT_NSFW_POLICY,
00b5556c
C
213 customizations: {
214 css: CONFIG.INSTANCE.CUSTOMIZATIONS.CSS,
215 javascript: CONFIG.INSTANCE.CUSTOMIZATIONS.JAVASCRIPT
216 }
66b16caf 217 },
8be1afa1
C
218 services: {
219 twitter: {
220 username: CONFIG.SERVICES.TWITTER.USERNAME,
221 whitelisted: CONFIG.SERVICES.TWITTER.WHITELISTED
222 }
223 },
fd206f0b
C
224 cache: {
225 previews: {
226 size: CONFIG.CACHE.PREVIEWS.SIZE
40e87e9e
C
227 },
228 captions: {
229 size: CONFIG.CACHE.VIDEO_CAPTIONS.SIZE
fd206f0b
C
230 }
231 },
232 signup: {
233 enabled: CONFIG.SIGNUP.ENABLED,
d9eaee39
JM
234 limit: CONFIG.SIGNUP.LIMIT,
235 requiresEmailVerification: CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION
fd206f0b
C
236 },
237 admin: {
238 email: CONFIG.ADMIN.EMAIL
239 },
240 user: {
bee0abff
FA
241 videoQuota: CONFIG.USER.VIDEO_QUOTA,
242 videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY
fd206f0b
C
243 },
244 transcoding: {
245 enabled: CONFIG.TRANSCODING.ENABLED,
246 threads: CONFIG.TRANSCODING.THREADS,
247 resolutions: {
248 '240p': CONFIG.TRANSCODING.RESOLUTIONS[ '240p' ],
249 '360p': CONFIG.TRANSCODING.RESOLUTIONS[ '360p' ],
250 '480p': CONFIG.TRANSCODING.RESOLUTIONS[ '480p' ],
251 '720p': CONFIG.TRANSCODING.RESOLUTIONS[ '720p' ],
252 '1080p': CONFIG.TRANSCODING.RESOLUTIONS[ '1080p' ]
253 }
5d08a6a7
C
254 },
255 import: {
256 videos: {
257 http: {
258 enabled: CONFIG.IMPORT.VIDEOS.HTTP.ENABLED
a84b8fa5
C
259 },
260 torrent: {
261 enabled: CONFIG.IMPORT.VIDEOS.TORRENT.ENABLED
5d08a6a7
C
262 }
263 }
fd206f0b
C
264 }
265 }
266}