File: //home/ekspardev/ekspar-katalog-backend/src/app/user/model/user.model.js
const bcrypt = require('bcryptjs');
const { DataTypes } = require('sequelize');
const sequelize = require('../../../core/config/db.config');
const User = sequelize.define('user', {
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
username: {
type: DataTypes.STRING,
allowNull: false,
unique: 'username'
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: 'email',
validate: {
isEmail: true
}
},
password: {
type: DataTypes.STRING,
allowNull: false
},
fullName: DataTypes.STRING,
role: {
type: DataTypes.ENUM('user', 'admin', 'moderator'),
defaultValue: 'user'
},
isActive: {
type: DataTypes.BOOLEAN,
defaultValue: true
},
lastLogin: DataTypes.DATE,
failedLoginAttempts: {
type: DataTypes.INTEGER,
defaultValue: 0
},
lockUntil: DataTypes.DATE,
passwordResetToken: DataTypes.STRING,
passwordResetExpires: DataTypes.DATE,
isTwoFactorEnabled: {
type: DataTypes.BOOLEAN,
defaultValue: false
}
}, {
sequelize,
paranoid: true,
tableName: 'users',
timestamps: 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 = await bcrypt.hash(user.password, 10);
}
}
}
});
// İlişkili modeller için:
const UserLoginHistory = sequelize.define('userLoginHistory', {
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
userId: {
type: DataTypes.INTEGER,
references: {
model: User,
key: 'id'
}
},
loginTime: DataTypes.DATE,
ipAddress: DataTypes.STRING,
location: DataTypes.STRING,
browser: DataTypes.STRING,
operatingSystem: DataTypes.STRING,
device: DataTypes.STRING,
macAddress: DataTypes.STRING,
userAgent: DataTypes.TEXT,
acceptLanguage: DataTypes.STRING,
screenResolution: DataTypes.STRING,
timeZone: DataTypes.STRING,
latitude: DataTypes.FLOAT,
longitude: DataTypes.FLOAT,
countryCode: DataTypes.STRING
});
User.hasMany(UserLoginHistory);
UserLoginHistory.belongsTo(User);
User.prototype.validPassword = async function (password) {
return await bcrypt.compare(password, this.password);
};
module.exports = { User, UserLoginHistory };