package task import ( "context" stderrors "errors" "fmt" "github.com/hibiken/asynq" "go.uber.org/zap" "github.com/break/junhong_cmp_fiber/internal/application/auditarchive" ) // AuditRetentionHandler 连续校验并按日物理清理已结束的在线日志。 type AuditRetentionHandler struct { service *auditarchive.Service logger *zap.Logger cleanupEnabled bool enabled bool } // NewAuditRetentionHandler 创建日留存处理器。 func NewAuditRetentionHandler(service *auditarchive.Service, logger *zap.Logger, cleanupEnabled, enabled bool) *AuditRetentionHandler { return &AuditRetentionHandler{service: service, logger: logger, cleanupEnabled: cleanupEnabled, enabled: enabled} } // Handle 在关闭清理开关时只读校验,开启后从最早未完成日连续删除。 func (h *AuditRetentionHandler) Handle(ctx context.Context, _ *asynq.Task) error { if !h.enabled { h.logger.Info("日志日留存已停用,跳过任务") return nil } if h.service == nil { return fmt.Errorf("日志日留存服务未配置") } results, err := h.service.RetainPendingDays(ctx, h.cleanupEnabled) for _, result := range results { h.logger.Info("日志日留存处理完成", zap.String("archive_date", result.ArchiveDate), zap.Bool("cleanup_enabled", h.cleanupEnabled), zap.Int64("audit_event_count", result.EventCount), zap.Int64("event_resource_count", result.ResourceCount), zap.Int64("integration_log_count", result.IntegrationCount), zap.Duration("duration", result.Duration)) } if err != nil { var blocked *auditarchive.RetentionBlockedError if stderrors.As(err, &blocked) { h.logger.Error("日志日留存日期推进已阻断", zap.String("archive_date", blocked.ArchiveDate), zap.String("source", blocked.Source), zap.String("failure_category", "archive_or_validation"), zap.Error(err)) } else { h.logger.Error("日志日留存日期推进已阻断", zap.String("source", "retention"), zap.String("failure_category", "internal"), zap.Error(err)) } return err } return nil }