feat: complete Kra admin backend migration
This commit is contained in:
+35
-14
@@ -9,6 +9,7 @@ import (
|
||||
"github.com/robfig/cron/v3"
|
||||
"io"
|
||||
"kra/internal/biz"
|
||||
"kra/internal/conf"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
@@ -16,9 +17,15 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
type TaskService struct{ uc *biz.TaskUsecase }
|
||||
type TaskService struct {
|
||||
uc *biz.TaskUsecase
|
||||
media *biz.MediaUsecase
|
||||
config *conf.AdminBackend
|
||||
}
|
||||
|
||||
func NewTaskService(uc *biz.TaskUsecase) *TaskService { return &TaskService{uc: uc} }
|
||||
func NewTaskService(uc *biz.TaskUsecase, media *biz.MediaUsecase, config *conf.AdminBackend) *TaskService {
|
||||
return &TaskService{uc: uc, media: media, config: config}
|
||||
}
|
||||
func (s *TaskService) Validate(v *biz.TimedTask) error {
|
||||
if v.Name == "" {
|
||||
return errors.New("任务名不能为空")
|
||||
@@ -34,7 +41,7 @@ func (s *TaskService) Validate(v *biz.TimedTask) error {
|
||||
}
|
||||
switch v.ExecutorType {
|
||||
case "method":
|
||||
if v.MethodName != "ClearDB" {
|
||||
if v.MethodName != "ClearDB" && v.MethodName != "CleanStaleUploads" {
|
||||
return errors.New("方法未注册")
|
||||
}
|
||||
if len(v.Params) > 0 && !json.Valid(v.Params) {
|
||||
@@ -60,6 +67,13 @@ func (s *TaskService) Create(ctx context.Context, v *biz.TimedTask) error {
|
||||
if err := s.Validate(v); err != nil {
|
||||
return err
|
||||
}
|
||||
exists, err := s.uc.Repo().TaskNameExists(ctx, v.Name, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if exists {
|
||||
return fmt.Errorf("任务名 %s 已存在", v.Name)
|
||||
}
|
||||
return s.uc.Repo().CreateTask(ctx, v)
|
||||
}
|
||||
func (s *TaskService) Update(ctx context.Context, v *biz.TimedTask) error {
|
||||
@@ -69,6 +83,13 @@ func (s *TaskService) Update(ctx context.Context, v *biz.TimedTask) error {
|
||||
if err := s.Validate(v); err != nil {
|
||||
return err
|
||||
}
|
||||
exists, err := s.uc.Repo().TaskNameExists(ctx, v.Name, v.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if exists {
|
||||
return fmt.Errorf("任务名 %s 已存在", v.Name)
|
||||
}
|
||||
return s.uc.Repo().UpdateTask(ctx, v)
|
||||
}
|
||||
func (s *TaskService) Delete(ctx context.Context, id uint) error {
|
||||
@@ -168,17 +189,17 @@ func (s *TaskService) Run(ctx context.Context, v *biz.TimedTask, trigger string)
|
||||
var err error
|
||||
switch v.ExecutorType {
|
||||
case "method":
|
||||
if v.MethodName == "ClearDB" {
|
||||
days := 30
|
||||
var params struct {
|
||||
Days int `json:"days"`
|
||||
}
|
||||
_ = json.Unmarshal(v.Params, ¶ms)
|
||||
if params.Days > 0 {
|
||||
days = params.Days
|
||||
}
|
||||
err = s.uc.Repo().CleanupLogs(runCtx, time.Now().AddDate(0, 0, -days))
|
||||
switch v.MethodName {
|
||||
case "ClearDB":
|
||||
err = s.uc.Repo().CleanupLogs(runCtx)
|
||||
log.Output = "过期日志清理完成"
|
||||
case "CleanStaleUploads":
|
||||
ttl := 24
|
||||
if s.config != nil && s.config.Media != nil && s.config.Media.SessionTtl > 0 {
|
||||
ttl = int(s.config.Media.SessionTtl)
|
||||
}
|
||||
err = s.media.CleanupStale(runCtx, ttl)
|
||||
log.Output = "过期大文件上传会话清理完成"
|
||||
}
|
||||
case "http":
|
||||
log.Output, err = s.runHTTP(runCtx, v)
|
||||
@@ -190,5 +211,5 @@ func (s *TaskService) Run(ctx context.Context, v *biz.TimedTask, trigger string)
|
||||
return log
|
||||
}
|
||||
func (s *TaskService) RegisteredMethods() []map[string]any {
|
||||
return []map[string]any{{"name": "ClearDB", "description": "清理数据库过期日志(操作记录、登录日志、定时任务日志)"}}
|
||||
return []map[string]any{{"name": "ClearDB", "description": "清理数据库过期日志(操作记录、JWT黑名单、定时任务日志)"}, {"name": "CleanStaleUploads", "description": "清理过期大文件上传会话"}}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user