package worker import ( "context" "time" "go.uber.org/zap" "git.techease.ru/Smart-search/smart-search-back/internal/repository" ) type InviteCleaner struct { inviteRepo repository.InviteRepository ctx context.Context ticker *time.Ticker done chan bool logger *zap.Logger } func NewInviteCleaner(ctx context.Context, inviteRepo repository.InviteRepository, logger *zap.Logger) *InviteCleaner { return &InviteCleaner{ inviteRepo: inviteRepo, ctx: ctx, done: make(chan bool), logger: logger, } } func (w *InviteCleaner) Start() { w.ticker = time.NewTicker(6 * time.Hour) w.deactivateExpiredInvites() go func() { for { select { case <-w.ticker.C: w.deactivateExpiredInvites() case <-w.done: return case <-w.ctx.Done(): w.logger.Info("Invite cleaner context cancelled, stopping worker") return } } }() w.logger.Info("Invite cleaner worker started (runs every 6 hours)") } func (w *InviteCleaner) Stop() { if w.ticker != nil { w.ticker.Stop() } select { case w.done <- true: default: } w.logger.Info("Invite cleaner worker stopped") } func (w *InviteCleaner) deactivateExpiredInvites() { count, err := w.inviteRepo.DeactivateExpired(w.ctx) if err != nil { w.logger.Error("Error deactivating expired invites", zap.Error(err)) return } if count > 0 { w.logger.Info("Deactivated expired invite codes", zap.Int("count", count)) } }