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

122 lines
2.6 KiB
Go

package graph
import (
"app/cfg"
"app/models"
"app/utils"
"errors"
"fmt"
"github.com/veypi/OneBD/rest"
)
var _ = Router.Get("", getHandle)
var _ = Router.Get("/:stage_id/", getHandle)
// getHandle 获取完整的图形数据,包括节点和连接
func getHandle(x *rest.X) (any, error) {
utils.SetCORSHeaders(x)
stageID, ok := x.Params.Get("stage_id")
if !ok {
return nil, errors.New("缺少stage_id")
}
// 验证阶段是否存在
var stage models.Stage
if err := cfg.DB().Where("id = ?", stageID).First(&stage).Error; err != nil {
return nil, errors.New("阶段不存在")
}
// 获取该阶段的所有节点
var nodes []models.GraphNode
if err := cfg.DB().Where("stage_id = ?", stageID).Find(&nodes).Error; err != nil {
return nil, err
}
// 获取该阶段的所有连接
var links []models.GraphLink
if err := cfg.DB().Where("stage_id = ?", stageID).Find(&links).Error; err != nil {
return nil, err
}
// 返回完整的图形数据
return map[string]interface{}{
"stage": stage,
"nodes": nodes,
"links": links,
}, nil
}
var _ = Router.Post("/:stage_id/", saveHandle)
func saveHandle(x *rest.X) (any, error) {
utils.SetCORSHeaders(x)
fmt.Println("saveHandle")
stageID, ok := x.Params.Get("stage_id")
if !ok {
return nil, errors.New("缺少stage_id")
}
// 验证阶段是否存在
var stage models.Stage
if err := cfg.DB().Where("id = ?", stageID).First(&stage).Error; err != nil {
return nil, errors.New("阶段不存在")
}
// 解析请求体
var data struct {
Nodes []models.GraphNode `json:"nodes"`
Links []models.GraphLink `json:"links"`
}
if err := x.Parse(&data); err != nil {
return nil, err
}
// fmt.Printf("%+v\n", data)
// 开始事务
tx := cfg.DB().Begin()
// 删除原有的节点和连接
if err := tx.Where("stage_id = ?", stageID).Delete(&models.GraphNode{}).Error; err != nil {
tx.Rollback()
return nil, err
}
if err := tx.Where("stage_id = ?", stageID).Delete(&models.GraphLink{}).Error; err != nil {
tx.Rollback()
return nil, err
}
// 保存新的节点和连接
for _, node := range data.Nodes {
node.StageID = stageID
if err := tx.Create(&node).Error; err != nil {
tx.Rollback()
return nil, err
}
}
for _, link := range data.Links {
link.StageID = stageID
if err := tx.Create(&link).Error; err != nil {
tx.Rollback()
return nil, err
}
}
// 提交事务
if err := tx.Commit().Error; err != nil {
return nil, err
}
return map[string]interface{}{
"message": "保存成功",
}, nil
}
var _ = Router.Any("/*", anyHandle)
// anyHandle 处理其他请求
func anyHandle(x *rest.X) (any, error) {
utils.SetCORSHeaders(x)
return nil, nil
}