Issues (82)

app/models/user.js (1 issue)

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
This code block is empty. Consider removing it or adding a comment to explain.
Loading history...
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};