package server import ( "context" "log/slog" "time" "chat-agent-system/internal/errcode" ) 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) errcode.Report(ctx, errcode.Event{ Code: "REMINDER_SCAN_FAILED", Module: "notification", Source: "async", Upstream: err.Error(), }) return } if n > 0 { slog.Info("stage advance 24h reminders sent", "count", n) } }