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

171 lines
3.6 KiB
Go

package endpoint
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("/: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 endpoints []models.Endpoint
if err := cfg.DB().Find(&endpoints).Error; err != nil {
return nil, err
}
return endpoints, nil
}
// 获取特定接口
var endpoint models.Endpoint
if err := cfg.DB().Where("id = ?", id).First(&endpoint).Error; err != nil {
return nil, err
}
// 获取接口的参数和响应
var parameters []models.Parameter
if err := cfg.DB().Where("endpoint_id = ?", endpoint.ID).Find(&parameters).Error; err != nil {
return nil, err
}
var responses []models.Response
if err := cfg.DB().Where("endpoint_id = ?", endpoint.ID).Find(&responses).Error; err != nil {
return nil, err
}
return map[string]interface{}{
"endpoint": endpoint,
"parameters": parameters,
"responses": responses,
}, nil
}
var _ = Router.Post("", postHandle)
// 创建接口
func postHandle(x *rest.X) (any, error) {
utils.SetCORSHeaders(x)
endpoint := &models.Endpoint{}
if err := json.NewDecoder(x.Request.Body).Decode(&endpoint); err != nil {
return nil, err
}
endpoint.ID = uuid.New().String()[0:32]
if err := cfg.DB().Create(&endpoint).Error; err != nil {
return nil, err
}
return endpoint, 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 endpoint models.Endpoint
if err := cfg.DB().Where("id = ?", id).First(&endpoint).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(&endpoint).Updates(updateMap).Error; err != nil {
return nil, err
}
}
// 重新查询更新后的完整数据
if err := cfg.DB().Where("id = ?", id).First(&endpoint).Error; err != nil {
return nil, err
}
return endpoint, 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 endpoint models.Endpoint
if err := cfg.DB().Where("id = ?", id).First(&endpoint).Error; err != nil {
return nil, err
}
// 开始事务
tx := cfg.DB().Begin()
// 删除关联的参数
if err := tx.Where("endpoint_id = ?", id).Delete(&models.Parameter{}).Error; err != nil {
tx.Rollback()
return nil, err
}
// 删除关联的响应
if err := tx.Where("endpoint_id = ?", id).Delete(&models.Response{}).Error; err != nil {
tx.Rollback()
return nil, err
}
// 删除接口
if err := tx.Delete(&endpoint).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
}