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