const mongoose = require("mongoose"); const bcrypt = require('bcryptjs'); const jwt = require('jsonwebtoken'); const userSchema = new mongoose.Schema({ email: { type: String, trim: true, lowercase: true, unique: true, required: true, min: 4, max: 255, validate(value) { if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) { throw new Error('Wrong email address'); } } }, password: { type: String, required: true, min: 4, max: 1024, }, tokens: [{ token: { type: String, required: true } }] }); userSchema.methods.generateAuthToken = async function () { const user = this; const token = jwt.sign({ _id: user._id.toString() }, 'replaceThisWithSecretString') user.tokens = user.tokens.concat({ token }); user.save(); return token; } userSchema.statics.findByCredentials = async (email, password) => { const user = await User.findOne({ email }); if (!user) { throw new Error('Unable to login'); } const isMatch = await bcrypt.compare(password, user.password); if (!isMatch) { throw new Error('Unable to login'); } return user; } userSchema.pre('save', async function(next){ const user = this; if (user.isModified('password')) { user.password = await bcrypt.hash(user.password, 8); } next(); }) const User = mongoose.model('User', userSchema); module.exports = User;