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) 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.Output, spec.Auth, spec.Tags...) } } }