153 lines
3.2 KiB
Go
153 lines
3.2 KiB
Go
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
|
||
}
|