Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | 5x 5x 5x 5x 5x 5x 116x 1x 115x 2x 5x 5x 5x 8x 8x 5x 2x 2x 5x 8x 8x 5x 8x 5x 5x | const mongoose = require('mongoose'); const validator = require('validator'); const bcrypt = require('bcryptjs'); const { toJSON, paginate } = require('./plugins'); const { roles } = require('../config/roles'); const userSchema = mongoose.Schema( { name: { type: String, required: true, trim: true, }, email: { type: String, required: true, unique: true, trim: true, lowercase: true, validate(value) { if (!validator.isEmail(value)) { throw new Error('Invalid email'); } }, }, password: { type: String, required: true, trim: true, minlength: 8, validate(value) { if (!value.match(/\d/) || !value.match(/[a-zA-Z]/)) { throw new Error('Password must contain at least one letter and one number'); } }, private: true, // used by the toJSON plugin }, role: { type: String, enum: roles, default: 'user', }, isEmailVerified: { type: Boolean, default: false, }, }, { timestamps: true, }, ); // add plugin that converts mongoose to json userSchema.plugin(toJSON); userSchema.plugin(paginate); /** * Check if email is taken * @param {string} email - The user's email * @param {ObjectId} [excludeUserId] - The id of the user to be excluded * @returns {Promise<boolean>} */ userSchema.statics.isEmailTaken = async function (email, excludeUserId) { const user = await this.findOne({ email, _id: { $ne: excludeUserId } }); return !!user; }; /** * Check if password matches the user's password * @param {string} password * @returns {Promise<boolean>} */ userSchema.methods.isPasswordMatch = async function (password) { const user = this; return bcrypt.compare(password, user.password); }; userSchema.pre('save', async function (next) { const user = this; if (user.isModified('password')) { user.password = await bcrypt.hash(user.password, 8); } next(); }); /** * @typedef User */ const User = mongoose.model('User', userSchema); module.exports = User; |