Skip to content

Commit

Permalink
fenollp changes
Browse files Browse the repository at this point in the history
  • Loading branch information
francis-lennon-whs committed Oct 22, 2020
1 parent cbf3096 commit 24f9fcd
Showing 1 changed file with 45 additions and 47 deletions.
92 changes: 45 additions & 47 deletions openapi2conv/openapi2_conv.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/getkin/kin-openapi/openapi2"
"github.com/getkin/kin-openapi/openapi3"
"net/url"
"regexp"
"strings"

"github.com/getkin/kin-openapi/openapi2"
"github.com/getkin/kin-openapi/openapi3"
)

// ToV3Swagger converts an OpenAPIv2 spec to an OpenAPIv3 spec
Expand Down Expand Up @@ -42,7 +42,7 @@ func ToV3Swagger(swagger *openapi2.Swagger) (*openapi3.Swagger, error) {
}

result.Components.Schemas = make(map[string]*openapi3.SchemaRef)
if parameters := swagger.Parameters; parameters != nil {
if parameters := swagger.Parameters; len(parameters) != 0 {
result.Components.Parameters = make(map[string]*openapi3.ParameterRef)
result.Components.RequestBodies = make(map[string]*openapi3.RequestBodyRef)
for k, parameter := range parameters {
Expand All @@ -62,7 +62,7 @@ func ToV3Swagger(swagger *openapi2.Swagger) (*openapi3.Swagger, error) {
}
}

if paths := swagger.Paths; paths != nil {
if paths := swagger.Paths; len(paths) != 0 {
resultPaths := make(map[string]*openapi3.PathItem, len(paths))
for path, pathItem := range paths {
r, err := ToV3PathItem(swagger, &result.Components, pathItem)
Expand All @@ -74,7 +74,7 @@ func ToV3Swagger(swagger *openapi2.Swagger) (*openapi3.Swagger, error) {
result.Paths = resultPaths
}

if responses := swagger.Responses; responses != nil {
if responses := swagger.Responses; len(responses) != 0 {
result.Components.Responses = make(map[string]*openapi3.ResponseRef, len(responses))
for k, response := range responses {
r, err := ToV3Response(response)
Expand All @@ -89,7 +89,7 @@ func ToV3Swagger(swagger *openapi2.Swagger) (*openapi3.Swagger, error) {
result.Components.Schemas[key] = schema
}

if m := swagger.SecurityDefinitions; m != nil {
if m := swagger.SecurityDefinitions; len(m) != 0 {
resultSecuritySchemes := make(map[string]*openapi3.SecuritySchemeRef)
for k, v := range m {
r, err := ToV3SecurityScheme(v)
Expand Down Expand Up @@ -128,8 +128,10 @@ func ToV3PathItem(swagger *openapi2.Swagger, components *openapi3.Components, pa
switch {
case err != nil:
return nil, err
case v3RequestBody != nil || v3Schema != nil:
case v3RequestBody != nil:
return nil, errors.New("pathItem must not have a body parameter")
case v3Schema != nil:
return nil, errors.New("pathItem must not have a schema parameter")
default:
result.Parameters = append(result.Parameters, v3Parameter)
}
Expand Down Expand Up @@ -191,22 +193,26 @@ func ToV3Operation(swagger *openapi2.Swagger, components *openapi3.Components, p
}

func getParameterNameFromOldRef(ref string) string {
re := regexp.MustCompile(`#\/parameters\/(.+)\/?.*`)
return re.ReplaceAllString(ref, "$1")
cleanPath := strings.TrimPrefix(ref, "#/parameters/")
pathSections := strings.Split(cleanPath, "/")

return pathSections[0]
}

func ToV3Parameter(components *openapi3.Components, parameter *openapi2.Parameter) (*openapi3.ParameterRef, *openapi3.RequestBodyRef, map[string]*openapi3.SchemaRef, error) {
if ref := parameter.Ref; ref != "" {
if strings.HasPrefix(ref, "#/parameters/") {
name := getParameterNameFromOldRef(ref)
if _, ok := components.RequestBodies[name]; ok {
return nil, &openapi3.RequestBodyRef{Ref: strings.Replace(ref, "#/parameters/", "#/components/requestBodies/", 1)}, nil, nil
v3Ref := strings.Replace(ref, "#/parameters/", "#/components/requestBodies/", 1)
return nil, &openapi3.RequestBodyRef{Ref: v3Ref}, nil, nil
} else if schema, ok := components.Schemas[name]; ok {
schemaRefMap := make(map[string]*openapi3.SchemaRef)
if val, ok := schema.Value.Extensions["x-formData-name"]; ok {
name = val.(string)
}
schemaRefMap[name] = &openapi3.SchemaRef{Ref: strings.Replace(ref, "#/parameters/", "#/components/schemas/", 1)}
v3Ref := strings.Replace(ref, "#/parameters/", "#/components/schemas/", 1)
schemaRefMap[name] = &openapi3.SchemaRef{Ref: v3Ref}
return nil, nil, schemaRefMap, nil
}
}
Expand Down Expand Up @@ -240,9 +246,9 @@ func ToV3Parameter(components *openapi3.Components, parameter *openapi2.Paramete
parameter.ExtensionProps.Extensions = make(map[string]interface{})
}
parameter.ExtensionProps.Extensions["x-formData-name"] = parameter.Name
required := []string{}
if parameter.Required == true {
required = append(required, parameter.Name)
var required = []string{}
if parameter.Required {
required = []string{parameter.Name}
}
schemaRef := &openapi3.SchemaRef{
Value: &openapi3.Schema{
Expand Down Expand Up @@ -332,14 +338,18 @@ func formDataBody(bodies map[string]*openapi3.SchemaRef, reqs map[string]bool) *
}

func getParameterNameFromNewRef(ref string) string {
re := regexp.MustCompile(`#\/components\/schemas\/(.+)\/?.*`)
return re.ReplaceAllString(ref, "$1")
cleanPath := strings.TrimPrefix(ref, "#/components/schemas/")
pathSections := strings.Split(cleanPath, "/")

return pathSections[0]
}

func onlyOneReqBodyParam(bodies []*openapi3.RequestBodyRef, formDataSchemas map[string]*openapi3.SchemaRef, components *openapi3.Components) (*openapi3.RequestBodyRef, error) {
if len(bodies) > 1 {
return nil, errors.New("multiple body parameters cannot exist for the same operation")
} else if len(bodies) != 0 && len(formDataSchemas) != 0 {
}

if len(bodies) != 0 && len(formDataSchemas) != 0 {
return nil, errors.New("body and form parameters cannot exist together for the same operation")
}

Expand Down Expand Up @@ -593,11 +603,11 @@ func FromV3Swagger(swagger *openapi3.Swagger) (*openapi2.Swagger, error) {

for name, requestBody := range swagger.Components.RequestBodies {
parameters := FromV3RequestBodyFormData(requestBody)
if len(parameters) > 0 {
for _, param := range parameters {
result.Parameters[param.Name] = param
}
} else {
for _, param := range parameters {
result.Parameters[param.Name] = param
}

if len(parameters) == 0 {
paramName := name
if requestBody.Value != nil {
if originalName, ok := requestBody.Value.Extensions["x-originalParamName"]; ok {
Expand Down Expand Up @@ -650,9 +660,8 @@ func FromV3SchemaRef(schema *openapi3.SchemaRef, components *openapi3.Components
name := getParameterNameFromNewRef(ref)
if val, ok := components.Schemas[name]; ok {
if val.Value.Format == "binary" {
return nil, &openapi2.Parameter{
Ref: strings.Replace(ref, "#/components/schemas/", "#/parameters/", 1),
}
v2Ref := strings.Replace(ref, "#/components/schemas/", "#/parameters/", 1)
return nil, &openapi2.Parameter{Ref: v2Ref}
}
}

Expand Down Expand Up @@ -700,20 +709,16 @@ func FromV3SchemaRef(schema *openapi3.SchemaRef, components *openapi3.Components
}
}
if v := schema.Value.Items; v != nil {
schemaV2, _ := FromV3SchemaRef(v, components)
schema.Value.Items = schemaV2
schema.Value.Items, _ = FromV3SchemaRef(v, components)
}
for k, v := range schema.Value.Properties {
schemaV2, _ := FromV3SchemaRef(v, components)
schema.Value.Properties[k] = schemaV2
schema.Value.Properties[k], _ = FromV3SchemaRef(v, components)
}
if v := schema.Value.AdditionalProperties; v != nil {
schemaV2, _ := FromV3SchemaRef(v, components)
schema.Value.AdditionalProperties = schemaV2
schema.Value.AdditionalProperties, _ = FromV3SchemaRef(v, components)
}
for i, v := range schema.Value.AllOf {
schemaV2, _ := FromV3SchemaRef(v, components)
schema.Value.AllOf[i] = schemaV2
schema.Value.AllOf[i], _ = FromV3SchemaRef(v, components)
}
return schema, nil
}
Expand Down Expand Up @@ -773,9 +778,8 @@ func FromV3RequestBodyFormData(requestBodyRef *openapi3.RequestBodyRef) openapi2
parameters := openapi2.Parameters{}
for propName, schemaRef := range mediaType.Schema.Value.Properties {
if ref := schemaRef.Ref; ref != "" {
parameters = append(parameters, &openapi2.Parameter{
Ref: strings.Replace(ref, "#/components/schemas/", "#/parameters/", 1),
})
v2Ref := strings.Replace(ref, "#/components/schemas/", "#/parameters/", 1)
parameters = append(parameters, &openapi2.Parameter{Ref: v2Ref})
continue
}
val := schemaRef.Value
Expand Down Expand Up @@ -850,10 +854,8 @@ func FromV3Operation(swagger *openapi3.Swagger, operation *openapi3.Operation) (
} else {
// Find parameter name that we can use for the body
name := findNameForRequestBody(operation)

// If found an available name
if name == "" {
return nil, errors.New("Could not find a name for request body")
return nil, errors.New("could not find a name for request body")
}
r, err := FromV3RequestBody(swagger, name, v)
if err != nil {
Expand All @@ -863,15 +865,12 @@ func FromV3Operation(swagger *openapi3.Swagger, operation *openapi3.Operation) (
}
}

consumesFormData := false
for _, param := range result.Parameters {
if param.Type == "file" {
consumesFormData = true
result.Consumes = append(result.Consumes, "multipart/form-data")
break
}
}
if consumesFormData {
result.Consumes = append(result.Consumes, "multipart/form-data")
}

if responses := operation.Responses; responses != nil {
resultResponses, err := FromV3Responses(responses, &swagger.Components)
Expand Down Expand Up @@ -901,8 +900,7 @@ func FromV3RequestBody(swagger *openapi3.Swagger, name string, requestBodyRef *o
// Assuming JSON
mediaType := requestBody.GetMediaType("application/json")
if mediaType != nil {
schema, _ := FromV3SchemaRef(mediaType.Schema, &swagger.Components)
result.Schema = schema
result.Schema, _ = FromV3SchemaRef(mediaType.Schema, &swagger.Components)
}
return result, nil
}
Expand Down

0 comments on commit 24f9fcd

Please sign in to comment.