feat: complete Kra admin backend migration

This commit is contained in:
2026-08-14 00:28:37 +08:00
parent c4bf7ee03b
commit acba9624d7
88 changed files with 1765 additions and 8623 deletions
+35 -14
View File
@@ -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, &params)
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": "清理过期大文件上传会话"}}
}