47b91cd94bf04459dcd8b3bf7829e228a1bbbd38
[oweals/peertube.git] / server / controllers / api / config.ts
1 import * as express from 'express'
2 import { omit } from 'lodash'
3 import { ServerConfig, UserRight } from '../../../shared'
4 import { About } from '../../../shared/models/config/about.model'
5 import { CustomConfig } from '../../../shared/models/config/custom-config.model'
6 import { unlinkPromise, writeFilePromise } from '../../helpers/core-utils'
7 import { isSignupAllowed } from '../../helpers/utils'
8 import { CONFIG, CONSTRAINTS_FIELDS, reloadConfig } from '../../initializers'
9 import { asyncMiddleware, authenticate, ensureUserHasRight } from '../../middlewares'
10 import { customConfigUpdateValidator } from '../../middlewares/validators/config'
11
12 const packageJSON = require('../../../../package.json')
13 const configRouter = express.Router()
14
15 configRouter.get('/about', getAbout)
16 configRouter.get('/',
17   asyncMiddleware(getConfig)
18 )
19
20 configRouter.get('/custom',
21   authenticate,
22   ensureUserHasRight(UserRight.MANAGE_CONFIGURATION),
23   asyncMiddleware(getCustomConfig)
24 )
25 configRouter.put('/custom',
26   authenticate,
27   ensureUserHasRight(UserRight.MANAGE_CONFIGURATION),
28   asyncMiddleware(customConfigUpdateValidator),
29   asyncMiddleware(updateCustomConfig)
30 )
31 configRouter.delete('/custom',
32   authenticate,
33   ensureUserHasRight(UserRight.MANAGE_CONFIGURATION),
34   asyncMiddleware(deleteCustomConfig)
35 )
36
37 async function getConfig (req: express.Request, res: express.Response, next: express.NextFunction) {
38   const allowed = await isSignupAllowed()
39
40   const enabledResolutions = Object.keys(CONFIG.TRANSCODING.RESOLUTIONS)
41    .filter(key => CONFIG.TRANSCODING.RESOLUTIONS[key] === true)
42    .map(r => parseInt(r, 10))
43
44   const json: ServerConfig = {
45     instance: {
46       name: CONFIG.INSTANCE.NAME,
47       customizations: {
48         javascript: CONFIG.INSTANCE.CUSTOMIZATIONS.JAVASCRIPT,
49         css: CONFIG.INSTANCE.CUSTOMIZATIONS.CSS
50       }
51     },
52     serverVersion: packageJSON.version,
53     signup: {
54       allowed
55     },
56     transcoding: {
57       enabledResolutions
58     },
59     avatar: {
60       file: {
61         size: {
62           max: CONSTRAINTS_FIELDS.ACTORS.AVATAR.FILE_SIZE.max
63         },
64         extensions: CONSTRAINTS_FIELDS.ACTORS.AVATAR.EXTNAME
65       }
66     },
67     video: {
68       image: {
69         extensions: CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME,
70         size: {
71           max: CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max
72         }
73       },
74       file: {
75         extensions: CONSTRAINTS_FIELDS.VIDEOS.EXTNAME
76       }
77     }
78   }
79
80   return res.json(json)
81 }
82
83 function getAbout (req: express.Request, res: express.Response, next: express.NextFunction) {
84   const about: About = {
85     instance: {
86       name: CONFIG.INSTANCE.NAME,
87       description: CONFIG.INSTANCE.DESCRIPTION,
88       terms: CONFIG.INSTANCE.TERMS
89     }
90   }
91
92   return res.json(about).end()
93 }
94
95 async function getCustomConfig (req: express.Request, res: express.Response, next: express.NextFunction) {
96   const data = customConfig()
97
98   return res.json(data).end()
99 }
100
101 async function deleteCustomConfig (req: express.Request, res: express.Response, next: express.NextFunction) {
102   await unlinkPromise(CONFIG.CUSTOM_FILE)
103
104   reloadConfig()
105
106   const data = customConfig()
107
108   return res.json(data).end()
109 }
110
111 async function updateCustomConfig (req: express.Request, res: express.Response, next: express.NextFunction) {
112   const toUpdate: CustomConfig = req.body
113
114   // Need to change the videoQuota key a little bit
115   const toUpdateJSON = omit(toUpdate, 'videoQuota')
116   toUpdateJSON.user['video_quota'] = toUpdate.user.videoQuota
117   delete toUpdate.user.videoQuota
118
119   await writeFilePromise(CONFIG.CUSTOM_FILE, JSON.stringify(toUpdateJSON))
120
121   reloadConfig()
122
123   const data = customConfig()
124   return res.json(data).end()
125 }
126
127 // ---------------------------------------------------------------------------
128
129 export {
130   configRouter
131 }
132
133 // ---------------------------------------------------------------------------
134
135 function customConfig (): CustomConfig {
136   return {
137     instance: {
138       name: CONFIG.INSTANCE.NAME,
139       description: CONFIG.INSTANCE.DESCRIPTION,
140       terms: CONFIG.INSTANCE.TERMS,
141       customizations: {
142         css: CONFIG.INSTANCE.CUSTOMIZATIONS.CSS,
143         javascript: CONFIG.INSTANCE.CUSTOMIZATIONS.JAVASCRIPT
144       }
145     },
146     cache: {
147       previews: {
148         size: CONFIG.CACHE.PREVIEWS.SIZE
149       }
150     },
151     signup: {
152       enabled: CONFIG.SIGNUP.ENABLED,
153       limit: CONFIG.SIGNUP.LIMIT
154     },
155     admin: {
156       email: CONFIG.ADMIN.EMAIL
157     },
158     user: {
159       videoQuota: CONFIG.USER.VIDEO_QUOTA
160     },
161     transcoding: {
162       enabled: CONFIG.TRANSCODING.ENABLED,
163       threads: CONFIG.TRANSCODING.THREADS,
164       resolutions: {
165         '240p': CONFIG.TRANSCODING.RESOLUTIONS[ '240p' ],
166         '360p': CONFIG.TRANSCODING.RESOLUTIONS[ '360p' ],
167         '480p': CONFIG.TRANSCODING.RESOLUTIONS[ '480p' ],
168         '720p': CONFIG.TRANSCODING.RESOLUTIONS[ '720p' ],
169         '1080p': CONFIG.TRANSCODING.RESOLUTIONS[ '1080p' ]
170       }
171     }
172   }
173 }