mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			89 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
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>} 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
 |