Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
- 新增 DELETE /api/admin/roles/:role_id/permissions 接口 - Store 层新增 BatchDelete 方法,单次 SQL 批量软删除 - Service 层新增 BatchRemovePermissions 方法 - Handler 层新增 BatchRemovePermissions 处理函数 - DTO 新增 BatchRemovePermissionsRequest/Params - 修复 openapi generator 对 DELETE 方法 requestBody 不生成的问题 - RouteSpec 新增 Body 字段,支持显式指定 JSON 请求体 💘 Generated with Crush Assisted-by: Claude Sonnet 4.6 via Crush <crush@charm.land>
62 lines
2.3 KiB
Go
62 lines
2.3 KiB
Go
package routes
|
||
|
||
import (
|
||
"regexp"
|
||
|
||
"github.com/gofiber/fiber/v2"
|
||
|
||
"github.com/break/junhong_cmp_fiber/pkg/openapi"
|
||
)
|
||
|
||
// FileUploadField 定义文件上传字段
|
||
type FileUploadField struct {
|
||
Name string // 字段名
|
||
Description string // 字段描述
|
||
Required bool // 是否必填
|
||
}
|
||
|
||
// RouteSpec 定义接口文档元数据
|
||
type RouteSpec struct {
|
||
Summary string // 简短摘要(中文,一行)
|
||
Description string // 详细说明,支持 Markdown 语法(可选)
|
||
Input interface{} // 请求参数结构体 (Query/Path/Body)
|
||
Body interface{} // 显式 JSON 请求体(用于 DELETE 等方法,库不自动生成 requestBody 的场景)
|
||
Output interface{} // 响应参数结构体
|
||
Tags []string // 分类标签
|
||
Auth bool // 是否需要认证图标 (预留)
|
||
FileUploads []FileUploadField // 文件上传字段列表(设置此字段时请求类型为 multipart/form-data)
|
||
}
|
||
|
||
// pathParamRegex 用于匹配 Fiber 的路径参数格式 /:param
|
||
var pathParamRegex = regexp.MustCompile(`/:([a-zA-Z0-9_]+)`)
|
||
|
||
// Register 封装后的注册函数
|
||
// router: Fiber 路由组
|
||
// doc: 文档生成器 (如果在运行 Web 服务时为 nil,在生成文档时为非 nil)
|
||
// basePath: 当前路由组的基础路径 (用于文档生成)
|
||
// method, path: HTTP 方法和路径
|
||
// handler: Fiber Handler
|
||
// spec: 文档元数据
|
||
func Register(router fiber.Router, doc *openapi.Generator, basePath, method, path string, handler fiber.Handler, spec RouteSpec) {
|
||
router.Add(method, path, handler)
|
||
|
||
if doc != nil {
|
||
fullPath := basePath + path
|
||
openapiPath := pathParamRegex.ReplaceAllString(fullPath, "/{$1}")
|
||
|
||
if len(spec.FileUploads) > 0 {
|
||
fileFields := make([]openapi.FileUploadField, len(spec.FileUploads))
|
||
for i, f := range spec.FileUploads {
|
||
fileFields[i] = openapi.FileUploadField{
|
||
Name: f.Name,
|
||
Description: f.Description,
|
||
Required: f.Required,
|
||
}
|
||
}
|
||
doc.AddMultipartOperation(method, openapiPath, spec.Summary, spec.Description, spec.Input, spec.Output, spec.Auth, fileFields, spec.Tags...)
|
||
} else {
|
||
doc.AddOperation(method, openapiPath, spec.Summary, spec.Description, spec.Input, spec.Body, spec.Output, spec.Auth, spec.Tags...)
|
||
}
|
||
}
|
||
}
|