From f171fa8a72ad0baf695a55082b1dbc3353225b54 Mon Sep 17 00:00:00 2001 From: zhanghan Date: Sat, 11 Oct 2025 16:49:36 +0800 Subject: [PATCH] Provide script version publishing interface --- .../module/common/enum/rule/action.go | 14 ++++++++++- .../module/common/enum/script/status.go | 14 ++++++++++- .../module/common/enum/script/type.go | 14 ++++++++++- .../module/common/enum/workflow/status.go | 14 ++++++++++- .../module/common/enum/workflow/step_type.go | 15 +++++++++++- .../controller/script_version.go | 18 +++++++++++++++ .../script_library/dao/script_version.go | 23 ++++++++++++++++++- .../script_library/model/script_version.go | 2 +- .../internal/module/script_library/router.go | 1 + .../script_library/service/script_version.go | 4 ++++ 10 files changed, 112 insertions(+), 7 deletions(-) diff --git a/automation/server/internal/module/common/enum/rule/action.go b/automation/server/internal/module/common/enum/rule/action.go index 3e1a0cba..045892d0 100644 --- a/automation/server/internal/module/common/enum/rule/action.go +++ b/automation/server/internal/module/common/enum/rule/action.go @@ -53,7 +53,15 @@ func (p *ActionType) UnmarshalJSON(data []byte) error { return fmt.Errorf("invalid ActionType: '%s', allowed: %v", s, ActionMap) } +func (p ActionType) IsValid() bool { + _, exists := ActionMap[int(p)] + return exists +} + func (p ActionType) Value() (driver.Value, error) { + if !p.IsValid() { + return nil, fmt.Errorf("invalid ActionType: %d, allowed: %v", int(p), ActionMap) + } return int64(p), nil } @@ -63,7 +71,11 @@ func (p *ActionType) Scan(value interface{}) error { return nil } if v, ok := value.(int64); ok { - *p = ActionType(int(v)) + status := ActionType(int(v)) + if !status.IsValid() { + return fmt.Errorf("invalid ActionType: %d, allowed: %v", int(v), ActionMap) + } + *p = status return nil } return nil diff --git a/automation/server/internal/module/common/enum/script/status.go b/automation/server/internal/module/common/enum/script/status.go index a18c20fb..28bd2ab9 100644 --- a/automation/server/internal/module/common/enum/script/status.go +++ b/automation/server/internal/module/common/enum/script/status.go @@ -62,7 +62,15 @@ func (p *ScriptPublishStatus) UnmarshalJSON(data []byte) error { return fmt.Errorf("invalid ScriptPublishStatus, must be string or number") } +func (p ScriptPublishStatus) IsValid() bool { + _, exists := ScriptPublishStatusMap[int(p)] + return exists +} + func (p ScriptPublishStatus) Value() (driver.Value, error) { + if !p.IsValid() { + return nil, fmt.Errorf("invalid ScriptPublishStatus: %d, allowed: %v", int(p), ScriptPublishStatusMap) + } return int64(p), nil } @@ -72,7 +80,11 @@ func (p *ScriptPublishStatus) Scan(value interface{}) error { return nil } if v, ok := value.(int64); ok { - *p = ScriptPublishStatus(int(v)) + status := ScriptPublishStatus(int(v)) + if !status.IsValid() { + return fmt.Errorf("invalid ScriptPublishStatus: %d, allowed: %v", int(v), ScriptPublishStatusMap) + } + *p = status return nil } return nil diff --git a/automation/server/internal/module/common/enum/script/type.go b/automation/server/internal/module/common/enum/script/type.go index 9caac61c..e6a6492b 100644 --- a/automation/server/internal/module/common/enum/script/type.go +++ b/automation/server/internal/module/common/enum/script/type.go @@ -57,7 +57,15 @@ func (p *ScriptType) UnmarshalJSON(data []byte) error { return fmt.Errorf("invalid ScriptType: '%s', allowed: %v", s, ScriptTypeMap) } +func (p ScriptType) IsValid() bool { + _, exists := ScriptTypeMap[int(p)] + return exists +} + func (p ScriptType) Value() (driver.Value, error) { + if !p.IsValid() { + return nil, fmt.Errorf("invalid ScriptType: %d, allowed: %v", int(p), ScriptTypeMap) + } return int64(p), nil } @@ -67,7 +75,11 @@ func (p *ScriptType) Scan(value interface{}) error { return nil } if v, ok := value.(int64); ok { - *p = ScriptType(int(v)) + status := ScriptType(int(v)) + if !status.IsValid() { + return fmt.Errorf("invalid ScriptType: %d, allowed: %v", int(v), ScriptTypeMap) + } + *p = status return nil } return nil diff --git a/automation/server/internal/module/common/enum/workflow/status.go b/automation/server/internal/module/common/enum/workflow/status.go index 6bda16dd..e6d08b03 100644 --- a/automation/server/internal/module/common/enum/workflow/status.go +++ b/automation/server/internal/module/common/enum/workflow/status.go @@ -52,7 +52,15 @@ func (p *PublishStatus) UnmarshalJSON(data []byte) error { return fmt.Errorf("invalid PublishStatus: '%s', allowed: %v", s, PublishStatusMap) } +func (p PublishStatus) IsValid() bool { + _, exists := PublishStatusMap[int(p)] + return exists +} + func (p PublishStatus) Value() (driver.Value, error) { + if !p.IsValid() { + return nil, fmt.Errorf("invalid PublishStatus: %d, allowed: %v", int(p), PublishStatusMap) + } return int64(p), nil } @@ -62,7 +70,11 @@ func (p *PublishStatus) Scan(value interface{}) error { return nil } if v, ok := value.(int64); ok { - *p = PublishStatus(int(v)) + status := PublishStatus(int(v)) + if !status.IsValid() { + return fmt.Errorf("invalid PublishStatus: %d, allowed: %v", int(v), PublishStatusMap) + } + *p = status return nil } return nil diff --git a/automation/server/internal/module/common/enum/workflow/step_type.go b/automation/server/internal/module/common/enum/workflow/step_type.go index d5abd07c..841ecc20 100644 --- a/automation/server/internal/module/common/enum/workflow/step_type.go +++ b/automation/server/internal/module/common/enum/workflow/step_type.go @@ -54,7 +54,15 @@ func (p *StepType) UnmarshalJSON(data []byte) error { return fmt.Errorf("invalid StepType: '%s', allowed: %v", s, StepTypeMap) } +func (p StepType) IsValid() bool { + _, exists := StepTypeMap[int(p)] + return exists +} + func (p StepType) Value() (driver.Value, error) { + if !p.IsValid() { + return nil, fmt.Errorf("invalid StepType: %d, allowed: %v", int(p), StepTypeMap) + } return int64(p), nil } @@ -63,8 +71,13 @@ func (p *StepType) Scan(value interface{}) error { *p = 0 return nil } + if v, ok := value.(int64); ok { - *p = StepType(int(v)) + status := StepType(int(v)) + if !status.IsValid() { + return fmt.Errorf("invalid StepType: %d, allowed: %v", int(v), StepTypeMap) + } + *p = status return nil } return nil diff --git a/automation/server/internal/module/script_library/controller/script_version.go b/automation/server/internal/module/script_library/controller/script_version.go index 7bbd1a01..7cc20c1e 100644 --- a/automation/server/internal/module/script_library/controller/script_version.go +++ b/automation/server/internal/module/script_library/controller/script_version.go @@ -66,3 +66,21 @@ func DeleteScriptVersionHandler(c *gin.Context) { } response.Success(c, nil, "success") } + +func PublishScriptVersionHandler(c *gin.Context) { + script_id := c.Param("script_id") + + var id struct { + ID int `json:"id"` + NewStatus string `json:"new_status"` + } + if err := c.ShouldBindJSON(&id); err != nil { + response.Fail(c, nil, err.Error()) + return + } + if err := service.PublishScriptVersion(id.ID, script_id, id.NewStatus); err != nil { + response.Fail(c, nil, err.Error()) + return + } + response.Success(c, nil, "success") +} diff --git a/automation/server/internal/module/script_library/dao/script_version.go b/automation/server/internal/module/script_library/dao/script_version.go index e2dcc48e..39198951 100644 --- a/automation/server/internal/module/script_library/dao/script_version.go +++ b/automation/server/internal/module/script_library/dao/script_version.go @@ -92,7 +92,12 @@ func AddScriptVersion(sv *model.ScriptVersion) error { } func UpdateScriptVersion(id int, scriptId string, sv *model.ScriptVersion) error { - return global.App.MySQL.Model(&model.ScriptVersion{}).Where("id = ? AND script_id = ?", id, scriptId).Updates(sv).Error + return global.App.MySQL.Transaction(func(tx *gorm.DB) error { + if err := tx.Model(&model.ScriptVersion{}).Where("id = ? AND script_id = ?", id, scriptId).Updates(sv).Error; err != nil { + return err + } + return nil + }) } func DeleteScriptVersion(id int, scriptId string) error { @@ -116,6 +121,22 @@ func DeleteScriptVersion(id int, scriptId string) error { }) } +func PublishScriptVersion(id int, scriptId string, newStatus string) error { + return global.App.MySQL.Transaction(func(tx *gorm.DB) error { + if newStatus == script.Published.String() { + if err := tx.Model(&model.ScriptVersion{}).Where("script_id = ?", scriptId).Update("status", script.Develop).Error; err != nil { + return err + } + } + + if err := tx.Model(&model.ScriptVersion{}).Where("id = ? AND script_id = ?", id, scriptId).Update("status", script.ParseScriptPublishStatus(newStatus)).Error; err != nil { + return err + } + + return nil + }) +} + func GetLatestScriptVersion(scriptId string) (string, error) { var sv model.ScriptVersion if err := global.App.MySQL.Model(&model.ScriptVersion{}).Where("script_id = ?", scriptId).Order("id DESC").First(&sv).Error; err != nil { diff --git a/automation/server/internal/module/script_library/model/script_version.go b/automation/server/internal/module/script_library/model/script_version.go index 7a8e600b..e9ccb68e 100644 --- a/automation/server/internal/module/script_library/model/script_version.go +++ b/automation/server/internal/module/script_library/model/script_version.go @@ -20,7 +20,7 @@ type ScriptVersion struct { Params json.RawMessage `json:"params" gorm:"type:json;comment:脚本执行参数"` // 存 ScriptParam 数组 Content string `json:"content" gorm:"type:text;not null;comment:脚本内容"` Version string `json:"version" gorm:"type:varchar(50);not null;uniqueIndex:uniq_script_version;comment:脚本版本号"` - VersionDesc string `json:"version_desc" gorm:"type:varchar(500);uniqueIndex:uniq_script_version;comment:脚本版本描述"` + VersionDesc string `json:"version_desc" gorm:"type:varchar(500);comment:脚本版本描述"` Status script.ScriptPublishStatus `json:"status" gorm:"default:1;comment:脚本版本状态"` ModifyUser string `json:"modify_user" gorm:"type:varchar(100);not null;comment:最后修改者"` ModifyTime string `json:"modify_time" gorm:"comment:最后修改时间"` diff --git a/automation/server/internal/module/script_library/router.go b/automation/server/internal/module/script_library/router.go index ce4987e2..51202852 100644 --- a/automation/server/internal/module/script_library/router.go +++ b/automation/server/internal/module/script_library/router.go @@ -19,6 +19,7 @@ func ScriptLibraryHandler(router *gin.RouterGroup) { versionGroup.POST("/add", controller.AddScriptVersionHandler) versionGroup.PUT("/update", controller.UpdateScriptVersionHandler) versionGroup.DELETE("/delete", controller.DeleteScriptVersionHandler) + versionGroup.POST("/publish", controller.PublishScriptVersionHandler) } } diff --git a/automation/server/internal/module/script_library/service/script_version.go b/automation/server/internal/module/script_library/service/script_version.go index 3de55570..0f9bb4f5 100644 --- a/automation/server/internal/module/script_library/service/script_version.go +++ b/automation/server/internal/module/script_library/service/script_version.go @@ -41,6 +41,10 @@ func DeleteScriptVersion(id int, scriptId string) error { return dao.DeleteScriptVersion(id, scriptId) } +func PublishScriptVersion(id int, scriptId string, newStatus string) error { + return dao.PublishScriptVersion(id, scriptId, newStatus) +} + func nextVersion(scriptId string) string { currentVersion, err := dao.GetLatestScriptVersion(scriptId) if err != nil { -- Gitee