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
 |