package services import ( "context" "time" "fwh-toolbox-server/cache" "fwh-toolbox-server/domain" minioRepo "fwh-toolbox-server/repositories/minio" mongoRepo "fwh-toolbox-server/repositories/mongo" "go.mongodb.org/mongo-driver/bson" "go.uber.org/zap" ) func CleanupDataDownloadPackages(ctx context.Context) error { now := time.Now().UTC() jobs, err := mongoRepo.FindExpiredDataDownloadPackageJobs(ctx, now) if err != nil { return err } if len(jobs) > 0 { zap.L().Info("[DataDownload] 清理过期 Package", zap.Int("count", len(jobs))) } for i := range jobs { lock, ok, lockErr := cache.TryLock(ctx, "data-download:package:"+jobs[i].ID.Hex(), 5*time.Minute) if lockErr != nil || !ok { continue } if jobs[i].ObjectKey != "" { if err := minioRepo.Delete(ctx, jobs[i].ObjectKey); err != nil { lock.SafeRelease(context.Background()) continue } } purge := jobs[i].ExpiresAt.Add(30 * 24 * time.Hour) _ = mongoRepo.UpdateDataDownloadPackageJob(ctx, jobs[i].ID, bson.M{"status": domain.DataDownloadExpired, "objectKey": "", "purgeAt": purge}) lock.SafeRelease(context.Background()) } return mongoRepo.PurgeExpiredDataDownloadPackageJobs(ctx, now) } func CleanupDataDownloadArtifacts(ctx context.Context) error { artifacts, err := mongoRepo.FindExpiredDataDownloadArtifacts(ctx, time.Now().UTC()) if err != nil { return err } if len(artifacts) > 0 { zap.L().Info("[DataDownload] 清理过期渲染 Artifact", zap.Int("count", len(artifacts))) } for i := range artifacts { lock, lockErr := cache.Lock(ctx, "data-download:content:"+artifacts[i].DocumentID, 10*time.Minute, 100*time.Millisecond, 10*time.Second) if lockErr != nil { continue } if err := mongoRepo.DetachDataDownloadArtifact(ctx, artifacts[i]); err != nil { lock.SafeRelease(context.Background()) continue } if err := minioRepo.Delete(ctx, artifacts[i].ObjectKey); err != nil { lock.SafeRelease(context.Background()) continue } _ = mongoRepo.DeleteDataDownloadArtifact(ctx, artifacts[i]) lock.SafeRelease(context.Background()) } return nil }