package scheduler import ( "context" "log/slog" "time" "filefast/backend/internal/storage" "filefast/backend/internal/store" "github.com/robfig/cron/v3" ) type CleanupScheduler struct { logger *slog.Logger store *store.MemoryStore minioClient *storage.MinIOClient cron *cron.Cron } func NewCleanupScheduler(logger *slog.Logger, store *store.MemoryStore, minioClient *storage.MinIOClient) *CleanupScheduler { return &CleanupScheduler{ logger: logger, store: store, minioClient: minioClient, cron: cron.New(), } } func (s *CleanupScheduler) Start() { _, err := s.cron.AddFunc("@daily", s.cleanupExpiredFallbacks) if err != nil { s.logger.Error("failed to register cleanup cron", "error", err) return } s.cron.Start() } func (s *CleanupScheduler) Stop() { ctx := s.cron.Stop() <-ctx.Done() } func (s *CleanupScheduler) cleanupExpiredFallbacks() { now := time.Now() for _, object := range s.store.ListExpiredFallbackObjects(now) { if s.minioClient != nil { if err := s.minioClient.RemoveObject(context.Background(), object.ObjectKey); err != nil { s.logger.Warn("failed to remove expired fallback object", "transfer_id", object.TransferID, "error", err) continue } } object.CleanupState = "cleaned" object.CleanedAt = &now s.store.SaveFallbackObject(object) s.logger.Info("cleaned expired fallback object", "transfer_id", object.TransferID, "object_key", object.ObjectKey) } }