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