diff --git a/internal/controllers/task_controller.go b/internal/controllers/task_controller.go index c6bc05d..b7bfe5a 100644 --- a/internal/controllers/task_controller.go +++ b/internal/controllers/task_controller.go @@ -117,17 +117,42 @@ func (tc *TaskController) CreateTask(c *gin.Context) { } } + param := tasks.TaskParam{ + Name: req.Name, + Remark: req.Remark, + Command: req.Command, + PreCommand: req.PreCommand, + PostCommand: req.PostCommand, + Tags: req.Tags, + Type: req.Type, + Config: req.Config, + Schedule: req.Schedule, + Timeout: req.Timeout, + WorkDir: workDir, + CleanConfig: req.CleanConfig, + Envs: req.Envs, + Languages: req.Languages, + AgentID: req.AgentID, + TriggerType: req.TriggerType, + RetryCount: req.RetryCount, + RetryInterval: req.RetryInterval, + RandomRange: req.RandomRange, + SourceID: sourceID, + PinType: req.PinType, + Enabled: true, + } + var task *models.Task // 去重逻辑:如果已存在相同 SourceID 的仓库任务,则改为更新 if sourceID != "" { task = tc.taskService.GetTaskBySourceID(sourceID) if task != nil { - task = tc.taskService.UpdateTask(task.ID, req.Name, req.Remark, req.Command, req.PreCommand, req.PostCommand, req.Schedule, req.Timeout, workDir, req.CleanConfig, req.Envs, true, req.Type, req.Config, req.AgentID, req.Languages, req.TriggerType, req.Tags, req.RetryCount, req.RetryInterval, req.RandomRange, sourceID, req.PinType) + task = tc.taskService.UpdateTask(task.ID, ¶m) } } if task == nil { - task = tc.taskService.CreateTask(req.Name, req.Remark, req.Command, req.PreCommand, req.PostCommand, req.Schedule, req.Timeout, workDir, req.CleanConfig, req.Envs, req.Type, req.Config, req.AgentID, req.Languages, req.TriggerType, req.Tags, req.RetryCount, req.RetryInterval, req.RandomRange, sourceID, req.PinType) + task = tc.taskService.CreateTask(¶m) } // 如果是 Agent 任务,通知 Agent;否则添加到本地 cron @@ -280,7 +305,32 @@ func (tc *TaskController) UpdateTask(c *gin.Context) { sourceID = oldTask.SourceID } - task := tc.taskService.UpdateTask(id, req.Name, req.Remark, req.Command, req.PreCommand, req.PostCommand, req.Schedule, req.Timeout, workDir, req.CleanConfig, req.Envs, req.Enabled, req.Type, req.Config, req.AgentID, req.Languages, req.TriggerType, req.Tags, req.RetryCount, req.RetryInterval, req.RandomRange, sourceID, req.PinType) + param := tasks.TaskParam{ + Name: req.Name, + Remark: req.Remark, + Command: req.Command, + PreCommand: req.PreCommand, + PostCommand: req.PostCommand, + Tags: req.Tags, + Type: req.Type, + Config: req.Config, + Schedule: req.Schedule, + Timeout: req.Timeout, + WorkDir: workDir, + CleanConfig: req.CleanConfig, + Envs: req.Envs, + Languages: req.Languages, + AgentID: req.AgentID, + TriggerType: req.TriggerType, + RetryCount: req.RetryCount, + RetryInterval: req.RetryInterval, + RandomRange: req.RandomRange, + SourceID: sourceID, + PinType: req.PinType, + Enabled: req.Enabled, + } + + task := tc.taskService.UpdateTask(id, ¶m) if task == nil { utils.NotFound(c, "任务不存在") return diff --git a/internal/services/tasks/task_service.go b/internal/services/tasks/task_service.go index e83b5c1..2daffb8 100644 --- a/internal/services/tasks/task_service.go +++ b/internal/services/tasks/task_service.go @@ -8,6 +8,32 @@ import ( "strings" ) +// TaskParam 任务创建与更新参数传输对象 +type TaskParam struct { + Name string + Remark string + Command string + PreCommand string + PostCommand string + Tags string + Type string + Config string + Schedule string + Timeout int + WorkDir string + CleanConfig string + Envs string + Languages models.TaskLanguages + AgentID *string + TriggerType string + RetryCount int + RetryInterval int + RandomRange int + SourceID string + PinType string + Enabled bool +} + type TaskService struct { } @@ -24,44 +50,44 @@ func (ts *TaskService) GetTaskBySourceID(sourceID string) *models.Task { return &task } -func (ts *TaskService) CreateTask(name, remark, command, preCommand, postCommand, schedule string, timeout int, workDir, cleanConfig, envs, taskType, config string, agentID *string, languages models.TaskLanguages, triggerType string, tags string, retryCount int, retryInterval int, randomRange int, sourceID string, pinType string) *models.Task { - if taskType == "" { - taskType = "task" +func (ts *TaskService) CreateTask(p *TaskParam) *models.Task { + if p.Type == "" { + p.Type = "task" } - if triggerType == "" { - triggerType = constant.TriggerTypeCron + if p.TriggerType == "" { + p.TriggerType = constant.TriggerTypeCron } - if pinType == "" { - pinType = constant.PinTypeNone + if p.PinType == "" { + p.PinType = constant.PinTypeNone } task := &models.Task{ ID: utils.GenerateID(), - Name: name, - Remark: remark, - Command: models.BigText(command), - PreCommand: models.BigText(preCommand), - PostCommand: models.BigText(postCommand), - PinType: pinType, - Tags: tags, - Type: taskType, - TriggerType: triggerType, - Config: models.BigText(config), - Schedule: schedule, - Timeout: timeout, - WorkDir: workDir, - CleanConfig: cleanConfig, - Envs: models.BigText(envs), - Languages: languages, - AgentID: agentID, + Name: p.Name, + Remark: p.Remark, + Command: models.BigText(p.Command), + PreCommand: models.BigText(p.PreCommand), + PostCommand: models.BigText(p.PostCommand), + PinType: p.PinType, + Tags: p.Tags, + Type: p.Type, + TriggerType: p.TriggerType, + Config: models.BigText(p.Config), + Schedule: p.Schedule, + Timeout: p.Timeout, + WorkDir: p.WorkDir, + CleanConfig: p.CleanConfig, + Envs: models.BigText(p.Envs), + Languages: p.Languages, + AgentID: p.AgentID, Enabled: utils.BoolPtr(true), - RetryCount: retryCount, - RetryInterval: retryInterval, - RandomRange: randomRange, - SourceID: sourceID, + RetryCount: p.RetryCount, + RetryInterval: p.RetryInterval, + RandomRange: p.RandomRange, + SourceID: p.SourceID, CreatedAt: models.Now(), UpdatedAt: models.Now(), } - if triggerType != constant.TriggerTypeCron { + if p.TriggerType != constant.TriggerTypeCron { task.NextRun = nil } database.DB.Select("*").Create(task) @@ -125,39 +151,39 @@ func (ts *TaskService) GetTaskByID(id string) *models.Task { return &task } -func (ts *TaskService) UpdateTask(id string, name, remark, command, preCommand, postCommand, schedule string, timeout int, workDir, cleanConfig, envs string, enabled bool, taskType, config string, agentID *string, languages models.TaskLanguages, triggerType string, tags string, retryCount int, retryInterval int, randomRange int, sourceID string, pinType string) *models.Task { +func (ts *TaskService) UpdateTask(id string, p *TaskParam) *models.Task { var task models.Task res := database.DB.Where("id = ?", id).Limit(1).Find(&task) if res.Error != nil || res.RowsAffected == 0 { return nil } - task.Name = name - task.Remark = remark - task.Command = models.BigText(command) - task.PreCommand = models.BigText(preCommand) - task.PostCommand = models.BigText(postCommand) - task.PinType = pinType - task.Tags = tags - task.Schedule = schedule - task.Timeout = timeout - task.WorkDir = workDir - task.CleanConfig = cleanConfig - task.Envs = models.BigText(envs) - task.Enabled = &enabled - task.AgentID = agentID - task.Languages = languages - task.Config = models.BigText(config) - task.RetryCount = retryCount - task.RetryInterval = retryInterval - task.RandomRange = randomRange - if taskType != "" { - task.Type = taskType + task.Name = p.Name + task.Remark = p.Remark + task.Command = models.BigText(p.Command) + task.PreCommand = models.BigText(p.PreCommand) + task.PostCommand = models.BigText(p.PostCommand) + task.PinType = p.PinType + task.Tags = p.Tags + task.Schedule = p.Schedule + task.Timeout = p.Timeout + task.WorkDir = p.WorkDir + task.CleanConfig = p.CleanConfig + task.Envs = models.BigText(p.Envs) + task.Enabled = &p.Enabled + task.AgentID = p.AgentID + task.Languages = p.Languages + task.Config = models.BigText(p.Config) + task.RetryCount = p.RetryCount + task.RetryInterval = p.RetryInterval + task.RandomRange = p.RandomRange + if p.Type != "" { + task.Type = p.Type } - if triggerType != "" { - task.TriggerType = triggerType + if p.TriggerType != "" { + task.TriggerType = p.TriggerType } - if sourceID != "" { - task.SourceID = sourceID + if p.SourceID != "" { + task.SourceID = p.SourceID } database.DB.Model(&task).Select(