package server import ( "context" "log/slog" "time" ) const defaultReminderPollInterval = 15 * time.Minute func (s *Server) startNotificationReminderLoop() { if s == nil || s.notifySvc == nil || !s.notifySvc.Available() { return } s.reminderStop = make(chan struct{}) go func() { ticker := time.NewTicker(defaultReminderPollInterval) defer ticker.Stop() s.runStageAdvanceReminders(context.Background()) for { select { case <-s.reminderStop: return case <-ticker.C: s.runStageAdvanceReminders(context.Background()) } } }() } func (s *Server) runStageAdvanceReminders(ctx context.Context) { if s.notifySvc == nil || !s.notifySvc.Available() { return } n, err := s.notifySvc.ProcessStageAdvanceReminders(ctx) if err != nil { slog.Warn("stage advance reminder scan failed", "error", err) return } if n > 0 { slog.Info("stage advance 24h reminders sent", "count", n) } }