1 | 'use strict'; |
||
2 | const mongoose = require('mongoose'); |
||
3 | const validator = require('validator'); |
||
4 | const jwt = require('jsonwebtoken'); |
||
5 | const _ = require('lodash'); |
||
6 | const bcrypt = require('bcryptjs'); |
||
7 | |||
8 | let UserSchema = new mongoose.Schema({ |
||
9 | name : { |
||
10 | type : String, |
||
11 | required : true, |
||
12 | minlength : 5, |
||
13 | trim : true |
||
14 | }, |
||
15 | email : { |
||
16 | type : String, |
||
17 | required : true, |
||
18 | minlength : 5, |
||
19 | trim : true, |
||
20 | unique : true, |
||
21 | validate : { |
||
22 | validator : validator.isEmail, |
||
23 | message : '{value} is invalid email' |
||
24 | } |
||
25 | }, |
||
26 | password : { |
||
27 | type : String, |
||
28 | required : true, |
||
29 | minlength : 5, |
||
30 | trim : true |
||
31 | }, |
||
32 | tokens : [{ |
||
33 | access : { |
||
34 | type : String, |
||
35 | required : true |
||
36 | }, |
||
37 | token : { |
||
38 | type : String, |
||
39 | required : true |
||
40 | } |
||
41 | }] |
||
42 | }); |
||
43 | |||
44 | |||
45 | UserSchema.methods.generateAuthToken = function () { |
||
46 | let user = this; |
||
47 | let access = 'auth'; |
||
48 | let token = jwt.sign({_id : user._id.toHexString(), access}, 'abc123').toString(); |
||
49 | |||
50 | // console.log('Token generated : ' + token); |
||
51 | |||
52 | user.tokens.push({access, token}); |
||
53 | |||
54 | return user.save().then(() => { |
||
55 | return token; |
||
56 | }); |
||
57 | } |
||
58 | |||
59 | UserSchema.methods.toJSON = function() { |
||
60 | let user = this; |
||
61 | let userObject = user.toObject(); |
||
62 | return _.pick(userObject, ['_id', 'email']); |
||
63 | }; |
||
64 | |||
65 | UserSchema.methods.removeToken = function(token) { |
||
66 | let user = this; |
||
67 | return user.update({ |
||
68 | $pull : { |
||
69 | tokens : { |
||
70 | token // similat to 'token : token' |
||
71 | } |
||
72 | } |
||
73 | }); |
||
74 | }; |
||
75 | |||
76 | |||
77 | UserSchema.statics.findByToken = function(token) { |
||
78 | let User = this; |
||
79 | let decoded; |
||
80 | |||
81 | try { |
||
82 | decoded = jwt.verify(token, 'abc123'); |
||
83 | } |
||
84 | catch (e) { |
||
85 | return Promise.reject('No user found with the given token'); |
||
86 | } |
||
87 | |||
88 | return User.findOne({ |
||
89 | _id : decoded._id, |
||
90 | 'tokens.token' : token, |
||
91 | 'tokens.access' : 'auth' |
||
92 | }) |
||
93 | }; |
||
94 | |||
95 | UserSchema.statics.findByCredentials = function(email, password) { |
||
96 | let User = this; |
||
97 | return User.findOne({email}).then((user) => { |
||
98 | if(!user){ |
||
99 | return Promise.reject('Invalid email, user not found'); |
||
100 | } |
||
101 | return new Promise((resolve, reject) => { |
||
102 | bcrypt.compare(password, user.password, (err, res) => { |
||
103 | //console.log('comparing password'); |
||
104 | if(res) { |
||
105 | resolve(user); |
||
106 | } else { |
||
107 | reject('incorrect password'); |
||
108 | } |
||
109 | }); |
||
110 | }); |
||
111 | }); |
||
112 | }; |
||
113 | |||
114 | |||
115 | UserSchema.pre('save', function(next) { |
||
116 | let user = this; |
||
117 | |||
118 | if (user.isModified('password')){ |
||
119 | bcrypt.genSalt(10, (err, salt) => { |
||
120 | if (err) { |
||
0 ignored issues
–
show
Comprehensibility
Documentation
Best Practice
introduced
by
![]() |
|||
121 | |||
122 | } |
||
123 | bcrypt.hash(user.password, salt, (err, hash) => { |
||
124 | user.password = hash; |
||
125 | next(); |
||
126 | }) |
||
127 | }); |
||
128 | } |
||
129 | else { |
||
130 | next(); |
||
131 | } |
||
132 | }); |
||
133 | |||
134 | let User = mongoose.model('User', UserSchema); |
||
135 | |||
136 | |||
137 | module.exports = {User}; |