1
+ import APIError from '../helpers/APIError' ;
2
+ import httpStatus from 'http-status' ;
1
3
import User from '../models/user.model' ;
4
+ import _ from 'lodash' ;
2
5
3
6
/**
4
7
* Load user and append to req.
5
8
*/
6
9
function load ( req , res , next , id ) {
7
10
User . get ( id )
8
11
. then ( ( user ) => {
9
- req . user = user ; // eslint-disable-line no-param-reassign
12
+ delete user . password ;
13
+ req . userLoaded = user ; // eslint-disable-line no-param-reassign
10
14
return next ( ) ;
11
15
} )
12
16
. catch ( e => next ( e ) ) ;
13
17
}
14
-
15
18
/**
16
- * Get user
19
+ * Get currently logged in user
17
20
* @returns {User }
18
21
*/
19
- function get ( req , res ) {
20
- return res . json ( req . user ) ;
22
+ function me ( req , res , next ) {
23
+ User . get ( req . user . _id )
24
+ . then ( ( user ) => {
25
+ user . password = null ;
26
+ return res . json ( user ) ;
27
+ } )
28
+ . catch ( e => {
29
+ return next ( err ) ;
30
+ } ) ;
21
31
}
22
32
33
+ // TODO: maybe a quick version of me that only loads a shallow verison of
34
+ // user id
35
+
23
36
/**
24
- * Create new user
25
- * @property {string } req.body.username - The username of user.
26
- * @property {string } req.body.mobileNumber - The mobileNumber of user.
37
+ * Get user
27
38
* @returns {User }
28
39
*/
29
- function create ( req , res , next ) {
30
- const user = new User ( {
31
- username : req . body . username ,
32
- mobileNumber : req . body . mobileNumber
33
- } ) ;
34
-
35
- user . save ( )
36
- . then ( savedUser => res . json ( savedUser ) )
37
- . catch ( e => next ( e ) ) ;
40
+ function get ( req , res ) {
41
+ return res . json ( req . userLoaded ) ;
38
42
}
39
43
40
44
/**
@@ -44,37 +48,33 @@ function create(req, res, next) {
44
48
* @returns {User }
45
49
*/
46
50
function update ( req , res , next ) {
47
- const user = req . user ;
48
- user . username = req . body . username ;
49
- user . mobileNumber = req . body . mobileNumber ;
50
-
51
- user . save ( )
52
- . then ( savedUser => res . json ( savedUser ) )
53
- . catch ( e => next ( e ) ) ;
54
- }
55
-
56
- /**
57
- * Get user list.
58
- * @property {number } req.query.skip - Number of users to be skipped.
59
- * @property {number } req.query.limit - Limit number of users to be returned.
60
- * @returns {User[] }
61
- */
62
- function list ( req , res , next ) {
63
- const { limit = 50 , skip = 0 } = req . query ;
64
- User . list ( { limit, skip } )
65
- . then ( users => res . json ( users ) )
66
- . catch ( e => next ( e ) ) ;
67
- }
68
-
69
- /**
70
- * Delete user.
71
- * @returns {User }
72
- */
73
- function remove ( req , res , next ) {
74
- const user = req . user ;
75
- user . remove ( )
76
- . then ( deletedUser => res . json ( deletedUser ) )
77
- . catch ( e => next ( e ) ) ;
78
- }
51
+ const user = req . userLoaded ;
52
+ const username = req . body . username ;
53
+ // We gotta check a few things:
54
+ // First we make sure we are the actual user we are modifying.
55
+ if ( ! req . user || user . _id != req . user . _id ) {
56
+ let err = new APIError ( 'Not enough permissions to modify that user.' , httpStatus . UNAUTHORIZED , true ) ; //eslint-disable-line
57
+ return next ( err ) ;
58
+ }
59
+ // Next we are making sure the username doens't already exist:
60
+ User . findOne ( { username } )
61
+ . exec ( )
62
+ . then ( ( _user ) => {
63
+ if ( _user && _user . id != user . id ) {
64
+ let err = new APIError ( 'User already exists.' , httpStatus . UNAUTHORIZED , true ) ; //eslint-disable-line
65
+ return next ( err ) ;
66
+ }
67
+ // Using _.pick to only get a few properties:
68
+ // otherwise user can set themselves to verified, etc :)
69
+ const newValues = _ . pick ( req . body , User . updatableFields ) ;
70
+ Object . assign ( user , newValues ) ;
71
+ delete user . password ;
72
+ user . save ( ) ;
73
+ delete user . password ; // Why doesn't this work?
74
+ user . password = null ;
75
+ res . json ( user ) ;
76
+ } )
77
+ . catch ( e => next ( e ) ) ;
78
+ }
79
79
80
- export default { load, get, create , update, list , remove } ;
80
+ export default { load, get, me , update} ;
0 commit comments