const { DataTypes, Model } = require("sequelize"); const sequelize = require("../util/database"); const bcrypt = require("bcryptjs"); const User = sequelize.define("User", { id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true, allowNull: false }, email: { type: DataTypes.STRING, allowNull: false, unique: true }, username: { type: DataTypes.STRING, allowNull: false, unique: true }, firstname: { type: DataTypes.STRING }, lastname: { type: DataTypes.STRING }, bio: { type: DataTypes.TEXT, allowNull: true }, image: { type: DataTypes.TEXT, allowNull: true }, role: { type: DataTypes.STRING }, password: { type: DataTypes.STRING, allowNull: false } }, { sequelize, timestamps: true, modelName: 'User', tableName: 'user', createdAt: true, updatedAt: true }); Model.prototype.matchPassword = async function (enteredPassword) { return await bcrypt.compare(enteredPassword, this.password); }; const DEFAULT_SALT_ROUNDS = 10; User.addHook("beforeCreate", async (user) => { const encryptedPassword = await bcrypt.hash( user.password, DEFAULT_SALT_ROUNDS ); user.password = encryptedPassword; }); User.prototype.toJSONFor = function () { return { id: this.id, email: this.email, username: this.username, firstname: this.firstname, lastname: this.lastname, bio: this.bio, image: this.image, role: this.role }; }; module.exports = User;