const mongoose = require('mongoose'); const bcrypt = require('bcryptjs'); const signPayload = require('../server/services/signPayload'); const userSchema = require('./schema/userSchema.js'); const { SESSION_EXPIRY } = process.env ?? {}; const expires = eval(SESSION_EXPIRY) ?? 1000 * 60 * 15; userSchema.methods.toJSON = function () { return { id: this._id, provider: this.provider, email: this.email, name: this.name, username: this.username, avatar: this.avatar, role: this.role, emailVerified: this.emailVerified, plugins: this.plugins, createdAt: this.createdAt, updatedAt: this.updatedAt, }; }; userSchema.methods.generateToken = async function () { return await signPayload({ payload: { id: this._id, username: this.username, provider: this.provider, email: this.email, }, secret: process.env.JWT_SECRET, expirationTime: expires / 1000, }); }; userSchema.methods.comparePassword = function (candidatePassword, callback) { bcrypt.compare(candidatePassword, this.password, (err, isMatch) => { if (err) { return callback(err); } callback(null, isMatch); }); }; module.exports.hashPassword = async (password) => { const hashedPassword = await new Promise((resolve, reject) => { bcrypt.hash(password, 10, function (err, hash) { if (err) { reject(err); } else { resolve(hash); } }); }); return hashedPassword; }; const User = mongoose.model('User', userSchema); module.exports = User;