diff --git a/tools/goctl/api/swagger/const.go b/tools/goctl/api/swagger/const.go index e965d52b4..318ba5638 100644 --- a/tools/goctl/api/swagger/const.go +++ b/tools/goctl/api/swagger/const.go @@ -49,6 +49,7 @@ const ( propertyKeySchemes = "schemes" propertyKeyTags = "tags" propertyKeySummary = "summary" + propertyKeyGroup = "group" propertyKeyOperationId = "operationId" propertyKeyDeprecated = "deprecated" propertyKeyPrefix = "prefix" diff --git a/tools/goctl/api/swagger/example/example_cn.api b/tools/goctl/api/swagger/example/example_cn.api index f7e632b85..f48168c68 100644 --- a/tools/goctl/api/swagger/example/example_cn.api +++ b/tools/goctl/api/swagger/example/example_cn.api @@ -49,6 +49,7 @@ type ( summary: "query 类型接口集合" // 对应 swagger 的 summary prefix: v1 authType: apiKey // 指定该路由使用的鉴权类型,值为 securityDefinitionsFromJson 中定义的名称 + group:"demo" ) service Swagger { @doc ( diff --git a/tools/goctl/api/swagger/parameter.go b/tools/goctl/api/swagger/parameter.go index 1566a8940..2f5970535 100644 --- a/tools/goctl/api/swagger/parameter.go +++ b/tools/goctl/api/swagger/parameter.go @@ -34,23 +34,6 @@ func parametersFromType(ctx Context, method string, tp apiSpec.Type) []spec.Para if !ok { return []spec.Parameter{} } - structName, ok := isPostJson(ctx, method, tp) - if ok { - return []spec.Parameter{ - { - ParamProps: spec.ParamProps{ - In: paramsInBody, - Name: paramsInBody, - Required: true, - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Ref: spec.MustCreateRef(getRefName(structName)), - }, - }, - }, - }, - } - } var ( resp []spec.Parameter @@ -197,20 +180,38 @@ func parametersFromType(ctx Context, method string, tp apiSpec.Type) []spec.Para } }) if len(properties) > 0 { - resp = append(resp, spec.Parameter{ - ParamProps: spec.ParamProps{ - In: paramsInBody, - Name: paramsInBody, - Required: true, - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: typeFromGoType(ctx, structType), - Properties: properties, - Required: requiredFields, + if ctx.UseDefinitions { + structName, ok := isPostJson(ctx, method, tp) + if ok { + resp = append(resp, spec.Parameter{ + ParamProps: spec.ParamProps{ + In: paramsInBody, + Name: paramsInBody, + Required: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: spec.MustCreateRef(getRefName(structName)), + }, + }, + }, + }) + } + } else { + resp = append(resp, spec.Parameter{ + ParamProps: spec.ParamProps{ + In: paramsInBody, + Name: paramsInBody, + Required: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: typeFromGoType(ctx, structType), + Properties: properties, + Required: requiredFields, + }, }, }, - }, - }) + }) + } } return resp } diff --git a/tools/goctl/api/swagger/path.go b/tools/goctl/api/swagger/path.go index 545b25541..f76134c0d 100644 --- a/tools/goctl/api/swagger/path.go +++ b/tools/goctl/api/swagger/path.go @@ -7,6 +7,7 @@ import ( "github.com/go-openapi/spec" apiSpec "github.com/zeromicro/go-zero/tools/goctl/api/spec" + "github.com/zeromicro/go-zero/tools/goctl/util/stringx" ) func spec2Paths(ctx Context, srv apiSpec.Service) *spec.Paths { @@ -70,6 +71,12 @@ func spec2Path(ctx Context, group apiSpec.Group, route apiSpec.Route) spec.PathI }, } } + groupName := getStringFromKVOrDefault(group.Annotation.Properties, propertyKeyGroup, "") + operationId := route.Handler + if len(groupName) > 0 { + operationId = stringx.From(groupName + "_" + route.Handler).ToCamel() + } + operationId = stringx.From(operationId).Untitle() op := &spec.Operation{ OperationProps: spec.OperationProps{ Description: getStringFromKVOrDefault(route.AtDoc.Properties, propertyKeyDescription, ""), @@ -78,10 +85,10 @@ func spec2Path(ctx Context, group apiSpec.Group, route apiSpec.Route) spec.PathI Schemes: getListFromInfoOrDefault(route.AtDoc.Properties, propertyKeySchemes, []string{schemeHttps}), Tags: getListFromInfoOrDefault(group.Annotation.Properties, propertyKeyTags, getListFromInfoOrDefault(group.Annotation.Properties, propertyKeySummary, []string{})), Summary: getStringFromKVOrDefault(route.AtDoc.Properties, propertyKeySummary, getFirstUsableString(route.AtDoc.Text, route.Handler)), - ID: getStringFromKVOrDefault(route.AtDoc.Properties, propertyKeyOperationId, getFirstUsableString(route.AtDoc.Text, route.Handler)), + ID: operationId, Deprecated: getBoolFromKVOrDefault(route.AtDoc.Properties, propertyKeyDeprecated, false), - Security: security, Parameters: parametersFromType(ctx, route.Method, route.RequestType), + Security: security, Responses: jsonResponseFromType(ctx, route.AtDoc, route.ResponseType), }, } diff --git a/tools/goctl/api/swagger/properties.go b/tools/goctl/api/swagger/properties.go index 74d6c00c0..e5bf6d204 100644 --- a/tools/goctl/api/swagger/properties.go +++ b/tools/goctl/api/swagger/properties.go @@ -24,6 +24,19 @@ func propertiesFromType(ctx Context, tp apiSpec.Type) (spec.SchemaProperties, [] example, defaultValue any enum []any ) + pathTag, _ := tag.Get(tagPath) + if pathTag != nil { + return + } + formTag, _ := tag.Get(tagForm) + if formTag != nil { + return + } + headerTag, _ := tag.Get(tagHeader) + if headerTag != nil { + return + } + jsonTag, _ := tag.Get(tagJson) if jsonTag != nil { jsonTagString = jsonTag.Name