diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java index c0fa1f667e2..1c79ee3b1de 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java @@ -69,6 +69,9 @@ public class CodegenConstants { public static final String WITH_GO_CODEGEN_COMMENT = "withGoCodegenComment"; public static final String WITH_GO_CODEGEN_COMMENT_DESC = "whether to include Go codegen comment to disable Go Lint and collapse by default GitHub in PRs and diffs"; + public static final String WITH_AWSV4_SIGNATURE_COMMENT = "withAWSV4Signature"; + public static final String WITH_AWSV4_SIGNATURE_COMMENT_DESC = "whether to include AWS v4 signature support"; + public static final String IS_GO_SUBMODULE = "isGoSubmodule"; public static final String IS_GO_SUBMODULE_DESC = "whether the generated Go module is a submodule"; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java index 14d5f51808c..6950cfa4e05 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java @@ -38,6 +38,7 @@ public abstract class AbstractGoCodegen extends DefaultCodegen implements Codege private static final String NUMERIC_ENUM_PREFIX = "_"; protected boolean withGoCodegenComment = false; + protected boolean withAWSV4Signature = false; protected boolean withXml = false; protected boolean enumClassPrefix = false; protected boolean structPrefix = false; @@ -633,6 +634,10 @@ public abstract class AbstractGoCodegen extends DefaultCodegen implements Codege this.withGoCodegenComment = withGoCodegenComment; } + public void setWithAWSV4Signature(boolean withAWSV4Signature) { + this.withAWSV4Signature = withAWSV4Signature; + } + public void setWithXml(boolean withXml) { this.withXml = withXml; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java index 2176c6f1e00..9e5080cf1f2 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java @@ -37,6 +37,7 @@ public class GoClientCodegen extends AbstractGoCodegen { public static final String WITH_GO_CODEGEN_COMMENT = "withGoCodegenComment"; public static final String WITH_XML = "withXml"; public static final String STRUCT_PREFIX = "structPrefix"; + public static final String WITH_AWSV4_SIGNATURE = "withAWSV4Signature"; public GoClientCodegen() { super(); @@ -58,6 +59,7 @@ public class GoClientCodegen extends AbstractGoCodegen { cliOptions.add(CliOption.newBoolean(WITH_XML, "whether to include support for application/xml content type and include XML annotations in the model (works with libraries that provide support for JSON and XML)")); cliOptions.add(CliOption.newBoolean(CodegenConstants.ENUM_CLASS_PREFIX, CodegenConstants.ENUM_CLASS_PREFIX_DESC)); cliOptions.add(CliOption.newBoolean(STRUCT_PREFIX, "whether to prefix struct with the class name. e.g. DeletePetOpts => PetApiDeletePetOpts")); + cliOptions.add(CliOption.newBoolean(WITH_AWSV4_SIGNATURE, "whether to include AWS v4 signature support")); // option to change the order of form/body parameter cliOptions.add(CliOption.newBoolean( @@ -109,6 +111,13 @@ public class GoClientCodegen extends AbstractGoCodegen { } } + if (additionalProperties.containsKey(WITH_AWSV4_SIGNATURE)) { + setWithAWSV4Signature(Boolean.parseBoolean(additionalProperties.get(WITH_AWSV4_SIGNATURE).toString())); + if (withAWSV4Signature) { + additionalProperties.put(WITH_AWSV4_SIGNATURE, "true"); + } + } + if (additionalProperties.containsKey(WITH_XML)) { setWithXml(Boolean.parseBoolean(additionalProperties.get(WITH_XML).toString())); if (withXml) { diff --git a/modules/openapi-generator/src/main/resources/go/README.mustache b/modules/openapi-generator/src/main/resources/go/README.mustache index 5c9639022a1..b96f612f8a5 100644 --- a/modules/openapi-generator/src/main/resources/go/README.mustache +++ b/modules/openapi-generator/src/main/resources/go/README.mustache @@ -24,6 +24,9 @@ Install the following dependencies: ```shell go get github.com/stretchr/testify/assert go get golang.org/x/oauth2 +{{#withAWSV4Signature}} +go get github.com/aws/aws-sdk-go/aws +{{/withAWSV4Signature}} go get golang.org/x/net/context go get github.com/antihax/optional ``` @@ -113,6 +116,18 @@ r, err := client.Service.Operation(auth, args) {{/isOAuth}} {{/authMethods}} +{{#withAWSV4Signature}} +Example + +```golang +auth := context.WithValue(context.Background(), sw.ContextAWSv4, sw.AWSv4{ + AccessKey: "ACCESSKEYSTRING", + SecretKey: "SECRETKEYSTRING", +}) +r, err := client.Service.Operation(auth, args) +``` +{{/withAWSV4Signature}} + ## Author {{#apiInfo}}{{#apis}}{{^hasMore}}{{infoEmail}} diff --git a/modules/openapi-generator/src/main/resources/go/client.mustache b/modules/openapi-generator/src/main/resources/go/client.mustache index a7c6802a0b8..78ee276d0f3 100644 --- a/modules/openapi-generator/src/main/resources/go/client.mustache +++ b/modules/openapi-generator/src/main/resources/go/client.mustache @@ -24,6 +24,10 @@ import ( "unicode/utf8" "golang.org/x/oauth2" + {{#withAWSV4Signature}} + awsv4 "github.com/aws/aws-sdk-go/aws/signer/v4" + awscredentials "github.com/aws/aws-sdk-go/aws/credentials" + {{/withAWSV4Signature}} ) var ( @@ -352,6 +356,25 @@ func (c *APIClient) prepareRequest( if auth, ok := ctx.Value(ContextAccessToken).(string); ok { localVarRequest.Header.Add("Authorization", "Bearer "+auth) } + + {{#withAWSV4Signature}} + // AWS Signature v4 Authentication + if auth, ok := ctx.Value(ContextAWSv4).(AWSv4); ok { + creds := awscredentials.NewStaticCredentials(auth.AccessKey, auth.SecretKey, "") + signer := awsv4.NewSigner(creds) + var reader *strings.Reader + if body == nil { + reader = strings.NewReader("") + } else { + reader = strings.NewReader(body.String()) + } + timestamp := time.Now() + _, err := signer.Sign(localVarRequest, reader, "oapi", "eu-west-2", timestamp) + if err != nil { + return nil, err + } + } + {{/withAWSV4Signature}} } for header, value := range c.cfg.DefaultHeader { diff --git a/modules/openapi-generator/src/main/resources/go/configuration.mustache b/modules/openapi-generator/src/main/resources/go/configuration.mustache index e6fa96d2057..ec28dd024cf 100644 --- a/modules/openapi-generator/src/main/resources/go/configuration.mustache +++ b/modules/openapi-generator/src/main/resources/go/configuration.mustache @@ -29,6 +29,11 @@ var ( // ContextAPIKey takes an APIKey as authentication for the request ContextAPIKey = contextKey("apikey") + + {{#withAWSV4Signature}} + // ContextAWSv4 takes an Access Key and a Secret Key for signing AWS Signature v4. + ContextAWSv4 = contextKey("awsv4") + {{/withAWSV4Signature}} ) // BasicAuth provides basic http authentication to a request passed via context using ContextBasicAuth @@ -43,6 +48,15 @@ type APIKey struct { Prefix string } +{{#withAWSV4Signature}} +// AWSv4 provides AWS Signature to a request passed via context using ContextAWSv4 +// https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html +type AWSv4 struct { + AccessKey string + SecretKey string +} +{{/withAWSV4Signature}} + // ServerVariable stores the information about a server variable type ServerVariable struct { Description string diff --git a/modules/openapi-generator/src/main/resources/go/go.mod.mustache b/modules/openapi-generator/src/main/resources/go/go.mod.mustache index 83502890599..6c31cf3e9f1 100644 --- a/modules/openapi-generator/src/main/resources/go/go.mod.mustache +++ b/modules/openapi-generator/src/main/resources/go/go.mod.mustache @@ -3,4 +3,5 @@ module {{gitHost}}/{{gitUserId}}/{{gitRepoId}}{{#isGoSubmodule}}/{{packageName}} require ( github.com/antihax/optional v1.0.0 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 + {{#withAWSV4Signature}}github.com/aws/aws-sdk-go v1.26.3{{/withAWSV4Signature}} ) diff --git a/modules/openapi-generator/src/main/resources/go/go.sum b/modules/openapi-generator/src/main/resources/go/go.sum index ce55b3c6a08..ee695202297 100644 --- a/modules/openapi-generator/src/main/resources/go/go.sum +++ b/modules/openapi-generator/src/main/resources/go/go.sum @@ -1,6 +1,8 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/aws/aws-sdk-go v1.26.3 h1:szQdfJcUBAhQT0zZEx4sxoDuWb7iScoucxCiVxDmaBk= +github.com/aws/aws-sdk-go v1.26.3/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/go/GoClientOptionsTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/go/GoClientOptionsTest.java index 7a6f4f79d19..c34f467b699 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/go/GoClientOptionsTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/go/GoClientOptionsTest.java @@ -58,6 +58,8 @@ public class GoClientOptionsTest extends AbstractOptionsTest { times = 1; clientCodegen.setStructPrefix(Boolean.valueOf(GoClientOptionsProvider.STRUCT_PREFIX_VALUE)); times = 1; + clientCodegen.setWithAWSV4Signature(Boolean.valueOf(GoClientOptionsProvider.WITH_AWSV4_SIGNATURE)); + times = 1; }}; } } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/GoClientOptionsProvider.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/GoClientOptionsProvider.java index 9ccf0584ab3..e11ff84b592 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/GoClientOptionsProvider.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/GoClientOptionsProvider.java @@ -32,6 +32,7 @@ public class GoClientOptionsProvider implements OptionsProvider { public static final Boolean PREPEND_FORM_OR_BODY_PARAMETERS_VALUE = true; public static final boolean IS_GO_SUBMODULE_VALUE = true; public static final boolean STRUCT_PREFIX_VALUE = true; + public static final boolean WITH_AWSV4_SIGNATURE = true; @Override public String getLanguage() { @@ -50,6 +51,7 @@ public class GoClientOptionsProvider implements OptionsProvider { .put(CodegenConstants.ENUM_CLASS_PREFIX, "true") .put(CodegenConstants.PREPEND_FORM_OR_BODY_PARAMETERS, "true") .put(CodegenConstants.IS_GO_SUBMODULE, "true") + .put(CodegenConstants.WITH_AWSV4_SIGNATURE_COMMENT, "true") .put("structPrefix", "true") .build(); } diff --git a/samples/client/petstore/go/go-petstore-withXml/README.md b/samples/client/petstore/go/go-petstore-withXml/README.md index 052b43c30a6..59f48a22aac 100644 --- a/samples/client/petstore/go/go-petstore-withXml/README.md +++ b/samples/client/petstore/go/go-petstore-withXml/README.md @@ -200,6 +200,7 @@ r, err := client.Service.Operation(auth, args) ``` + ## Author diff --git a/samples/client/petstore/go/go-petstore-withXml/client.go b/samples/client/petstore/go/go-petstore-withXml/client.go index cc5ffa09cc6..5a5a4c85293 100644 --- a/samples/client/petstore/go/go-petstore-withXml/client.go +++ b/samples/client/petstore/go/go-petstore-withXml/client.go @@ -364,6 +364,7 @@ func (c *APIClient) prepareRequest( if auth, ok := ctx.Value(ContextAccessToken).(string); ok { localVarRequest.Header.Add("Authorization", "Bearer "+auth) } + } for header, value := range c.cfg.DefaultHeader { diff --git a/samples/client/petstore/go/go-petstore-withXml/configuration.go b/samples/client/petstore/go/go-petstore-withXml/configuration.go index 59728f054c7..f0134476c59 100644 --- a/samples/client/petstore/go/go-petstore-withXml/configuration.go +++ b/samples/client/petstore/go/go-petstore-withXml/configuration.go @@ -38,6 +38,7 @@ var ( // ContextAPIKey takes an APIKey as authentication for the request ContextAPIKey = contextKey("apikey") + ) // BasicAuth provides basic http authentication to a request passed via context using ContextBasicAuth @@ -52,6 +53,7 @@ type APIKey struct { Prefix string } + // ServerVariable stores the information about a server variable type ServerVariable struct { Description string diff --git a/samples/client/petstore/go/go-petstore-withXml/go.mod b/samples/client/petstore/go/go-petstore-withXml/go.mod index 1af1846f985..f55c1461f84 100644 --- a/samples/client/petstore/go/go-petstore-withXml/go.mod +++ b/samples/client/petstore/go/go-petstore-withXml/go.mod @@ -3,4 +3,5 @@ module github.com/GIT_USER_ID/GIT_REPO_ID require ( github.com/antihax/optional v1.0.0 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 + ) diff --git a/samples/client/petstore/go/go-petstore-withXml/go.sum b/samples/client/petstore/go/go-petstore-withXml/go.sum index ce55b3c6a08..ee695202297 100644 --- a/samples/client/petstore/go/go-petstore-withXml/go.sum +++ b/samples/client/petstore/go/go-petstore-withXml/go.sum @@ -1,6 +1,8 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/aws/aws-sdk-go v1.26.3 h1:szQdfJcUBAhQT0zZEx4sxoDuWb7iScoucxCiVxDmaBk= +github.com/aws/aws-sdk-go v1.26.3/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= diff --git a/samples/client/petstore/go/go-petstore/README.md b/samples/client/petstore/go/go-petstore/README.md index 052b43c30a6..59f48a22aac 100644 --- a/samples/client/petstore/go/go-petstore/README.md +++ b/samples/client/petstore/go/go-petstore/README.md @@ -200,6 +200,7 @@ r, err := client.Service.Operation(auth, args) ``` + ## Author diff --git a/samples/client/petstore/go/go-petstore/client.go b/samples/client/petstore/go/go-petstore/client.go index 0c97916457d..53343904149 100644 --- a/samples/client/petstore/go/go-petstore/client.go +++ b/samples/client/petstore/go/go-petstore/client.go @@ -363,6 +363,7 @@ func (c *APIClient) prepareRequest( if auth, ok := ctx.Value(ContextAccessToken).(string); ok { localVarRequest.Header.Add("Authorization", "Bearer "+auth) } + } for header, value := range c.cfg.DefaultHeader { diff --git a/samples/client/petstore/go/go-petstore/configuration.go b/samples/client/petstore/go/go-petstore/configuration.go index 34f8f242922..e3159c328b4 100644 --- a/samples/client/petstore/go/go-petstore/configuration.go +++ b/samples/client/petstore/go/go-petstore/configuration.go @@ -37,6 +37,7 @@ var ( // ContextAPIKey takes an APIKey as authentication for the request ContextAPIKey = contextKey("apikey") + ) // BasicAuth provides basic http authentication to a request passed via context using ContextBasicAuth @@ -51,6 +52,7 @@ type APIKey struct { Prefix string } + // ServerVariable stores the information about a server variable type ServerVariable struct { Description string diff --git a/samples/client/petstore/go/go-petstore/go.mod b/samples/client/petstore/go/go-petstore/go.mod index 1af1846f985..f55c1461f84 100644 --- a/samples/client/petstore/go/go-petstore/go.mod +++ b/samples/client/petstore/go/go-petstore/go.mod @@ -3,4 +3,5 @@ module github.com/GIT_USER_ID/GIT_REPO_ID require ( github.com/antihax/optional v1.0.0 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 + ) diff --git a/samples/client/petstore/go/go-petstore/go.sum b/samples/client/petstore/go/go-petstore/go.sum index ce55b3c6a08..ee695202297 100644 --- a/samples/client/petstore/go/go-petstore/go.sum +++ b/samples/client/petstore/go/go-petstore/go.sum @@ -1,6 +1,8 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/aws/aws-sdk-go v1.26.3 h1:szQdfJcUBAhQT0zZEx4sxoDuWb7iScoucxCiVxDmaBk= +github.com/aws/aws-sdk-go v1.26.3/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= diff --git a/samples/openapi3/client/petstore/go/go-petstore/README.md b/samples/openapi3/client/petstore/go/go-petstore/README.md index a50a23f7d4a..c0f191d001d 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/README.md +++ b/samples/openapi3/client/petstore/go/go-petstore/README.md @@ -219,6 +219,7 @@ r, err := client.Service.Operation(auth, args) ``` + ## Author diff --git a/samples/openapi3/client/petstore/go/go-petstore/client.go b/samples/openapi3/client/petstore/go/go-petstore/client.go index 1b8eae88daa..730e67621ed 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/client.go +++ b/samples/openapi3/client/petstore/go/go-petstore/client.go @@ -366,6 +366,7 @@ func (c *APIClient) prepareRequest( if auth, ok := ctx.Value(ContextAccessToken).(string); ok { localVarRequest.Header.Add("Authorization", "Bearer "+auth) } + } for header, value := range c.cfg.DefaultHeader { diff --git a/samples/openapi3/client/petstore/go/go-petstore/configuration.go b/samples/openapi3/client/petstore/go/go-petstore/configuration.go index 333de81350d..c2ea841704a 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/configuration.go +++ b/samples/openapi3/client/petstore/go/go-petstore/configuration.go @@ -37,6 +37,7 @@ var ( // ContextAPIKey takes an APIKey as authentication for the request ContextAPIKey = contextKey("apikey") + ) // BasicAuth provides basic http authentication to a request passed via context using ContextBasicAuth @@ -51,6 +52,7 @@ type APIKey struct { Prefix string } + // ServerVariable stores the information about a server variable type ServerVariable struct { Description string diff --git a/samples/openapi3/client/petstore/go/go-petstore/go.mod b/samples/openapi3/client/petstore/go/go-petstore/go.mod index 1af1846f985..f55c1461f84 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/go.mod +++ b/samples/openapi3/client/petstore/go/go-petstore/go.mod @@ -3,4 +3,5 @@ module github.com/GIT_USER_ID/GIT_REPO_ID require ( github.com/antihax/optional v1.0.0 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 + ) diff --git a/samples/openapi3/client/petstore/go/go-petstore/go.sum b/samples/openapi3/client/petstore/go/go-petstore/go.sum index ce55b3c6a08..ee695202297 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/go.sum +++ b/samples/openapi3/client/petstore/go/go-petstore/go.sum @@ -1,6 +1,8 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/aws/aws-sdk-go v1.26.3 h1:szQdfJcUBAhQT0zZEx4sxoDuWb7iScoucxCiVxDmaBk= +github.com/aws/aws-sdk-go v1.26.3/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= diff --git a/samples/openapi3/server/petstore/go-api-server/.openapi-generator/VERSION b/samples/openapi3/server/petstore/go-api-server/.openapi-generator/VERSION index c3a2c7076fa..58592f031f6 100644 --- a/samples/openapi3/server/petstore/go-api-server/.openapi-generator/VERSION +++ b/samples/openapi3/server/petstore/go-api-server/.openapi-generator/VERSION @@ -1 +1 @@ -4.2.0-SNAPSHOT \ No newline at end of file +4.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/openapi3/server/petstore/go-api-server/go/api_another_fake.go b/samples/openapi3/server/petstore/go-api-server/go/api_another_fake.go index b30ab1a1acb..804316ecb21 100644 --- a/samples/openapi3/server/petstore/go-api-server/go/api_another_fake.go +++ b/samples/openapi3/server/petstore/go-api-server/go/api_another_fake.go @@ -10,11 +10,48 @@ package petstoreserver import ( + "encoding/json" "net/http" + "strings" + + "github.com/gorilla/mux" ) -// Call123TestSpecialTags - To test special tags -func Call123TestSpecialTags(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +// A AnotherFakeApiController binds http requests to an api service and writes the service results to the http response +type AnotherFakeApiController struct { + service AnotherFakeApiServicer +} + +// NewAnotherFakeApiController creates a default api controller +func NewAnotherFakeApiController(s AnotherFakeApiServicer) Router { + return &AnotherFakeApiController{ service: s } +} + +// Routes returns all of the api route for the AnotherFakeApiController +func (c *AnotherFakeApiController) Routes() Routes { + return Routes{ + { + "Call123TestSpecialTags", + strings.ToUpper("Patch"), + "/v2/another-fake/dummy", + c.Call123TestSpecialTags, + }, + } +} + +// Call123TestSpecialTags - To test special tags +func (c *AnotherFakeApiController) Call123TestSpecialTags(w http.ResponseWriter, r *http.Request) { + client := &Client{} + if err := json.NewDecoder(r.Body).Decode(&client); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.Call123TestSpecialTags(*client) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } diff --git a/samples/openapi3/server/petstore/go-api-server/go/api_default.go b/samples/openapi3/server/petstore/go-api-server/go/api_default.go index 8de510a0dd8..c1618f26c9c 100644 --- a/samples/openapi3/server/petstore/go-api-server/go/api_default.go +++ b/samples/openapi3/server/petstore/go-api-server/go/api_default.go @@ -10,11 +10,42 @@ package petstoreserver import ( + "encoding/json" "net/http" + "strings" + + "github.com/gorilla/mux" ) -// FooGet - -func FooGet(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +// A DefaultApiController binds http requests to an api service and writes the service results to the http response +type DefaultApiController struct { + service DefaultApiServicer +} + +// NewDefaultApiController creates a default api controller +func NewDefaultApiController(s DefaultApiServicer) Router { + return &DefaultApiController{ service: s } +} + +// Routes returns all of the api route for the DefaultApiController +func (c *DefaultApiController) Routes() Routes { + return Routes{ + { + "FooGet", + strings.ToUpper("Get"), + "/v2/foo", + c.FooGet, + }, + } +} + +// FooGet - +func (c *DefaultApiController) FooGet(w http.ResponseWriter, r *http.Request) { + result, err := c.service.FooGet() + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } diff --git a/samples/openapi3/server/petstore/go-api-server/go/api_fake.go b/samples/openapi3/server/petstore/go-api-server/go/api_fake.go index 07ebda735bd..94b55953254 100644 --- a/samples/openapi3/server/petstore/go-api-server/go/api_fake.go +++ b/samples/openapi3/server/petstore/go-api-server/go/api_fake.go @@ -10,89 +10,389 @@ package petstoreserver import ( + "encoding/json" "net/http" + "strings" + + "github.com/gorilla/mux" ) +// A FakeApiController binds http requests to an api service and writes the service results to the http response +type FakeApiController struct { + service FakeApiServicer +} + +// NewFakeApiController creates a default api controller +func NewFakeApiController(s FakeApiServicer) Router { + return &FakeApiController{ service: s } +} + +// Routes returns all of the api route for the FakeApiController +func (c *FakeApiController) Routes() Routes { + return Routes{ + { + "FakeHealthGet", + strings.ToUpper("Get"), + "/v2/fake/health", + c.FakeHealthGet, + }, + { + "FakeOuterBooleanSerialize", + strings.ToUpper("Post"), + "/v2/fake/outer/boolean", + c.FakeOuterBooleanSerialize, + }, + { + "FakeOuterCompositeSerialize", + strings.ToUpper("Post"), + "/v2/fake/outer/composite", + c.FakeOuterCompositeSerialize, + }, + { + "FakeOuterNumberSerialize", + strings.ToUpper("Post"), + "/v2/fake/outer/number", + c.FakeOuterNumberSerialize, + }, + { + "FakeOuterStringSerialize", + strings.ToUpper("Post"), + "/v2/fake/outer/string", + c.FakeOuterStringSerialize, + }, + { + "TestBodyWithFileSchema", + strings.ToUpper("Put"), + "/v2/fake/body-with-file-schema", + c.TestBodyWithFileSchema, + }, + { + "TestBodyWithQueryParams", + strings.ToUpper("Put"), + "/v2/fake/body-with-query-params", + c.TestBodyWithQueryParams, + }, + { + "TestClientModel", + strings.ToUpper("Patch"), + "/v2/fake", + c.TestClientModel, + }, + { + "TestEndpointParameters", + strings.ToUpper("Post"), + "/v2/fake", + c.TestEndpointParameters, + }, + { + "TestEnumParameters", + strings.ToUpper("Get"), + "/v2/fake", + c.TestEnumParameters, + }, + { + "TestGroupParameters", + strings.ToUpper("Delete"), + "/v2/fake", + c.TestGroupParameters, + }, + { + "TestInlineAdditionalProperties", + strings.ToUpper("Post"), + "/v2/fake/inline-additionalProperties", + c.TestInlineAdditionalProperties, + }, + { + "TestJsonFormData", + strings.ToUpper("Get"), + "/v2/fake/jsonFormData", + c.TestJsonFormData, + }, + { + "TestQueryParameterCollectionFormat", + strings.ToUpper("Put"), + "/v2/fake/test-query-paramters", + c.TestQueryParameterCollectionFormat, + }, + } +} + // FakeHealthGet - Health check endpoint -func FakeHealthGet(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *FakeApiController) FakeHealthGet(w http.ResponseWriter, r *http.Request) { + result, err := c.service.FakeHealthGet() + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // FakeOuterBooleanSerialize - -func FakeOuterBooleanSerialize(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *FakeApiController) FakeOuterBooleanSerialize(w http.ResponseWriter, r *http.Request) { + body := &bool{} + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.FakeOuterBooleanSerialize(*body) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // FakeOuterCompositeSerialize - -func FakeOuterCompositeSerialize(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *FakeApiController) FakeOuterCompositeSerialize(w http.ResponseWriter, r *http.Request) { + outerComposite := &OuterComposite{} + if err := json.NewDecoder(r.Body).Decode(&outerComposite); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.FakeOuterCompositeSerialize(*outerComposite) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // FakeOuterNumberSerialize - -func FakeOuterNumberSerialize(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *FakeApiController) FakeOuterNumberSerialize(w http.ResponseWriter, r *http.Request) { + body := &float32{} + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.FakeOuterNumberSerialize(*body) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // FakeOuterStringSerialize - -func FakeOuterStringSerialize(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *FakeApiController) FakeOuterStringSerialize(w http.ResponseWriter, r *http.Request) { + body := &string{} + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.FakeOuterStringSerialize(*body) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // TestBodyWithFileSchema - -func TestBodyWithFileSchema(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *FakeApiController) TestBodyWithFileSchema(w http.ResponseWriter, r *http.Request) { + fileSchemaTestClass := &FileSchemaTestClass{} + if err := json.NewDecoder(r.Body).Decode(&fileSchemaTestClass); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.TestBodyWithFileSchema(*fileSchemaTestClass) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // TestBodyWithQueryParams - -func TestBodyWithQueryParams(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *FakeApiController) TestBodyWithQueryParams(w http.ResponseWriter, r *http.Request) { + query := r.URL.Query() + query := query.Get("query") + user := &User{} + if err := json.NewDecoder(r.Body).Decode(&user); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.TestBodyWithQueryParams(query, *user) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // TestClientModel - To test \"client\" model -func TestClientModel(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *FakeApiController) TestClientModel(w http.ResponseWriter, r *http.Request) { + client := &Client{} + if err := json.NewDecoder(r.Body).Decode(&client); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.TestClientModel(*client) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // TestEndpointParameters - Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 -func TestEndpointParameters(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *FakeApiController) TestEndpointParameters(w http.ResponseWriter, r *http.Request) { + err := r.ParseForm() + if err != nil { + w.WriteHeader(500) + return + } + + number := r.FormValue("number") + double := r.FormValue("double") + patternWithoutDelimiter := r.FormValue("patternWithoutDelimiter") + byte_ := r.FormValue("byte_") + integer := r.FormValue("integer") + int32_ := r.FormValue("int32_") + int64_, err := parseIntParameter( r.FormValue("int64_")) + if err != nil { + w.WriteHeader(500) + return + } + + float := r.FormValue("float") + string_ := r.FormValue("string_") + binary, err := ReadFormFileToTempFile(r, "binary") + if err != nil { + w.WriteHeader(500) + return + } + + date := r.FormValue("date") + dateTime := r.FormValue("dateTime") + password := r.FormValue("password") + callback := r.FormValue("callback") + result, err := c.service.TestEndpointParameters(number, double, patternWithoutDelimiter, byte_, integer, int32_, int64_, float, string_, binary, date, dateTime, password, callback) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // TestEnumParameters - To test enum parameters -func TestEnumParameters(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *FakeApiController) TestEnumParameters(w http.ResponseWriter, r *http.Request) { + err := r.ParseForm() + if err != nil { + w.WriteHeader(500) + return + } + + query := r.URL.Query() + enumHeaderStringArray := r.Header.Get("enumHeaderStringArray") + enumHeaderString := r.Header.Get("enumHeaderString") + enumQueryStringArray := strings.Split(query.Get("enumQueryStringArray"), ",") + enumQueryString := query.Get("enumQueryString") + enumQueryInteger := query.Get("enumQueryInteger") + enumQueryDouble := query.Get("enumQueryDouble") + enumFormStringArray := r.FormValue("enumFormStringArray") + enumFormString := r.FormValue("enumFormString") + result, err := c.service.TestEnumParameters(enumHeaderStringArray, enumHeaderString, enumQueryStringArray, enumQueryString, enumQueryInteger, enumQueryDouble, enumFormStringArray, enumFormString) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // TestGroupParameters - Fake endpoint to test group parameters (optional) -func TestGroupParameters(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *FakeApiController) TestGroupParameters(w http.ResponseWriter, r *http.Request) { + query := r.URL.Query() + requiredStringGroup := query.Get("requiredStringGroup") + requiredBooleanGroup := r.Header.Get("requiredBooleanGroup") + requiredInt64Group, err := parseIntParameter(query.Get("requiredInt64Group")) + if err != nil { + w.WriteHeader(500) + return + } + + stringGroup := query.Get("stringGroup") + booleanGroup := r.Header.Get("booleanGroup") + int64Group, err := parseIntParameter(query.Get("int64Group")) + if err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.TestGroupParameters(requiredStringGroup, requiredBooleanGroup, requiredInt64Group, stringGroup, booleanGroup, int64Group) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // TestInlineAdditionalProperties - test inline additionalProperties -func TestInlineAdditionalProperties(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *FakeApiController) TestInlineAdditionalProperties(w http.ResponseWriter, r *http.Request) { + requestBody := &map[string]string{} + if err := json.NewDecoder(r.Body).Decode(&requestBody); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.TestInlineAdditionalProperties(*requestBody) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // TestJsonFormData - test json serialization of form data -func TestJsonFormData(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *FakeApiController) TestJsonFormData(w http.ResponseWriter, r *http.Request) { + err := r.ParseForm() + if err != nil { + w.WriteHeader(500) + return + } + + param := r.FormValue("param") + param2 := r.FormValue("param2") + result, err := c.service.TestJsonFormData(param, param2) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // TestQueryParameterCollectionFormat - -func TestQueryParameterCollectionFormat(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *FakeApiController) TestQueryParameterCollectionFormat(w http.ResponseWriter, r *http.Request) { + query := r.URL.Query() + pipe := strings.Split(query.Get("pipe"), ",") + ioutil := strings.Split(query.Get("ioutil"), ",") + http := strings.Split(query.Get("http"), ",") + url := strings.Split(query.Get("url"), ",") + context := strings.Split(query.Get("context"), ",") + result, err := c.service.TestQueryParameterCollectionFormat(pipe, ioutil, http, url, context) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } diff --git a/samples/openapi3/server/petstore/go-api-server/go/api_fake_classname_tags123.go b/samples/openapi3/server/petstore/go-api-server/go/api_fake_classname_tags123.go index 395c1b25346..998465c23a4 100644 --- a/samples/openapi3/server/petstore/go-api-server/go/api_fake_classname_tags123.go +++ b/samples/openapi3/server/petstore/go-api-server/go/api_fake_classname_tags123.go @@ -10,11 +10,48 @@ package petstoreserver import ( + "encoding/json" "net/http" + "strings" + + "github.com/gorilla/mux" ) -// TestClassname - To test class name in snake case -func TestClassname(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +// A FakeClassnameTags123ApiController binds http requests to an api service and writes the service results to the http response +type FakeClassnameTags123ApiController struct { + service FakeClassnameTags123ApiServicer +} + +// NewFakeClassnameTags123ApiController creates a default api controller +func NewFakeClassnameTags123ApiController(s FakeClassnameTags123ApiServicer) Router { + return &FakeClassnameTags123ApiController{ service: s } +} + +// Routes returns all of the api route for the FakeClassnameTags123ApiController +func (c *FakeClassnameTags123ApiController) Routes() Routes { + return Routes{ + { + "TestClassname", + strings.ToUpper("Patch"), + "/v2/fake_classname_test", + c.TestClassname, + }, + } +} + +// TestClassname - To test class name in snake case +func (c *FakeClassnameTags123ApiController) TestClassname(w http.ResponseWriter, r *http.Request) { + client := &Client{} + if err := json.NewDecoder(r.Body).Decode(&client); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.TestClassname(*client) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } diff --git a/samples/openapi3/server/petstore/go-api-server/go/api_pet.go b/samples/openapi3/server/petstore/go-api-server/go/api_pet.go index fc0d47c146c..867c12e0895 100644 --- a/samples/openapi3/server/petstore/go-api-server/go/api_pet.go +++ b/samples/openapi3/server/petstore/go-api-server/go/api_pet.go @@ -10,59 +10,264 @@ package petstoreserver import ( + "encoding/json" "net/http" + "strings" + + "github.com/gorilla/mux" ) +// A PetApiController binds http requests to an api service and writes the service results to the http response +type PetApiController struct { + service PetApiServicer +} + +// NewPetApiController creates a default api controller +func NewPetApiController(s PetApiServicer) Router { + return &PetApiController{ service: s } +} + +// Routes returns all of the api route for the PetApiController +func (c *PetApiController) Routes() Routes { + return Routes{ + { + "AddPet", + strings.ToUpper("Post"), + "/v2/pet", + c.AddPet, + }, + { + "DeletePet", + strings.ToUpper("Delete"), + "/v2/pet/{petId}", + c.DeletePet, + }, + { + "FindPetsByStatus", + strings.ToUpper("Get"), + "/v2/pet/findByStatus", + c.FindPetsByStatus, + }, + { + "FindPetsByTags", + strings.ToUpper("Get"), + "/v2/pet/findByTags", + c.FindPetsByTags, + }, + { + "GetPetById", + strings.ToUpper("Get"), + "/v2/pet/{petId}", + c.GetPetById, + }, + { + "UpdatePet", + strings.ToUpper("Put"), + "/v2/pet", + c.UpdatePet, + }, + { + "UpdatePetWithForm", + strings.ToUpper("Post"), + "/v2/pet/{petId}", + c.UpdatePetWithForm, + }, + { + "UploadFile", + strings.ToUpper("Post"), + "/v2/pet/{petId}/uploadImage", + c.UploadFile, + }, + { + "UploadFileWithRequiredFile", + strings.ToUpper("Post"), + "/v2/fake/{petId}/uploadImageWithRequiredFile", + c.UploadFileWithRequiredFile, + }, + } +} + // AddPet - Add a new pet to the store -func AddPet(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *PetApiController) AddPet(w http.ResponseWriter, r *http.Request) { + pet := &Pet{} + if err := json.NewDecoder(r.Body).Decode(&pet); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.AddPet(*pet) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // DeletePet - Deletes a pet -func DeletePet(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *PetApiController) DeletePet(w http.ResponseWriter, r *http.Request) { + params := mux.Vars(r) + petId, err := parseIntParameter(params["petId"]) + if err != nil { + w.WriteHeader(500) + return + } + + apiKey := r.Header.Get("apiKey") + result, err := c.service.DeletePet(petId, apiKey) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // FindPetsByStatus - Finds Pets by status -func FindPetsByStatus(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *PetApiController) FindPetsByStatus(w http.ResponseWriter, r *http.Request) { + query := r.URL.Query() + status := strings.Split(query.Get("status"), ",") + result, err := c.service.FindPetsByStatus(status) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // FindPetsByTags - Finds Pets by tags -func FindPetsByTags(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *PetApiController) FindPetsByTags(w http.ResponseWriter, r *http.Request) { + query := r.URL.Query() + tags := strings.Split(query.Get("tags"), ",") + result, err := c.service.FindPetsByTags(tags) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // GetPetById - Find pet by ID -func GetPetById(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *PetApiController) GetPetById(w http.ResponseWriter, r *http.Request) { + params := mux.Vars(r) + petId, err := parseIntParameter(params["petId"]) + if err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.GetPetById(petId) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // UpdatePet - Update an existing pet -func UpdatePet(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *PetApiController) UpdatePet(w http.ResponseWriter, r *http.Request) { + pet := &Pet{} + if err := json.NewDecoder(r.Body).Decode(&pet); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.UpdatePet(*pet) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // UpdatePetWithForm - Updates a pet in the store with form data -func UpdatePetWithForm(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *PetApiController) UpdatePetWithForm(w http.ResponseWriter, r *http.Request) { + err := r.ParseForm() + if err != nil { + w.WriteHeader(500) + return + } + + params := mux.Vars(r) + petId, err := parseIntParameter(params["petId"]) + if err != nil { + w.WriteHeader(500) + return + } + + name := r.FormValue("name") + status := r.FormValue("status") + result, err := c.service.UpdatePetWithForm(petId, name, status) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // UploadFile - uploads an image -func UploadFile(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *PetApiController) UploadFile(w http.ResponseWriter, r *http.Request) { + err := r.ParseForm() + if err != nil { + w.WriteHeader(500) + return + } + + params := mux.Vars(r) + petId, err := parseIntParameter(params["petId"]) + if err != nil { + w.WriteHeader(500) + return + } + + additionalMetadata := r.FormValue("additionalMetadata") + file, err := ReadFormFileToTempFile(r, "file") + if err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.UploadFile(petId, additionalMetadata, file) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // UploadFileWithRequiredFile - uploads an image (required) -func UploadFileWithRequiredFile(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *PetApiController) UploadFileWithRequiredFile(w http.ResponseWriter, r *http.Request) { + err := r.ParseForm() + if err != nil { + w.WriteHeader(500) + return + } + + params := mux.Vars(r) + petId, err := parseIntParameter(params["petId"]) + if err != nil { + w.WriteHeader(500) + return + } + + requiredFile, err := ReadFormFileToTempFile(r, "requiredFile") + if err != nil { + w.WriteHeader(500) + return + } + + additionalMetadata := r.FormValue("additionalMetadata") + result, err := c.service.UploadFileWithRequiredFile(petId, requiredFile, additionalMetadata) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } diff --git a/samples/openapi3/server/petstore/go-api-server/go/api_store.go b/samples/openapi3/server/petstore/go-api-server/go/api_store.go index aa5d01548b8..5867035964e 100644 --- a/samples/openapi3/server/petstore/go-api-server/go/api_store.go +++ b/samples/openapi3/server/petstore/go-api-server/go/api_store.go @@ -10,29 +10,108 @@ package petstoreserver import ( + "encoding/json" "net/http" + "strings" + + "github.com/gorilla/mux" ) +// A StoreApiController binds http requests to an api service and writes the service results to the http response +type StoreApiController struct { + service StoreApiServicer +} + +// NewStoreApiController creates a default api controller +func NewStoreApiController(s StoreApiServicer) Router { + return &StoreApiController{ service: s } +} + +// Routes returns all of the api route for the StoreApiController +func (c *StoreApiController) Routes() Routes { + return Routes{ + { + "DeleteOrder", + strings.ToUpper("Delete"), + "/v2/store/order/{order_id}", + c.DeleteOrder, + }, + { + "GetInventory", + strings.ToUpper("Get"), + "/v2/store/inventory", + c.GetInventory, + }, + { + "GetOrderById", + strings.ToUpper("Get"), + "/v2/store/order/{order_id}", + c.GetOrderById, + }, + { + "PlaceOrder", + strings.ToUpper("Post"), + "/v2/store/order", + c.PlaceOrder, + }, + } +} + // DeleteOrder - Delete purchase order by ID -func DeleteOrder(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *StoreApiController) DeleteOrder(w http.ResponseWriter, r *http.Request) { + params := mux.Vars(r) + orderId := params["orderId"] + result, err := c.service.DeleteOrder(orderId) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // GetInventory - Returns pet inventories by status -func GetInventory(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *StoreApiController) GetInventory(w http.ResponseWriter, r *http.Request) { + result, err := c.service.GetInventory() + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // GetOrderById - Find purchase order by ID -func GetOrderById(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *StoreApiController) GetOrderById(w http.ResponseWriter, r *http.Request) { + params := mux.Vars(r) + orderId, err := parseIntParameter(params["orderId"]) + if err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.GetOrderById(orderId) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // PlaceOrder - Place an order for a pet -func PlaceOrder(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *StoreApiController) PlaceOrder(w http.ResponseWriter, r *http.Request) { + order := &Order{} + if err := json.NewDecoder(r.Body).Decode(&order); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.PlaceOrder(*order) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } diff --git a/samples/openapi3/server/petstore/go-api-server/go/api_user.go b/samples/openapi3/server/petstore/go-api-server/go/api_user.go index aca15233a09..35fd6713eb7 100644 --- a/samples/openapi3/server/petstore/go-api-server/go/api_user.go +++ b/samples/openapi3/server/petstore/go-api-server/go/api_user.go @@ -10,53 +10,194 @@ package petstoreserver import ( + "encoding/json" "net/http" + "strings" + + "github.com/gorilla/mux" ) +// A UserApiController binds http requests to an api service and writes the service results to the http response +type UserApiController struct { + service UserApiServicer +} + +// NewUserApiController creates a default api controller +func NewUserApiController(s UserApiServicer) Router { + return &UserApiController{ service: s } +} + +// Routes returns all of the api route for the UserApiController +func (c *UserApiController) Routes() Routes { + return Routes{ + { + "CreateUser", + strings.ToUpper("Post"), + "/v2/user", + c.CreateUser, + }, + { + "CreateUsersWithArrayInput", + strings.ToUpper("Post"), + "/v2/user/createWithArray", + c.CreateUsersWithArrayInput, + }, + { + "CreateUsersWithListInput", + strings.ToUpper("Post"), + "/v2/user/createWithList", + c.CreateUsersWithListInput, + }, + { + "DeleteUser", + strings.ToUpper("Delete"), + "/v2/user/{username}", + c.DeleteUser, + }, + { + "GetUserByName", + strings.ToUpper("Get"), + "/v2/user/{username}", + c.GetUserByName, + }, + { + "LoginUser", + strings.ToUpper("Get"), + "/v2/user/login", + c.LoginUser, + }, + { + "LogoutUser", + strings.ToUpper("Get"), + "/v2/user/logout", + c.LogoutUser, + }, + { + "UpdateUser", + strings.ToUpper("Put"), + "/v2/user/{username}", + c.UpdateUser, + }, + } +} + // CreateUser - Create user -func CreateUser(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *UserApiController) CreateUser(w http.ResponseWriter, r *http.Request) { + user := &User{} + if err := json.NewDecoder(r.Body).Decode(&user); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.CreateUser(*user) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // CreateUsersWithArrayInput - Creates list of users with given input array -func CreateUsersWithArrayInput(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *UserApiController) CreateUsersWithArrayInput(w http.ResponseWriter, r *http.Request) { + user := &[]User{} + if err := json.NewDecoder(r.Body).Decode(&user); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.CreateUsersWithArrayInput(*user) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // CreateUsersWithListInput - Creates list of users with given input array -func CreateUsersWithListInput(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *UserApiController) CreateUsersWithListInput(w http.ResponseWriter, r *http.Request) { + user := &[]User{} + if err := json.NewDecoder(r.Body).Decode(&user); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.CreateUsersWithListInput(*user) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // DeleteUser - Delete user -func DeleteUser(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *UserApiController) DeleteUser(w http.ResponseWriter, r *http.Request) { + params := mux.Vars(r) + username := params["username"] + result, err := c.service.DeleteUser(username) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // GetUserByName - Get user by user name -func GetUserByName(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *UserApiController) GetUserByName(w http.ResponseWriter, r *http.Request) { + params := mux.Vars(r) + username := params["username"] + result, err := c.service.GetUserByName(username) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // LoginUser - Logs user into the system -func LoginUser(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *UserApiController) LoginUser(w http.ResponseWriter, r *http.Request) { + query := r.URL.Query() + username := query.Get("username") + password := query.Get("password") + result, err := c.service.LoginUser(username, password) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // LogoutUser - Logs out current logged in user session -func LogoutUser(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *UserApiController) LogoutUser(w http.ResponseWriter, r *http.Request) { + result, err := c.service.LogoutUser() + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } // UpdateUser - Updated user -func UpdateUser(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) +func (c *UserApiController) UpdateUser(w http.ResponseWriter, r *http.Request) { + params := mux.Vars(r) + username := params["username"] + user := &User{} + if err := json.NewDecoder(r.Body).Decode(&user); err != nil { + w.WriteHeader(500) + return + } + + result, err := c.service.UpdateUser(username, *user) + if err != nil { + w.WriteHeader(500) + return + } + + EncodeJSONResponse(result, nil, w) } diff --git a/samples/openapi3/server/petstore/go-api-server/go/routers.go b/samples/openapi3/server/petstore/go-api-server/go/routers.go index 616ae81843d..1a166f390e8 100644 --- a/samples/openapi3/server/petstore/go-api-server/go/routers.go +++ b/samples/openapi3/server/petstore/go-api-server/go/routers.go @@ -10,13 +10,15 @@ package petstoreserver import ( - "fmt" + "encoding/json" + "io/ioutil" "net/http" - "strings" - + "os" + "strconv" "github.com/gorilla/mux" ) +// A Route defines the parameters for an api endpoint type Route struct { Name string Method string @@ -24,300 +26,71 @@ type Route struct { HandlerFunc http.HandlerFunc } +// Routes are a collection of defined api endpoints type Routes []Route -func NewRouter() *mux.Router { - router := mux.NewRouter().StrictSlash(true) - for _, route := range routes { - var handler http.Handler - handler = route.HandlerFunc - handler = Logger(handler, route.Name) +// Router defines the required methods for retrieving api routes +type Router interface { + Routes() Routes +} - router. - Methods(route.Method). - Path(route.Pattern). - Name(route.Name). - Handler(handler) +// NewRouter creates a new router for any number of api routers +func NewRouter(routers ...Router) *mux.Router { + router := mux.NewRouter().StrictSlash(true) + for _, api := range routers { + for _, route := range api.Routes() { + var handler http.Handler + handler = route.HandlerFunc + handler = Logger(handler, route.Name) + + router. + Methods(route.Method). + Path(route.Pattern). + Name(route.Name). + Handler(handler) + } } return router } -func Index(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "Hello World!") +// EncodeJSONResponse uses the json encoder to write an interface to the http response with an optional status code +func EncodeJSONResponse(i interface{}, status *int, w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + if status != nil { + w.WriteHeader(*status) + } else { + w.WriteHeader(http.StatusOK) + } + + return json.NewEncoder(w).Encode(i) } -var routes = Routes{ - { - "Index", - "GET", - "/v2/", - Index, - }, +// ReadFormFileToTempFile reads file data from a request form and writes it to a temporary file +func ReadFormFileToTempFile(r *http.Request, key string) (*os.File, error) { + r.ParseForm() + formFile, _, err := r.FormFile(key) + if err != nil { + return nil, err + } - { - "Call123TestSpecialTags", - strings.ToUpper("Patch"), - "/v2/another-fake/dummy", - Call123TestSpecialTags, - }, + defer formFile.Close() + file, err := ioutil.TempFile("tmp", key) + if err != nil { + return nil, err + } - { - "FooGet", - strings.ToUpper("Get"), - "/v2/foo", - FooGet, - }, + defer file.Close() + fileBytes, err := ioutil.ReadAll(formFile) + if err != nil { + return nil, err + } - { - "FakeHealthGet", - strings.ToUpper("Get"), - "/v2/fake/health", - FakeHealthGet, - }, - - { - "FakeOuterBooleanSerialize", - strings.ToUpper("Post"), - "/v2/fake/outer/boolean", - FakeOuterBooleanSerialize, - }, - - { - "FakeOuterCompositeSerialize", - strings.ToUpper("Post"), - "/v2/fake/outer/composite", - FakeOuterCompositeSerialize, - }, - - { - "FakeOuterNumberSerialize", - strings.ToUpper("Post"), - "/v2/fake/outer/number", - FakeOuterNumberSerialize, - }, - - { - "FakeOuterStringSerialize", - strings.ToUpper("Post"), - "/v2/fake/outer/string", - FakeOuterStringSerialize, - }, - - { - "TestBodyWithFileSchema", - strings.ToUpper("Put"), - "/v2/fake/body-with-file-schema", - TestBodyWithFileSchema, - }, - - { - "TestBodyWithQueryParams", - strings.ToUpper("Put"), - "/v2/fake/body-with-query-params", - TestBodyWithQueryParams, - }, - - { - "TestClientModel", - strings.ToUpper("Patch"), - "/v2/fake", - TestClientModel, - }, - - { - "TestEndpointParameters", - strings.ToUpper("Post"), - "/v2/fake", - TestEndpointParameters, - }, - - { - "TestEnumParameters", - strings.ToUpper("Get"), - "/v2/fake", - TestEnumParameters, - }, - - { - "TestGroupParameters", - strings.ToUpper("Delete"), - "/v2/fake", - TestGroupParameters, - }, - - { - "TestInlineAdditionalProperties", - strings.ToUpper("Post"), - "/v2/fake/inline-additionalProperties", - TestInlineAdditionalProperties, - }, - - { - "TestJsonFormData", - strings.ToUpper("Get"), - "/v2/fake/jsonFormData", - TestJsonFormData, - }, - - { - "TestQueryParameterCollectionFormat", - strings.ToUpper("Put"), - "/v2/fake/test-query-paramters", - TestQueryParameterCollectionFormat, - }, - - { - "TestClassname", - strings.ToUpper("Patch"), - "/v2/fake_classname_test", - TestClassname, - }, - - { - "AddPet", - strings.ToUpper("Post"), - "/v2/pet", - AddPet, - }, - - { - "DeletePet", - strings.ToUpper("Delete"), - "/v2/pet/{petId}", - DeletePet, - }, - - { - "FindPetsByStatus", - strings.ToUpper("Get"), - "/v2/pet/findByStatus", - FindPetsByStatus, - }, - - { - "FindPetsByTags", - strings.ToUpper("Get"), - "/v2/pet/findByTags", - FindPetsByTags, - }, - - { - "GetPetById", - strings.ToUpper("Get"), - "/v2/pet/{petId}", - GetPetById, - }, - - { - "UpdatePet", - strings.ToUpper("Put"), - "/v2/pet", - UpdatePet, - }, - - { - "UpdatePetWithForm", - strings.ToUpper("Post"), - "/v2/pet/{petId}", - UpdatePetWithForm, - }, - - { - "UploadFile", - strings.ToUpper("Post"), - "/v2/pet/{petId}/uploadImage", - UploadFile, - }, - - { - "UploadFileWithRequiredFile", - strings.ToUpper("Post"), - "/v2/fake/{petId}/uploadImageWithRequiredFile", - UploadFileWithRequiredFile, - }, - - { - "DeleteOrder", - strings.ToUpper("Delete"), - "/v2/store/order/{order_id}", - DeleteOrder, - }, - - { - "GetInventory", - strings.ToUpper("Get"), - "/v2/store/inventory", - GetInventory, - }, - - { - "GetOrderById", - strings.ToUpper("Get"), - "/v2/store/order/{order_id}", - GetOrderById, - }, - - { - "PlaceOrder", - strings.ToUpper("Post"), - "/v2/store/order", - PlaceOrder, - }, - - { - "CreateUser", - strings.ToUpper("Post"), - "/v2/user", - CreateUser, - }, - - { - "CreateUsersWithArrayInput", - strings.ToUpper("Post"), - "/v2/user/createWithArray", - CreateUsersWithArrayInput, - }, - - { - "CreateUsersWithListInput", - strings.ToUpper("Post"), - "/v2/user/createWithList", - CreateUsersWithListInput, - }, - - { - "DeleteUser", - strings.ToUpper("Delete"), - "/v2/user/{username}", - DeleteUser, - }, - - { - "GetUserByName", - strings.ToUpper("Get"), - "/v2/user/{username}", - GetUserByName, - }, - - { - "LoginUser", - strings.ToUpper("Get"), - "/v2/user/login", - LoginUser, - }, - - { - "LogoutUser", - strings.ToUpper("Get"), - "/v2/user/logout", - LogoutUser, - }, - - { - "UpdateUser", - strings.ToUpper("Put"), - "/v2/user/{username}", - UpdateUser, - }, + file.Write(fileBytes) + return file, nil +} + +// parseIntParameter parses a sting parameter to an int64 +func parseIntParameter(param string) (int64, error) { + return strconv.ParseInt(param, 10, 64) } diff --git a/samples/openapi3/server/petstore/go-api-server/main.go b/samples/openapi3/server/petstore/go-api-server/main.go index 235915e27a2..d4444720003 100644 --- a/samples/openapi3/server/petstore/go-api-server/main.go +++ b/samples/openapi3/server/petstore/go-api-server/main.go @@ -13,20 +13,34 @@ import ( "log" "net/http" - // WARNING! - // Change this to a fully-qualified import path - // once you place this file into your project. - // For example, - // - // sw "github.com/myname/myrepo/go" - // - sw "./go" + petstoreserver "github.com/GIT_USER_ID/GIT_REPO_ID/go" ) func main() { log.Printf("Server started") - router := sw.NewRouter() + AnotherFakeApiService := petstoreserver.NewAnotherFakeApiService() + AnotherFakeApiController := petstoreserver.NewAnotherFakeApiController(AnotherFakeApiService) + + DefaultApiService := petstoreserver.NewDefaultApiService() + DefaultApiController := petstoreserver.NewDefaultApiController(DefaultApiService) + + FakeApiService := petstoreserver.NewFakeApiService() + FakeApiController := petstoreserver.NewFakeApiController(FakeApiService) + + FakeClassnameTags123ApiService := petstoreserver.NewFakeClassnameTags123ApiService() + FakeClassnameTags123ApiController := petstoreserver.NewFakeClassnameTags123ApiController(FakeClassnameTags123ApiService) + + PetApiService := petstoreserver.NewPetApiService() + PetApiController := petstoreserver.NewPetApiController(PetApiService) + + StoreApiService := petstoreserver.NewStoreApiService() + StoreApiController := petstoreserver.NewStoreApiController(StoreApiService) + + UserApiService := petstoreserver.NewUserApiService() + UserApiController := petstoreserver.NewUserApiController(UserApiService) + + router := petstoreserver.NewRouter(AnotherFakeApiController, DefaultApiController, FakeApiController, FakeClassnameTags123ApiController, PetApiController, StoreApiController, UserApiController) log.Fatal(http.ListenAndServe(":8080", router)) } diff --git a/samples/openapi3/server/petstore/go-gin-api-server/.openapi-generator/VERSION b/samples/openapi3/server/petstore/go-gin-api-server/.openapi-generator/VERSION index c3a2c7076fa..58592f031f6 100644 --- a/samples/openapi3/server/petstore/go-gin-api-server/.openapi-generator/VERSION +++ b/samples/openapi3/server/petstore/go-gin-api-server/.openapi-generator/VERSION @@ -1 +1 @@ -4.2.0-SNAPSHOT \ No newline at end of file +4.2.3-SNAPSHOT \ No newline at end of file