package worker import ( "context" "log" "time" "git.techease.ru/Smart-search/smart-search-back/internal/repository" ) type SessionCleaner struct { sessionRepo repository.SessionRepository ctx context.Context ticker *time.Ticker done chan bool } func NewSessionCleaner(ctx context.Context, sessionRepo repository.SessionRepository) *SessionCleaner { return &SessionCleaner{ sessionRepo: sessionRepo, ctx: ctx, done: make(chan bool), } } func (w *SessionCleaner) Start() { w.ticker = time.NewTicker(1 * time.Hour) w.cleanExpiredSessions() go func() { for { select { case <-w.ticker.C: w.cleanExpiredSessions() case <-w.done: return case <-w.ctx.Done(): log.Println("Session cleaner context cancelled, stopping worker") return } } }() log.Println("Session cleaner worker started (runs every hour)") } func (w *SessionCleaner) Stop() { if w.ticker != nil { w.ticker.Stop() } select { case w.done <- true: default: } log.Println("Session cleaner worker stopped") } func (w *SessionCleaner) cleanExpiredSessions() { count, err := w.sessionRepo.DeleteExpired(w.ctx) if err != nil { log.Printf("Error cleaning expired sessions: %v", err) return } if count > 0 { log.Printf("Cleaned %d expired sessions", count) } }