60 lines
1.4 KiB
Go
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)
|
|
}
|
|
}
|