171 lines
3.6 KiB
Go
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(¶meters).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
|
|
}
|