const { DataTypes, Model, Op } = require('sequelize') class Session extends Model { constructor(values, options) { super(values, options) /** @type {UUIDV4} */ this.id /** @type {string} */ this.ipAddress /** @type {string} */ this.userAgent /** @type {Date} */ this.createdAt /** @type {Date} */ this.updatedAt /** @type {UUIDV4} */ this.userId /** @type {Date} */ this.expiresAt // Expanded properties /** @type {import('./User').User} */ this.user } static async createSession(userId, ipAddress, userAgent, refreshToken, expiresAt) { const session = await Session.create({ userId, ipAddress, userAgent, refreshToken, expiresAt }) return session } /** * Clean up expired sessions from the database * @returns {Promise} Number of sessions deleted */ static async cleanupExpiredSessions() { const deletedCount = await Session.destroy({ where: { expiresAt: { [Op.lt]: new Date() } } }) return deletedCount } /** * Initialize model * @param {import('../Database').sequelize} sequelize */ static init(sequelize) { super.init( { id: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, primaryKey: true }, ipAddress: DataTypes.STRING, userAgent: DataTypes.STRING, refreshToken: { type: DataTypes.STRING, allowNull: false }, expiresAt: { type: DataTypes.DATE, allowNull: false } }, { sequelize, modelName: 'session' } ) const { user } = sequelize.models user.hasMany(Session, { onDelete: 'CASCADE', foreignKey: { allowNull: false } }) Session.belongsTo(user) } } module.exports = Session