diff --git a/swagger/run.go b/swagger/run.go index a352d82..2e92437 100644 --- a/swagger/run.go +++ b/swagger/run.go @@ -217,7 +217,7 @@ func generateParameterDefinitions(swaggerInfo *define.Swagger, uri string, paren } swaggerInfo.Definitions[parentPath].Type = "object" if paramConfig.Required { - swaggerInfo.Definitions[parentPath].Required = append(swaggerInfo.Definitions[parentPath].Required, paramConfig.Name) + swaggerInfo.Definitions[parentPath].Required = append(swaggerInfo.Definitions[parentPath].Required, subPath) } swaggerInfo.Definitions[parentPath].Properties[subPath] = &define.SwaggerDefinitionProperty{ Description: paramConfig.Description, @@ -246,7 +246,7 @@ func generateParameterDefinitions(swaggerInfo *define.Swagger, uri string, paren } } else { if subPathArr[0] == "[]" { - generateParameterDefinitions(swaggerInfo, uri, parentPath+".[]", strings.Join(subPathArr[1:], "."), paramConfig) + generateParameterDefinitions(swaggerInfo, uri, parentPath+".item", strings.Join(subPathArr[1:], "."), paramConfig) return } else { swaggerInfo.Definitions[parentPath].Properties[subPathArr[0]] = &define.SwaggerDefinitionProperty{ @@ -259,7 +259,7 @@ func generateParameterDefinitions(swaggerInfo *define.Swagger, uri string, paren } storageSubPath := parentPath + "." + subPathArr[0] if subPathArr[1] == "[]" { - storageSubPath += ".[]" + storageSubPath += ".item" } if _, exist := swaggerInfo.Definitions[storageSubPath]; !exist { swaggerInfo.Definitions[storageSubPath] = &define.SwaggerDefinition{ @@ -280,6 +280,18 @@ func generateParameterDefinitions(swaggerInfo *define.Swagger, uri string, paren } if _, exist := swaggerInfo.Definitions[parentPath].Properties[subPathArr[0]]; !exist { + if subPathArr[1] == "[]" { + nextParentPath := parentPath + "." + subPathArr[0] + ".item" + swaggerInfo.Definitions[parentPath].Properties[subPathArr[0]] = &define.SwaggerDefinitionProperty{ + Description: "参数描述", + Type: "array", + Items: map[string]string{ + "$ref": "#/definitions/" + nextParentPath, + }, + } + generateParameterDefinitions(swaggerInfo, uri, nextParentPath, strings.Join(subPathArr[2:], "."), paramConfig) + return + } itemSwaggerDefinition := &define.SwaggerDefinitionProperty{ Description: "对象描述", Type: wrapper.TernaryOperator.String(subPathArr[1] == "[]", "array", "object").Value(), @@ -293,7 +305,7 @@ func generateParameterDefinitions(swaggerInfo *define.Swagger, uri string, paren } else if itemSwaggerDefinition.Type == "array" { itemSwaggerDefinition.Description = "数组描述" itemSwaggerDefinition.Items = map[string]string{ - "$ref": "#/definitions/" + parentPath + "." + subPathArr[0] + ".[]", + "$ref": "#/definitions/" + parentPath + "." + subPathArr[0] + ".item", } } swaggerInfo.Definitions[parentPath].Properties[subPathArr[0]] = itemSwaggerDefinition @@ -308,25 +320,40 @@ func generateParameterDefinitions(swaggerInfo *define.Swagger, uri string, paren // // Date : 18:28 2024/4/22 func generateResponseDefinitions(swaggerInfo *define.Swagger, uri string, parentPath string, subPath string, responseConfig *define.SwaggerResponseItemInput) { + uri = strings.TrimLeft(uri, "/") + parentPath = strings.TrimLeft(parentPath, "/") if nil == swaggerInfo.Definitions { swaggerInfo.Definitions = map[string]*define.SwaggerDefinition{} } + parentPathArr := strings.Split(parentPath, ".") + checkPath := parentPath + if len(parentPathArr) >= 2 { + checkPath = strings.Join([]string{parentPathArr[0], parentPathArr[1]}, ".") + } subPathArr := strings.Split(subPath, ".") - if _, exist := swaggerInfo.Definitions[parentPath]; !exist && len(parentPath) > 0 { - swaggerInfo.Definitions[parentPath] = &define.SwaggerDefinition{ + if _, exist := swaggerInfo.Definitions[checkPath]; !exist && len(parentPath) > 0 { + swaggerInfo.Definitions[checkPath] = &define.SwaggerDefinition{ Type: "object", Required: make([]string, 0), Properties: make(map[string]*define.SwaggerDefinitionProperty), } } + if len(subPathArr) == 1 { - if len(parentPath) == 0 { - return + if _, exist := swaggerInfo.Definitions[parentPath]; !exist { + swaggerInfo.Definitions[parentPath] = &define.SwaggerDefinition{ + Type: "object", + Required: make([]string, 0), + Properties: make(map[string]*define.SwaggerDefinitionProperty), + } } - // swaggerInfo.Definitions[parentPath].Type = responseConfig.Type - swaggerInfo.Definitions[parentPath].Properties[responseConfig.Field] = &define.SwaggerDefinitionProperty{ + swaggerInfo.Definitions[parentPath].Type = "object" + if responseConfig.IsRequired { + swaggerInfo.Definitions[parentPath].Required = append(swaggerInfo.Definitions[parentPath].Required, subPath) + } + swaggerInfo.Definitions[parentPath].Properties[subPath] = &define.SwaggerDefinitionProperty{ Description: responseConfig.Description, - Type: responseConfig.Type, + Type: util.GetSwaggerType(responseConfig.Type), } return } @@ -334,16 +361,81 @@ func generateResponseDefinitions(swaggerInfo *define.Swagger, uri string, parent parentPath = uri + ".output" } if len(subPathArr) == 2 { + if _, exist := swaggerInfo.Definitions[parentPath]; !exist { + swaggerInfo.Definitions[parentPath] = &define.SwaggerDefinition{ + Type: "object", + Required: make([]string, 0), + Properties: make(map[string]*define.SwaggerDefinitionProperty), + } + } if subPathArr[1] == "[]" { swaggerInfo.Definitions[parentPath].Properties[subPathArr[0]] = &define.SwaggerDefinitionProperty{ Description: responseConfig.Description, Type: "array", + Items: map[string]string{ + "type": util.GetSwaggerType(responseConfig.Type), + }, } } else { - generateResponseDefinitions(swaggerInfo, uri, parentPath+"."+subPathArr[0], strings.Join(subPathArr[1:], "."), responseConfig) + if subPathArr[0] == "[]" { + generateResponseDefinitions(swaggerInfo, uri, parentPath+".item", strings.Join(subPathArr[1:], "."), responseConfig) + return + } else { + swaggerInfo.Definitions[parentPath].Properties[subPathArr[0]] = &define.SwaggerDefinitionProperty{ + Description: "返回值描述", + Type: "object", + AllOf: []map[string]string{map[string]string{ + "$ref": "#/definitions/" + parentPath + "." + subPathArr[0], + }}, + } + } + storageSubPath := parentPath + "." + subPathArr[0] + if subPathArr[1] == "[]" { + storageSubPath += ".item" + } + if _, exist := swaggerInfo.Definitions[storageSubPath]; !exist { + swaggerInfo.Definitions[storageSubPath] = &define.SwaggerDefinition{ + Type: wrapper.TernaryOperator.String(strings.HasSuffix(parentPath, "[]"), "array", "object").Value(), + Required: make([]string, 0), + Properties: make(map[string]*define.SwaggerDefinitionProperty), + } + } + if responseConfig.IsRequired { + swaggerInfo.Definitions[storageSubPath].Required = append(swaggerInfo.Definitions[storageSubPath].Required, subPathArr[1]) + } + swaggerInfo.Definitions[storageSubPath].Properties[subPathArr[1]] = &define.SwaggerDefinitionProperty{ + Description: responseConfig.Description, + Type: util.GetSwaggerType(responseConfig.Type), + } } return } + + if _, exist := swaggerInfo.Definitions[parentPath].Properties[subPathArr[0]]; !exist { + if subPathArr[1] == "[]" { + nextParentPath := parentPath + "." + subPathArr[0] + ".item" + generateResponseDefinitions(swaggerInfo, uri, nextParentPath, strings.Join(subPathArr[2:], "."), responseConfig) + return + } + itemSwaggerDefinition := &define.SwaggerDefinitionProperty{ + Description: "对象描述", + Type: wrapper.TernaryOperator.String(subPathArr[1] == "[]", "array", "object").Value(), + Items: nil, + AllOf: nil, + } + if itemSwaggerDefinition.Type == "object" { + itemSwaggerDefinition.AllOf = []map[string]string{map[string]string{ + "$ref": "#/definitions/" + parentPath + "." + subPathArr[0], + }} + } else if itemSwaggerDefinition.Type == "array" { + itemSwaggerDefinition.Description = "数组描述" + itemSwaggerDefinition.Items = map[string]string{ + "$ref": "#/definitions/" + parentPath + "." + subPathArr[0] + ".item", + } + } + swaggerInfo.Definitions[parentPath].Properties[subPathArr[0]] = itemSwaggerDefinition + } + // fmt.Println(parentPath + "." + subPathArr[0]) generateResponseDefinitions(swaggerInfo, uri, parentPath+"."+subPathArr[0], strings.Join(subPathArr[1:], "."), responseConfig) } diff --git a/swagger/run_test.go b/swagger/run_test.go index bfb4980..730d3a3 100644 --- a/swagger/run_test.go +++ b/swagger/run_test.go @@ -121,6 +121,12 @@ func TestGenerate(t *testing.T) { Field: "nick_name", IsRequired: false, }, + &define.SwaggerResponseItemInput{ + Type: consts.DataTypeString, + Description: "昵称", + Field: "person.nick_name", + IsRequired: false, + }, }, }, },