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/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..9e2df116a73b 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 } @@ -20,9 +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), 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 41966bf77537..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" ) @@ -259,34 +260,59 @@ 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 + } + + 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{ - "code": { - SwaggerSchemaProps: spec.SwaggerSchemaProps{ - Example: 0, - }, - SchemaProps: spec.SchemaProps{ - Type: []string{swaggerTypeInteger}, - Description: methodCodeDesc, - }, - }, - "msg": { - SwaggerSchemaProps: spec.SwaggerSchemaProps{ - Example: "ok", - }, - SchemaProps: spec.SchemaProps{ - Type: []string{swaggerTypeString}, - Description: "business message", - }, - }, - "data": { + 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) {