|
|
const mongoose = require('mongoose'); |
|
|
const bcrypt = require('bcryptjs'); |
|
|
const jwt = require('jsonwebtoken'); |
|
|
|
|
|
const userSchema = new mongoose.Schema({ |
|
|
name: { |
|
|
type: String, |
|
|
required: [true, 'Please add a name'], |
|
|
trim: true |
|
|
}, |
|
|
email: { |
|
|
type: String, |
|
|
required: [true, 'Please add an email'], |
|
|
unique: true, |
|
|
match: [ |
|
|
/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/, |
|
|
'Please add a valid email' |
|
|
] |
|
|
}, |
|
|
password: { |
|
|
type: String, |
|
|
required: [true, 'Please add a password'], |
|
|
minlength: 6, |
|
|
select: false |
|
|
}, |
|
|
role: { |
|
|
type: String, |
|
|
enum: ['admin', 'instructor', 'student'], |
|
|
default: 'student' |
|
|
}, |
|
|
avatar: { |
|
|
type: String, |
|
|
default: 'default.jpg' |
|
|
}, |
|
|
createdAt: { |
|
|
type: Date, |
|
|
default: Date.now |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
userSchema.pre('save', async function(next) { |
|
|
if (!this.isModified('password')) { |
|
|
next(); |
|
|
} |
|
|
const salt = await bcrypt.genSalt(10); |
|
|
this.password = await bcrypt.hash(this.password, salt); |
|
|
}); |
|
|
|
|
|
|
|
|
userSchema.methods.getSignedJwtToken = function() { |
|
|
return jwt.sign({ id: this._id }, process.env.JWT_SECRET, { |
|
|
expiresIn: process.env.JWT_EXPIRE |
|
|
}); |
|
|
}; |
|
|
|
|
|
|
|
|
userSchema.methods.matchPassword = async function(enteredPassword) { |
|
|
return await bcrypt.compare(enteredPassword, this.password); |
|
|
}; |
|
|
|
|
|
module.exports = mongoose.model('User', userSchema); |