All checks were successful
Deploy Smart Search Backend Test / deploy (push) Successful in 2m55s
73 lines
1.4 KiB
Go
73 lines
1.4 KiB
Go
package worker
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
"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
|
|
logger *zap.Logger
|
|
}
|
|
|
|
func NewSessionCleaner(ctx context.Context, sessionRepo repository.SessionRepository, logger *zap.Logger) *SessionCleaner {
|
|
return &SessionCleaner{
|
|
sessionRepo: sessionRepo,
|
|
ctx: ctx,
|
|
done: make(chan bool),
|
|
logger: logger,
|
|
}
|
|
}
|
|
|
|
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():
|
|
w.logger.Info("Session cleaner context cancelled, stopping worker")
|
|
return
|
|
}
|
|
}
|
|
}()
|
|
|
|
w.logger.Info("Session cleaner worker started (runs every hour)")
|
|
}
|
|
|
|
func (w *SessionCleaner) Stop() {
|
|
if w.ticker != nil {
|
|
w.ticker.Stop()
|
|
}
|
|
select {
|
|
case w.done <- true:
|
|
default:
|
|
}
|
|
w.logger.Info("Session cleaner worker stopped")
|
|
}
|
|
|
|
func (w *SessionCleaner) cleanExpiredSessions() {
|
|
count, err := w.sessionRepo.DeleteExpired(w.ctx)
|
|
if err != nil {
|
|
w.logger.Error("Error cleaning expired sessions", zap.Error(err))
|
|
return
|
|
}
|
|
|
|
if count > 0 {
|
|
w.logger.Info("Cleaned expired sessions", zap.Int("count", count))
|
|
}
|
|
}
|