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 } }); // Encrypt password before saving 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); }); // Sign JWT and return userSchema.methods.getSignedJwtToken = function() { return jwt.sign({ id: this._id }, process.env.JWT_SECRET, { expiresIn: process.env.JWT_EXPIRE }); }; // Match user entered password to hashed password in database userSchema.methods.matchPassword = async function(enteredPassword) { return await bcrypt.compare(enteredPassword, this.password); }; module.exports = mongoose.model('User', userSchema);