package task import ( "FileRelay/internal/bootstrap" "FileRelay/internal/model" "FileRelay/internal/service" "context" "fmt" "time" ) type Cleaner struct { batchService *service.BatchService } func NewCleaner() *Cleaner { return &Cleaner{ batchService: service.NewBatchService(), } } func (c *Cleaner) Start(ctx context.Context) { ticker := time.NewTicker(1 * time.Hour) defer ticker.Stop() for { select { case <-ctx.Done(): return case <-ticker.C: c.Clean() } } } func (c *Cleaner) Clean() { fmt.Println("Running cleanup task...") // 1. 寻找过期的 Active Batches var batches []model.FileBatch now := time.Now() bootstrap.DB.Where("status = ? AND expire_type = ? AND expire_at < ?", "active", "time", now).Find(&batches) for _, batch := range batches { c.batchService.MarkAsExpired(&batch) } // 2. 寻找标记为 expired 或 deleted 的批次并彻底清理文件和记录 // 这里可以根据业务需求决定是否立即物理删除,或者等待一段时间 // 按照需求:扫描 expired / deleted 批次,批量删除文件,清理数据库记录 var toDelete []model.FileBatch bootstrap.DB.Unscoped().Where("status IN ? OR deleted_at IS NOT NULL", []string{"expired", "deleted"}).Find(&toDelete) for _, batch := range toDelete { fmt.Printf("Deep cleaning batch: %d\n", batch.ID) c.batchService.DeleteBatch(context.Background(), batch.ID) } }