项目初始化
This commit is contained in:
59
internal/task/cleaner.go
Normal file
59
internal/task/cleaner.go
Normal file
@@ -0,0 +1,59 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user