| 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; | |