// Package cron 提供定时任务:邮件重试、过期扫描、回收、审计归档。 // M0 注册任务框架(过期扫描/回收在 M1/M4 接入);M3 接入邮件失败重试; // 单实例部署说明见 PLAN §11。 package cron import ( "context" "log/slog" "github.com/robfig/cron/v3" "gorm.io/gorm" "ws_usernode/internal/mail" ) // Jobs 聚合定时任务依赖与注册。 type Jobs struct { db *gorm.DB mailer mail.Retryable log *slog.Logger } // New 创建定时任务集合。mailer 为邮件队列(失败重试,PLAN F5)。 func New(db *gorm.DB, mailer mail.Retryable, log *slog.Logger) *Jobs { return &Jobs{db: db, mailer: mailer, log: log} } // Register 将任务注册到 cron。 func (j *Jobs) Register(c *cron.Cron) { // 邮件失败重试(M3):每 5 分钟重试失败邮件(超出 mail.MaxRetries 停止) c.AddFunc("@every 5m", func() { if err := j.mailer.Retry(context.Background(), mail.MaxRetries); err != nil { j.log.Error("cron: mail retry failed", "err", err) } }) // 过期扫描(M4):每日扫描到期账号,锁系统账号 + 邮件通知 // 回收任务(M4):超回收期账号自动回收(userdel + 保留审计) // 审计归档(M4):每日将过期审计记录导出归档后清理 c.AddFunc("@daily", func() { j.log.Info("cron: daily maintenance tick (tasks to be implemented in M1/M4)") }) }