tududi/backend/models/user.js
2025-06-16 23:01:28 +03:00

104 lines
No EOL
2.3 KiB
JavaScript

const { DataTypes } = require('sequelize');
const bcrypt = require('bcrypt');
module.exports = (sequelize) => {
const User = sequelize.define('User', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
name: {
type: DataTypes.STRING,
allowNull: true
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
validate: {
isEmail: true
}
},
password_digest: {
type: DataTypes.STRING,
allowNull: false,
field: 'password_digest'
},
appearance: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: 'light',
validate: {
isIn: [['light', 'dark']]
}
},
language: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: 'en'
},
timezone: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: 'UTC'
},
avatar_image: {
type: DataTypes.STRING,
allowNull: true
},
telegram_bot_token: {
type: DataTypes.STRING,
allowNull: true
},
telegram_chat_id: {
type: DataTypes.STRING,
allowNull: true
},
task_summary_enabled: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false
},
task_summary_frequency: {
type: DataTypes.STRING,
allowNull: true,
defaultValue: 'daily',
validate: {
isIn: [['daily', 'weekdays', 'weekly', '1h', '2h', '4h', '8h', '12h']]
}
},
task_summary_last_run: {
type: DataTypes.DATE,
allowNull: true
},
task_summary_next_run: {
type: DataTypes.DATE,
allowNull: true
}
}, {
tableName: 'users',
hooks: {
beforeValidate: async (user) => {
if (user.password) {
user.password_digest = await bcrypt.hash(user.password, 10);
}
}
}
});
// password operations
const hashPassword = async (password) => {
return await bcrypt.hash(password, 10);
};
const checkPassword = async (password, hashedPassword) => {
return await bcrypt.compare(password, hashedPassword);
};
// Attach utility functions to model
User.hashPassword = hashPassword;
User.checkPassword = checkPassword;
return User;
};