const { DataTypes } = require('sequelize'); const bcrypt = require('bcryptjs'); const { sequelize } = require('../config/database'); const User = sequelize.define('User', { id: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, primaryKey: true }, email: { type: DataTypes.STRING, allowNull: false, unique: true, validate: { isEmail: true }, set(value) { this.setDataValue('email', value.toLowerCase().trim()); } }, password: { type: DataTypes.STRING, allowNull: false, validate: { len: [6, 255] } }, name: { type: DataTypes.STRING, allowNull: false, validate: { len: [1, 100] }, set(value) { this.setDataValue('name', value.trim()); } }, role: { type: DataTypes.ENUM('admin', 'moderator'), defaultValue: 'admin' }, avatar: { type: DataTypes.STRING, allowNull: true }, isActive: { type: DataTypes.BOOLEAN, defaultValue: true }, lastLogin: { type: DataTypes.DATE, allowNull: true } }, { tableName: 'users', timestamps: true, hooks: { beforeSave: async (user) => { if (user.changed('password')) { const salt = await bcrypt.genSalt(12); user.password = await bcrypt.hash(user.password, salt); } } } }); // Instance methods User.prototype.comparePassword = async function(candidatePassword) { return bcrypt.compare(candidatePassword, this.password); }; User.prototype.updateLastLogin = function() { this.lastLogin = new Date(); return this.save(); }; module.exports = User;