const { DataTypes } = require('sequelize'); const sequelize = require('../config/database'); const bcrypt = require('bcryptjs'); const User = sequelize.define('User', { id: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, primaryKey: true }, username: { type: DataTypes.STRING, unique: true, allowNull: true }, email: { type: DataTypes.STRING, unique: true, allowNull: true, validate: { isEmail: true } }, password: { type: DataTypes.STRING, allowNull: true }, firstName: { type: DataTypes.STRING, allowNull: false }, lastName: { type: DataTypes.STRING, allowNull: false }, phone: { type: DataTypes.STRING, unique: true, allowNull: true }, phoneVerified: { type: DataTypes.BOOLEAN, defaultValue: false }, authProvider: { type: DataTypes.ENUM('local', 'phone', 'google', 'apple', 'facebook'), defaultValue: 'local' }, providerId: { type: DataTypes.STRING, allowNull: true }, address1: { type: DataTypes.STRING }, address2: { type: DataTypes.STRING }, city: { type: DataTypes.STRING }, state: { type: DataTypes.STRING }, zipCode: { type: DataTypes.STRING }, country: { type: DataTypes.STRING }, profileImage: { type: DataTypes.STRING }, isVerified: { type: DataTypes.BOOLEAN, defaultValue: false }, defaultAvailableAfter: { type: DataTypes.STRING, defaultValue: '09:00' }, defaultAvailableBefore: { type: DataTypes.STRING, defaultValue: '17:00' }, defaultSpecifyTimesPerDay: { type: DataTypes.BOOLEAN, defaultValue: false }, defaultWeeklyTimes: { type: DataTypes.JSONB, defaultValue: { sunday: { availableAfter: "09:00", availableBefore: "17:00" }, monday: { availableAfter: "09:00", availableBefore: "17:00" }, tuesday: { availableAfter: "09:00", availableBefore: "17:00" }, wednesday: { availableAfter: "09:00", availableBefore: "17:00" }, thursday: { availableAfter: "09:00", availableBefore: "17:00" }, friday: { availableAfter: "09:00", availableBefore: "17:00" }, saturday: { availableAfter: "09:00", availableBefore: "17:00" } } }, stripeConnectedAccountId: { type: DataTypes.STRING, allowNull: true }, stripeCustomerId: { type: DataTypes.STRING, allowNull: true } }, { hooks: { beforeCreate: async (user) => { if (user.password) { user.password = await bcrypt.hash(user.password, 10); } }, beforeUpdate: async (user) => { if (user.changed('password') && user.password) { user.password = await bcrypt.hash(user.password, 10); } } } }); User.prototype.comparePassword = async function(password) { if (!this.password) { return false; } return bcrypt.compare(password, this.password); }; module.exports = User;