Files
FileRelay/internal/task/cleaner.go
2026-01-13 17:00:49 +08:00

60 lines
1.4 KiB
Go

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)
}
}