package sql import ( "context" "errors" "tercul/internal/domain" "time" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/trace" "gorm.io/gorm" ) type userSessionRepository struct { domain.BaseRepository[domain.UserSession] db *gorm.DB tracer trace.Tracer } // NewUserSessionRepository creates a new UserSessionRepository. func NewUserSessionRepository(db *gorm.DB) domain.UserSessionRepository { return &userSessionRepository{ BaseRepository: NewBaseRepositoryImpl[domain.UserSession](db), db: db, tracer: otel.Tracer("user_session.repository"), } } // GetByToken finds a session by token func (r *userSessionRepository) GetByToken(ctx context.Context, token string) (*domain.UserSession, error) { ctx, span := r.tracer.Start(ctx, "GetByToken") defer span.End() var session domain.UserSession if err := r.db.WithContext(ctx).Where("token = ?", token).First(&session).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityNotFound } return nil, err } return &session, nil } // GetByUserID finds sessions by user ID func (r *userSessionRepository) GetByUserID(ctx context.Context, userID uint) ([]domain.UserSession, error) { ctx, span := r.tracer.Start(ctx, "GetByUserID") defer span.End() var sessions []domain.UserSession if err := r.db.WithContext(ctx).Where("user_id = ?", userID).Find(&sessions).Error; err != nil { return nil, err } return sessions, nil } // DeleteExpired deletes expired sessions func (r *userSessionRepository) DeleteExpired(ctx context.Context) error { ctx, span := r.tracer.Start(ctx, "DeleteExpired") defer span.End() if err := r.db.WithContext(ctx).Where("expires_at < ?", time.Now()).Delete(&domain.UserSession{}).Error; err != nil { return err } return nil }