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 } stopCh, ok := s.reminderLoop.start() if !ok { return } go func() { ticker := time.NewTicker(defaultReminderPollInterval) defer ticker.Stop() s.runStageAdvanceReminders(context.Background()) for { select { case <-stopCh: 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) } }