feat: add delete env ref tasks chekc

This commit is contained in:
engigu
2026-03-05 12:02:56 +08:00
parent bc09625708
commit 06dc3798fc
5 changed files with 158 additions and 18 deletions
+23 -2
View File
@@ -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))
}
+1
View File
@@ -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)
}
+42 -2
View File
@@ -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 格式