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

153 lines
3.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package project
import (
"app/cfg"
"app/models"
"app/models/project"
"app/utils"
"encoding/json"
"errors"
"fmt"
"io"
"github.com/google/uuid"
"github.com/veypi/OneBD/rest"
"gorm.io/gorm"
)
var _ = Router.Get("/:id", getHandle)
var _ = Router.Get("", getHandle)
// 获取项目
func getHandle(x *rest.X) (any, error) {
utils.SetCORSHeaders(x)
id, ok := x.Params.Get("id")
if !ok {
// 获取所有项目
var projects []models.Project
if err := cfg.DB().Find(&projects).Error; err != nil {
return nil, err
}
return projects, nil
}
// 获取特定项目
var project models.Project
if err := cfg.DB().Where("id = ?", id).First(&project).Error; err != nil {
return nil, err
}
return project, nil
}
var _ = Router.Post("", postHandle)
// 创建项目
func postHandle(x *rest.X) (any, error) {
utils.SetCORSHeaders(x)
projectOBJ := &models.Project{}
if err := json.NewDecoder(x.Request.Body).Decode(&projectOBJ); err != nil {
return nil, err
}
projectOBJ.ID = uuid.New().String()[0:32]
if err := cfg.DB().Create(&projectOBJ).Error; err != nil {
return nil, err
}
// 创建根需求节点确保使用project.ID
demandOBJ := &project.Demand{
Tree: models.Tree{
Name: "root",
ParentID: "",
Level: 0,
},
DocID: "",
ProjectID: projectOBJ.ID,
Description: "项目根需求节点",
}
if err := cfg.DB().Create(demandOBJ).Error; err != nil {
return nil, err
}
return projectOBJ, nil
}
var _ = Router.Patch("/:id", patchHandle)
// 更新项目
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 project models.Project
if err := cfg.DB().Where("id = ?", id).First(&project).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(&project).Updates(updateMap).Error; err != nil {
return nil, err
}
}
// 重新查询更新后的完整数据
if err := cfg.DB().Where("id = ?", id).First(&project).Error; err != nil {
return nil, err
}
return project, nil
}
var _ = Router.Delete("/:id", deleteHandle)
// 删除项目
func deleteHandle(x *rest.X) (any, error) {
utils.SetCORSHeaders(x)
id, ok := x.Params.Get("id")
if !ok {
return nil, errors.New("缺少id")
}
var project models.Project
if err := cfg.DB().Where("id = ?", id).First(&project).Error; err != nil {
return nil, err
}
// 删除项目
if err := cfg.DB().Delete(&project).Error; err != nil {
return nil, err
}
return map[string]interface{}{
"msg": "删除成功",
}, nil
}
var _ = Router.Any("/*", anyHandle)
func anyHandle(x *rest.X) (any, error) {
utils.SetCORSHeaders(x)
return nil, nil
}