package auth import "gorm.io/gorm" type Repository interface { CreateRefreshToken(token *RefreshToken) error FindByToken(token string) (*RefreshToken, error) DeleteByToken(token string) error DeleteByUserID(userID uint) error ReplaceUserRefreshToken(userID uint, newToken *RefreshToken) error RotateRefreshToken(oldToken string, newToken *RefreshToken) error } type repository struct { db *gorm.DB } func NewRepository(db *gorm.DB) Repository { return &repository{db: db} } func (r *repository) CreateRefreshToken(token *RefreshToken) error { return r.db.Create(token).Error } func (r *repository) FindByToken(token string) (*RefreshToken, error) { var rt RefreshToken err := r.db.Select("id", "user_id", "token", "expires_at", "created_at").Where("token = ?", token).First(&rt).Error if err != nil { return nil, err } return &rt, nil } func (r *repository) DeleteByToken(token string) error { return r.db.Where("token = ?", token).Delete(&RefreshToken{}).Error } func (r *repository) DeleteByUserID(userID uint) error { return r.db.Where("user_id = ?", userID).Delete(&RefreshToken{}).Error } func (r *repository) ReplaceUserRefreshToken(userID uint, newToken *RefreshToken) error { return r.db.Transaction(func(tx *gorm.DB) error { if err := tx.Where("user_id = ?", userID).Delete(&RefreshToken{}).Error; err != nil { return err } return tx.Create(newToken).Error }) } func (r *repository) RotateRefreshToken(oldToken string, newToken *RefreshToken) error { return r.db.Transaction(func(tx *gorm.DB) error { if err := tx.Where("token = ?", oldToken).Delete(&RefreshToken{}).Error; err != nil { return err } return tx.Create(newToken).Error }) }