From cf15a94a72414c1b763192c8607622c259be5f6c Mon Sep 17 00:00:00 2001 From: jaron Date: Fri, 11 Jul 2025 09:47:16 +0800 Subject: [PATCH 1/2] feat(swagger): support wrapCodeMsgMapping --- tools/goctl/api/swagger/const.go | 4 +++- tools/goctl/api/swagger/context.go | 2 ++ tools/goctl/api/swagger/swagger.go | 18 +++++++++++++++--- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/tools/goctl/api/swagger/const.go b/tools/goctl/api/swagger/const.go index 318ba56383fc..3c865889c299 100644 --- a/tools/goctl/api/swagger/const.go +++ b/tools/goctl/api/swagger/const.go @@ -57,9 +57,11 @@ const ( propertyKeyHost = "host" propertyKeyBasePath = "basePath" propertyKeyWrapCodeMsg = "wrapCodeMsg" + propertyKeyWrapCodeMsgMapping = "wrapCodeMsgMapping" propertyKeyBizCodeEnumDescription = "bizCodeEnumDescription" ) const ( - defaultValueOfPropertyUseDefinition = false + defaultValueOfPropertyUseDefinition = false + defaultValueOfPropertyWrapCodeMsgMapping = `{"code":"code", "data":"data", "msg":"msg"}` ) diff --git a/tools/goctl/api/swagger/context.go b/tools/goctl/api/swagger/context.go index a1ae909b73a8..f097948b0966 100644 --- a/tools/goctl/api/swagger/context.go +++ b/tools/goctl/api/swagger/context.go @@ -9,6 +9,7 @@ import ( type Context struct { UseDefinitions bool WrapCodeMsg bool + WrapCodeMsgMapping string BizCodeEnumDescription string } @@ -23,6 +24,7 @@ func contextFromApi(info spec.Info) Context { return Context{ UseDefinitions: getBoolFromKVOrDefault(info.Properties, propertyKeyUseDefinitions, defaultValueOfPropertyUseDefinition), WrapCodeMsg: getBoolFromKVOrDefault(info.Properties, propertyKeyWrapCodeMsg, false), + WrapCodeMsgMapping: getStringFromKVOrDefault(info.Properties, propertyKeyWrapCodeMsgMapping, defaultValueOfPropertyWrapCodeMsgMapping), BizCodeEnumDescription: getStringFromKVOrDefault(info.Properties, propertyKeyBizCodeEnumDescription, "business code"), } } diff --git a/tools/goctl/api/swagger/swagger.go b/tools/goctl/api/swagger/swagger.go index 41966bf77537..5e2e41e8f428 100644 --- a/tools/goctl/api/swagger/swagger.go +++ b/tools/goctl/api/swagger/swagger.go @@ -259,12 +259,24 @@ func wrapCodeMsgProps(ctx Context, properties spec.SchemaProps, atDoc apiSpec.At if !ctx.WrapCodeMsg { return properties } + + type WrapCodeMsgMapping struct { + Code string `json:"code"` + Data string `json:"data"` + Msg string `json:"msg"` + } + + var wrapCodeMsgMapping WrapCodeMsgMapping + if err := json.Unmarshal([]byte(ctx.WrapCodeMsgMapping), &wrapCodeMsgMapping); err != nil { + return properties + } + globalCodeDesc := ctx.BizCodeEnumDescription methodCodeDesc := getStringFromKVOrDefault(atDoc.Properties, propertyKeyBizCodeEnumDescription, globalCodeDesc) return spec.SchemaProps{ Type: []string{swaggerTypeObject}, Properties: spec.SchemaProperties{ - "code": { + wrapCodeMsgMapping.Code: { SwaggerSchemaProps: spec.SwaggerSchemaProps{ Example: 0, }, @@ -273,7 +285,7 @@ func wrapCodeMsgProps(ctx Context, properties spec.SchemaProps, atDoc apiSpec.At Description: methodCodeDesc, }, }, - "msg": { + wrapCodeMsgMapping.Msg: { SwaggerSchemaProps: spec.SwaggerSchemaProps{ Example: "ok", }, @@ -282,7 +294,7 @@ func wrapCodeMsgProps(ctx Context, properties spec.SchemaProps, atDoc apiSpec.At Description: "business message", }, }, - "data": { + wrapCodeMsgMapping.Data: { SchemaProps: properties, }, }, From abb75d74d2a5091696a543ec0d559402a52a51e1 Mon Sep 17 00:00:00 2001 From: jaron Date: Sun, 13 Jul 2025 10:35:01 +0800 Subject: [PATCH 2/2] feat(swagger): When wrapCodeMsgMapping is code or data or msg, wrapCodeMsg is ignored feat(swagger): When wrapCodeMsgMapping data is empty ugnore wrap --- tools/goctl/api/swagger/annotation.go | 11 +++++- tools/goctl/api/swagger/context.go | 12 +++++-- tools/goctl/api/swagger/swagger.go | 52 +++++++++++++++++---------- 3 files changed, 53 insertions(+), 22 deletions(-) diff --git a/tools/goctl/api/swagger/annotation.go b/tools/goctl/api/swagger/annotation.go index ad85f18b2fb8..cd2f0ef72a18 100644 --- a/tools/goctl/api/swagger/annotation.go +++ b/tools/goctl/api/swagger/annotation.go @@ -3,8 +3,9 @@ package swagger import ( "strconv" - "github.com/zeromicro/go-zero/tools/goctl/util" "google.golang.org/grpc/metadata" + + "github.com/zeromicro/go-zero/tools/goctl/util" ) func getBoolFromKVOrDefault(properties map[string]string, key string, def bool) bool { @@ -40,6 +41,14 @@ func getStringFromKVOrDefault(properties map[string]string, key string, def stri return str } +func isExist(properties map[string]string, key string) bool { + if len(properties) == 0 { + return false + } + _, ok := properties[key] + return ok +} + func getListFromInfoOrDefault(properties map[string]string, key string, def []string) []string { if len(properties) == 0 { return def diff --git a/tools/goctl/api/swagger/context.go b/tools/goctl/api/swagger/context.go index f097948b0966..9e2df116a73b 100644 --- a/tools/goctl/api/swagger/context.go +++ b/tools/goctl/api/swagger/context.go @@ -21,10 +21,18 @@ func contextFromApi(info spec.Info) Context { if len(info.Properties) == 0 { return Context{} } - return Context{ + + ctx := Context{ UseDefinitions: getBoolFromKVOrDefault(info.Properties, propertyKeyUseDefinitions, defaultValueOfPropertyUseDefinition), WrapCodeMsg: getBoolFromKVOrDefault(info.Properties, propertyKeyWrapCodeMsg, false), - WrapCodeMsgMapping: getStringFromKVOrDefault(info.Properties, propertyKeyWrapCodeMsgMapping, defaultValueOfPropertyWrapCodeMsgMapping), BizCodeEnumDescription: getStringFromKVOrDefault(info.Properties, propertyKeyBizCodeEnumDescription, "business code"), } + + if !isExist(info.Properties, propertyKeyWrapCodeMsgMapping) { + ctx.WrapCodeMsgMapping = defaultValueOfPropertyWrapCodeMsgMapping + } else { + ctx.WrapCodeMsgMapping = getStringFromKVOrDefault(info.Properties, propertyKeyWrapCodeMsgMapping, "") + } + + return ctx } diff --git a/tools/goctl/api/swagger/swagger.go b/tools/goctl/api/swagger/swagger.go index 5e2e41e8f428..870d478116fd 100644 --- a/tools/goctl/api/swagger/swagger.go +++ b/tools/goctl/api/swagger/swagger.go @@ -6,6 +6,7 @@ import ( "time" "github.com/go-openapi/spec" + apiSpec "github.com/zeromicro/go-zero/tools/goctl/api/spec" "github.com/zeromicro/go-zero/tools/goctl/internal/version" ) @@ -271,34 +272,47 @@ func wrapCodeMsgProps(ctx Context, properties spec.SchemaProps, atDoc apiSpec.At return properties } + if len(wrapCodeMsgMapping.Data) == 0 { + return properties + } + globalCodeDesc := ctx.BizCodeEnumDescription methodCodeDesc := getStringFromKVOrDefault(atDoc.Properties, propertyKeyBizCodeEnumDescription, globalCodeDesc) - return spec.SchemaProps{ + + schemaProps := spec.SchemaProps{ Type: []string{swaggerTypeObject}, Properties: spec.SchemaProperties{ - wrapCodeMsgMapping.Code: { - SwaggerSchemaProps: spec.SwaggerSchemaProps{ - Example: 0, - }, - SchemaProps: spec.SchemaProps{ - Type: []string{swaggerTypeInteger}, - Description: methodCodeDesc, - }, - }, - wrapCodeMsgMapping.Msg: { - SwaggerSchemaProps: spec.SwaggerSchemaProps{ - Example: "ok", - }, - SchemaProps: spec.SchemaProps{ - Type: []string{swaggerTypeString}, - Description: "business message", - }, - }, wrapCodeMsgMapping.Data: { SchemaProps: properties, }, }, } + + if len(wrapCodeMsgMapping.Code) > 0 { + schemaProps.Properties[wrapCodeMsgMapping.Code] = spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: methodCodeDesc, + Type: []string{swaggerTypeInteger}, + }, + SwaggerSchemaProps: spec.SwaggerSchemaProps{ + Example: 0, + }, + } + } + + if len(wrapCodeMsgMapping.Msg) > 0 { + schemaProps.Properties[wrapCodeMsgMapping.Msg] = spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "business message", + Type: []string{swaggerTypeString}, + }, + SwaggerSchemaProps: spec.SwaggerSchemaProps{ + Example: "ok", + }, + } + } + + return schemaProps } func specExtensions(api apiSpec.Info) (spec.Extensions, *spec.Info) {