122 lines
2.6 KiB
Go
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
|
|
}
|