package stage import ( "app/cfg" "app/models" "app/utils" "encoding/json" "errors" "fmt" "io" "github.com/google/uuid" "github.com/veypi/OneBD/rest" "gorm.io/gorm" ) var _ = Router.Get("/:project_id/", getHandle) var _ = Router.Get("/:project_id/:id", getHandle) var _ = Router.Get("", getHandle) // 获取阶段 func getHandle(x *rest.X) (any, error) { utils.SetCORSHeaders(x) project_id, project_ok := x.Params.Get("project_id") id, ok := x.Params.Get("id") if !project_ok { return nil, errors.New("缺少project_id") } if !ok { // 获取所有阶段 var stages []models.Stage if err := cfg.DB().Where("project_id = ?", project_id).Find(&stages).Error; err != nil { return nil, err } return stages, nil } // 获取特定阶段 var stage models.Stage if err := cfg.DB().Where("id = ? and project_id =?", id, project_id).First(&stage).Error; err != nil { return nil, err } // 获取可用的树节点 availableNodes, _ := stage.AvailableNodes(cfg.DB()) var res = map[string]interface{}{ "stage": stage, "available_nodes": availableNodes, } return res, nil } var _ = Router.Post("", postHandle) // 创建阶段 func postHandle(x *rest.X) (any, error) { utils.SetCORSHeaders(x) stage := &models.Stage{} if err := json.NewDecoder(x.Request.Body).Decode(&stage); err != nil { return nil, err } stage.ID = uuid.New().String()[0:32] if err := cfg.DB().Create(&stage).Error; err != nil { return nil, err } return stage, nil } var _ = Router.Patch("/:project_id/:id", patchHandle) // TODO // 更新阶段 func patchHandle(x *rest.X) (any, error) { utils.SetCORSHeaders(x) // 从URL获取ID body, err := io.ReadAll(x.Request.Body) if err != nil { return nil, fmt.Errorf("读取请求体失败: %v", err) } id, ok := x.Params.Get("id") if !ok { return nil, errors.New("缺少id") } var updateMap map[string]interface{} if err := json.Unmarshal(body, &updateMap); err != nil { return nil, fmt.Errorf("解析JSON失败: %v", err) } // 先检查阶段是否存在 var stage models.Stage if err := cfg.DB().Where("id = ?", id).First(&stage).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, errors.New("阶段不存在") } return nil, err } // 删除不允许更新的字段 delete(updateMap, "id") // 只更新提供的字段 if len(updateMap) > 0 { if err := cfg.DB().Model(&stage).Updates(updateMap).Error; err != nil { return nil, err } } // 重新查询更新后的完整数据 if err := cfg.DB().Where("id = ?", id).First(&stage).Error; err != nil { return nil, err } return stage, nil } var _ = Router.Delete("/:project_id/:id", deleteHandle) // todo // 删除阶段 func deleteHandle(x *rest.X) (any, error) { utils.SetCORSHeaders(x) id, ok := x.Params.Get("id") if !ok { return nil, errors.New("缺少id") } var stage models.Stage if err := cfg.DB().Where("id = ?", id).First(&stage).Error; err != nil { return nil, err } // 开始事务 tx := cfg.DB().Begin() // 删除与该阶段关联的所有图形节点和连接 if err := tx.Where("stage_id = ?", id).Delete(&models.GraphNode{}).Error; err != nil { tx.Rollback() return nil, err } if err := tx.Where("stage_id = ?", id).Delete(&models.GraphLink{}).Error; err != nil { tx.Rollback() return nil, err } // 删除阶段 if err := tx.Delete(&stage).Error; err != nil { tx.Rollback() return nil, err } tx.Commit() return map[string]interface{}{ "msg": "删除成功", }, nil } var _ = Router.Any("/*", anyHandle) func anyHandle(x *rest.X) (any, error) { utils.SetCORSHeaders(x) return nil, nil }