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 }, firstName: { type: DataTypes.STRING, allowNull: false, validate: { notEmpty: true, len: [2, 50] } }, lastName: { type: DataTypes.STRING, allowNull: false, validate: { notEmpty: true, len: [2, 50] } }, email: { type: DataTypes.STRING, allowNull: false, unique: true, validate: { isEmail: true } }, password: { type: DataTypes.STRING, allowNull: false, validate: { len: [6, 100] } }, role: { type: DataTypes.ENUM('super_admin', 'trainer', 'trainee'), allowNull: false, defaultValue: 'trainee' }, phone: { type: DataTypes.STRING, allowNull: true }, avatar: { type: DataTypes.STRING, allowNull: true }, isActive: { type: DataTypes.BOOLEAN, defaultValue: true }, lastLogin: { type: DataTypes.DATE, allowNull: true } }, { tableName: 'users', hooks: { beforeCreate: async (user) => { if (user.password) { user.password = await bcrypt.hash(user.password, 12); } }, beforeUpdate: async (user) => { if (user.changed('password')) { user.password = await bcrypt.hash(user.password, 12); } } } }); // Instance method to compare password User.prototype.comparePassword = async function(candidatePassword) { return await bcrypt.compare(candidatePassword, this.password); }; // Instance method to get full name User.prototype.getFullName = function() { return `${this.firstName} ${this.lastName}`; }; module.exports = User;