testFlow/api/stage/handler.go
Wyle.Gong-巩文昕 67b0ad2723 init
2025-04-22 16:42:48 +08:00

172 lines
3.6 KiB
Go

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
}