Move ensureRegistrationEnabled to middlewares
[oweals/peertube.git] / server / controllers / api / users.ts
1 import * as express from 'express'
2 import { waterfall } from 'async'
3
4 import { database as db } from '../../initializers/database'
5 import { CONFIG, USER_ROLES } from '../../initializers'
6 import { logger, getFormatedObjects } from '../../helpers'
7 import {
8   authenticate,
9   ensureIsAdmin,
10   ensureUserRegistrationEnabled,
11   usersAddValidator,
12   usersUpdateValidator,
13   usersRemoveValidator,
14   usersVideoRatingValidator,
15   paginationValidator,
16   setPagination,
17   usersSortValidator,
18   setUsersSort,
19   token
20 } from '../../middlewares'
21 import { UserVideoRate as FormatedUserVideoRate } from '../../../shared'
22
23 const usersRouter = express.Router()
24
25 usersRouter.get('/me',
26   authenticate,
27   getUserInformation
28 )
29
30 usersRouter.get('/me/videos/:videoId/rating',
31   authenticate,
32   usersVideoRatingValidator,
33   getUserVideoRating
34 )
35
36 usersRouter.get('/',
37   paginationValidator,
38   usersSortValidator,
39   setUsersSort,
40   setPagination,
41   listUsers
42 )
43
44 usersRouter.post('/',
45   authenticate,
46   ensureIsAdmin,
47   usersAddValidator,
48   createUser
49 )
50
51 usersRouter.post('/register',
52   ensureUserRegistrationEnabled,
53   usersAddValidator,
54   createUser
55 )
56
57 usersRouter.put('/:id',
58   authenticate,
59   usersUpdateValidator,
60   updateUser
61 )
62
63 usersRouter.delete('/:id',
64   authenticate,
65   ensureIsAdmin,
66   usersRemoveValidator,
67   removeUser
68 )
69
70 usersRouter.post('/token', token, success)
71 // TODO: Once https://github.com/oauthjs/node-oauth2-server/pull/289 is merged, implement revoke token route
72
73 // ---------------------------------------------------------------------------
74
75 export {
76   usersRouter
77 }
78
79 // ---------------------------------------------------------------------------
80
81 function createUser (req: express.Request, res: express.Response, next: express.NextFunction) {
82   const user = db.User.build({
83     username: req.body.username,
84     password: req.body.password,
85     email: req.body.email,
86     displayNSFW: false,
87     role: USER_ROLES.USER
88   })
89
90   user.save().asCallback(function (err) {
91     if (err) return next(err)
92
93     return res.type('json').status(204).end()
94   })
95 }
96
97 function getUserInformation (req: express.Request, res: express.Response, next: express.NextFunction) {
98   db.User.loadByUsername(res.locals.oauth.token.user.username, function (err, user) {
99     if (err) return next(err)
100
101     return res.json(user.toFormatedJSON())
102   })
103 }
104
105 function getUserVideoRating (req: express.Request, res: express.Response, next: express.NextFunction) {
106   const videoId = '' + req.params.videoId
107   const userId = +res.locals.oauth.token.User.id
108
109   db.UserVideoRate.load(userId, videoId, null, function (err, ratingObj) {
110     if (err) return next(err)
111
112     const rating = ratingObj ? ratingObj.type : 'none'
113
114     const json: FormatedUserVideoRate = {
115       videoId,
116       rating
117     }
118     res.json(json)
119   })
120 }
121
122 function listUsers (req: express.Request, res: express.Response, next: express.NextFunction) {
123   db.User.listForApi(req.query.start, req.query.count, req.query.sort, function (err, usersList, usersTotal) {
124     if (err) return next(err)
125
126     res.json(getFormatedObjects(usersList, usersTotal))
127   })
128 }
129
130 function removeUser (req: express.Request, res: express.Response, next: express.NextFunction) {
131   waterfall([
132     function loadUser (callback) {
133       db.User.loadById(req.params.id, callback)
134     },
135
136     function deleteUser (user, callback) {
137       user.destroy().asCallback(callback)
138     }
139   ], function andFinally (err) {
140     if (err) {
141       logger.error('Errors when removed the user.', { error: err })
142       return next(err)
143     }
144
145     return res.sendStatus(204)
146   })
147 }
148
149 function updateUser (req: express.Request, res: express.Response, next: express.NextFunction) {
150   db.User.loadByUsername(res.locals.oauth.token.user.username, function (err, user) {
151     if (err) return next(err)
152
153     if (req.body.password) user.password = req.body.password
154     if (req.body.displayNSFW !== undefined) user.displayNSFW = req.body.displayNSFW
155
156     user.save().asCallback(function (err) {
157       if (err) return next(err)
158
159       return res.sendStatus(204)
160     })
161   })
162 }
163
164 function success (req: express.Request, res: express.Response, next: express.NextFunction) {
165   res.end()
166 }