feat: add delete env ref tasks chekc
This commit is contained in:
@@ -117,11 +117,32 @@ func (ec *EnvController) DeleteEnvVar(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
success := ec.envService.DeleteEnvVar(id)
|
||||
force := c.Query("force") == "true"
|
||||
success, associatedTasks := ec.envService.DeleteEnvVar(id, force)
|
||||
|
||||
if len(associatedTasks) > 0 {
|
||||
c.JSON(200, utils.Response{
|
||||
Code: 409,
|
||||
Msg: "该环境变量已被任务引用,请先在任务中删除引用或选择强制删除",
|
||||
Data: vo.ToTaskVOListFromModels(associatedTasks),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if !success {
|
||||
utils.NotFound(c, "环境变量不存在")
|
||||
utils.NotFound(c, "环境变量不存在或删除失败")
|
||||
return
|
||||
}
|
||||
|
||||
utils.SuccessMsg(c, "删除成功")
|
||||
}
|
||||
|
||||
func (ec *EnvController) GetAssociatedTasks(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
if id == "" {
|
||||
utils.BadRequest(c, "无效的环境变量ID")
|
||||
return
|
||||
}
|
||||
tasks := ec.envService.GetAssociatedTasks(id)
|
||||
utils.Success(c, vo.ToTaskVOListFromModels(tasks))
|
||||
}
|
||||
|
||||
@@ -139,6 +139,7 @@ func Setup(c *Controllers) *gin.Engine {
|
||||
env.GET("", c.Env.GetEnvVars)
|
||||
env.GET("/all", c.Env.GetAllEnvVars)
|
||||
env.GET("/:id", c.Env.GetEnvVar)
|
||||
env.GET("/:id/tasks", c.Env.GetAssociatedTasks)
|
||||
env.PUT("/:id", c.Env.UpdateEnvVar)
|
||||
env.DELETE("/:id", c.Env.DeleteEnvVar)
|
||||
}
|
||||
|
||||
@@ -6,6 +6,8 @@ import (
|
||||
"github.com/engigu/baihu-panel/internal/database"
|
||||
"github.com/engigu/baihu-panel/internal/models"
|
||||
"github.com/engigu/baihu-panel/internal/utils"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type EnvService struct{}
|
||||
@@ -72,9 +74,47 @@ func (es *EnvService) UpdateEnvVar(id string, name, value, remark string, hidden
|
||||
return &env
|
||||
}
|
||||
|
||||
func (es *EnvService) DeleteEnvVar(id string) bool {
|
||||
func (es *EnvService) GetAssociatedTasks(id string) []models.Task {
|
||||
var associatedTasks []models.Task
|
||||
query := "envs = ? OR envs LIKE ? OR envs LIKE ? OR envs LIKE ?"
|
||||
database.DB.Where(query, id, id+",%", "%,"+id, "%,"+id+",%").Find(&associatedTasks)
|
||||
return associatedTasks
|
||||
}
|
||||
|
||||
func (es *EnvService) DeleteEnvVar(id string, force bool) (bool, []models.Task) {
|
||||
associatedTasks := es.GetAssociatedTasks(id)
|
||||
|
||||
if len(associatedTasks) > 0 && !force {
|
||||
return false, associatedTasks
|
||||
}
|
||||
|
||||
if force {
|
||||
err := database.DB.Transaction(func(tx *gorm.DB) error {
|
||||
// Update tasks to remove this env ID
|
||||
for _, task := range associatedTasks {
|
||||
ids := splitEnvIDs(task.Envs)
|
||||
var newIDs []string
|
||||
for _, eid := range ids {
|
||||
if eid != id {
|
||||
newIDs = append(newIDs, eid)
|
||||
}
|
||||
}
|
||||
newEnvs := strings.Join(newIDs, ",")
|
||||
if err := tx.Model(&task).Update("envs", newEnvs).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
// Delete the env var
|
||||
if err := tx.Where("id = ?", id).Delete(&models.EnvironmentVariable{}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
})
|
||||
return err == nil, nil
|
||||
}
|
||||
|
||||
result := database.DB.Where("id = ?", id).Delete(&models.EnvironmentVariable{})
|
||||
return result.RowsAffected > 0
|
||||
return result.RowsAffected > 0, nil
|
||||
}
|
||||
|
||||
// GetEnvVarsByIDs 根据逗号分隔的ID字符串获取环境变量列表,返回 NAME=VALUE 格式
|
||||
|
||||
Reference in New Issue
Block a user