172 lines
3.6 KiB
Go
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
|
|
}
|