From 2a9c482b419943322c3cb6416153b25d83e26efc Mon Sep 17 00:00:00 2001 From: Ian Cubbon Date: Fri, 6 Oct 2023 11:23:30 -0700 Subject: [PATCH 1/6] Add support for DateTime objects in the Path, Query Params, and as a List --- .../go-server/controller-api.mustache | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache b/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache index 00fec257d6e8..02ec03639825 100644 --- a/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache +++ b/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache @@ -168,6 +168,13 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re return } {{/isInteger}} + {{#isDateTime}} + {{paramName}}Param, err := time.Parse(time.RFC3339, {{#routers}}{{#mux}}params["{{baseName}}"]{{/mux}}{{#chi}}chi.URLParam(r, "{{baseName}}"){{/chi}}{{/routers}}) + if err != nil { + c.errorHandler(w, r, &ParsingError{Err: err}, nil) + return + } + {{/isDateTime}} {{^isNumber}} {{^isFloat}} {{^isDouble}} @@ -181,6 +188,26 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re {{/isNumber}} {{/isPathParam}} {{#isQueryParam}} + {{#isDateTime}} + {{#required}} + {{paramName}}Param, err := time.Parse(time.RFC3339, query.Get("{{baseName}}")) + if err != nil { + c.errorHandler(w, r, &ParsingError{Err: err}, nil) + return + } + {{/required}} + {{^required}} + var {{paramName}}Param *time.Time + if query.Has("{{baseName}}") { + param, err := time.Parse(time.RFC3339, query.Get("{{baseName}}")) + if err != nil { + c.errorHandler(w, r, &ParsingError{Err: err}, nil) + return + } + {{paramName}}Param = ¶m + } + {{/required}} + {{/isDateTime}} {{#isNumber}} {{paramName}}Param, err := parseNumericParameter[float32]( query.Get("{{baseName}}"),{{#defaultValue}} @@ -323,7 +350,18 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re c.errorHandler(w, r, &ParsingError{Err: err}, nil) return } - {{/items.isInteger}} + {{/items.isInteger}} + {{#items.isDateTime}} + var {{paramName}}Param []time.Time + for t := range strings.Split(query.Get("{{baseName}}"), ",") { + parsedTime, err := time.Parse(time.RFC3339, t) + if err != nil { + c.errorHandler(w, r, &ParsingError{Err: err}, nil) + return + } + {{paramName}}Param = append({{paramName}}Param, parsedTime) + } + {{/items.isDateTime}} {{^items.isNumber}} {{^items.isFloat}} {{^items.isDouble}} From 5157c88907d0b92e216711d41740c295da10e4f6 Mon Sep 17 00:00:00 2001 From: Ian Cubbon Date: Fri, 6 Oct 2023 11:31:18 -0700 Subject: [PATCH 2/6] Fix indentation --- .../go-server/controller-api.mustache | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache b/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache index 02ec03639825..2c9dea282cfb 100644 --- a/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache +++ b/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache @@ -192,19 +192,19 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re {{#required}} {{paramName}}Param, err := time.Parse(time.RFC3339, query.Get("{{baseName}}")) if err != nil { - c.errorHandler(w, r, &ParsingError{Err: err}, nil) - return + c.errorHandler(w, r, &ParsingError{Err: err}, nil) + return } {{/required}} {{^required}} var {{paramName}}Param *time.Time if query.Has("{{baseName}}") { - param, err := time.Parse(time.RFC3339, query.Get("{{baseName}}")) - if err != nil { - c.errorHandler(w, r, &ParsingError{Err: err}, nil) - return - } - {{paramName}}Param = ¶m + param, err := time.Parse(time.RFC3339, query.Get("{{baseName}}")) + if err != nil { + c.errorHandler(w, r, &ParsingError{Err: err}, nil) + return + } + {{paramName}}Param = ¶m } {{/required}} {{/isDateTime}} @@ -354,12 +354,12 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re {{#items.isDateTime}} var {{paramName}}Param []time.Time for t := range strings.Split(query.Get("{{baseName}}"), ",") { - parsedTime, err := time.Parse(time.RFC3339, t) - if err != nil { - c.errorHandler(w, r, &ParsingError{Err: err}, nil) - return - } - {{paramName}}Param = append({{paramName}}Param, parsedTime) + parsedTime, err := time.Parse(time.RFC3339, t) + if err != nil { + c.errorHandler(w, r, &ParsingError{Err: err}, nil) + return + } + {{paramName}}Param = append({{paramName}}Param, parsedTime) } {{/items.isDateTime}} {{^items.isNumber}} From 06db75f0f249c8d3828d911a4d0a3f4c63e7068b Mon Sep 17 00:00:00 2001 From: Ian Cubbon Date: Wed, 11 Oct 2023 18:24:38 -0700 Subject: [PATCH 3/6] Add an exaple that has dateTimes Move the date parsing into a common util in the routers.go file. --- .../go-server/controller-api.mustache | 34 +++++++++---------- .../main/resources/go-server/routers.mustache | 22 ++++++++++++ .../resources/3_0/go-server/petstore.yaml | 18 ++++++++++ .../petstore/go/go-petstore/go/routers.go | 22 ++++++++++++ .../petstore/go-api-server/api/openapi.yaml | 18 ++++++++++ .../server/petstore/go-api-server/go/api.go | 3 +- .../petstore/go-api-server/go/api_pet.go | 16 ++++++++- .../go-api-server/go/api_pet_service.go | 3 +- .../petstore/go-api-server/go/routers.go | 22 ++++++++++++ .../petstore/go-chi-server/api/openapi.yaml | 18 ++++++++++ .../server/petstore/go-chi-server/go/api.go | 3 +- .../petstore/go-chi-server/go/api_pet.go | 16 ++++++++- .../go-chi-server/go/api_pet_service.go | 3 +- .../petstore/go-chi-server/go/routers.go | 22 ++++++++++++ 14 files changed, 196 insertions(+), 24 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache b/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache index 2c9dea282cfb..6616b70bee94 100644 --- a/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache +++ b/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache @@ -190,21 +190,21 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re {{#isQueryParam}} {{#isDateTime}} {{#required}} - {{paramName}}Param, err := time.Parse(time.RFC3339, query.Get("{{baseName}}")) + if !query.Has("{{baseName}}"){ + c.ErrorHandler(w, r, errors.New(errMsgRequiredMissing), nil) + return + } + {{paramName}}Param, err := parseTime(query.Get("{{baseName}}")) if err != nil { c.errorHandler(w, r, &ParsingError{Err: err}, nil) return } {{/required}} {{^required}} - var {{paramName}}Param *time.Time - if query.Has("{{baseName}}") { - param, err := time.Parse(time.RFC3339, query.Get("{{baseName}}")) - if err != nil { - c.errorHandler(w, r, &ParsingError{Err: err}, nil) - return - } - {{paramName}}Param = ¶m + {{paramName}}Param, err := parseTime(query.Get("{{baseName}}")) + if err != nil { + c.errorHandler(w, r, &ParsingError{Err: err}, nil) + return } {{/required}} {{/isDateTime}} @@ -350,16 +350,12 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re c.errorHandler(w, r, &ParsingError{Err: err}, nil) return } - {{/items.isInteger}} + {{/items.isInteger}} {{#items.isDateTime}} - var {{paramName}}Param []time.Time - for t := range strings.Split(query.Get("{{baseName}}"), ",") { - parsedTime, err := time.Parse(time.RFC3339, t) - if err != nil { - c.errorHandler(w, r, &ParsingError{Err: err}, nil) - return - } - {{paramName}}Param = append({{paramName}}Param, parsedTime) + {{paramName}}Param, err := parseTimes(query.Get("{{baseName"}})) + if err != nil { + c.errorHandler(w, r, &ParsingError{Err: err}, nil) + return } {{/items.isDateTime}} {{^items.isNumber}} @@ -381,6 +377,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re {{^isInteger}} {{^isBoolean}} {{^isArray}} + {{^isDateTime}} {{#defaultValue}} {{paramName}}Param := "{{defaultValue}}" if query.Has("{{baseName}}") { @@ -390,6 +387,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re {{^defaultValue}} {{paramName}}Param := query.Get("{{baseName}}") {{/defaultValue}} + {{/isDateTime}} {{/isArray}} {{/isBoolean}} {{/isInteger}} diff --git a/modules/openapi-generator/src/main/resources/go-server/routers.mustache b/modules/openapi-generator/src/main/resources/go-server/routers.mustache index 166eb257f8a8..56bc95edb08b 100644 --- a/modules/openapi-generator/src/main/resources/go-server/routers.mustache +++ b/modules/openapi-generator/src/main/resources/go-server/routers.mustache @@ -4,6 +4,7 @@ package {{packageName}} import ( "encoding/json" "errors" + "time" {{#routers}} {{#mux}} "github.com/gorilla/mux" @@ -170,6 +171,27 @@ func readFileHeaderToTempFile(fileHeader *multipart.FileHeader) (*os.File, error return file, nil } +func parseTimes(param string) ([]time.Time, error) { + splits := strings.Split(param, ", ") + times := make([]time.Time, 0, len(splits)) + for _, v := range splits { + t, err := parseTime(v) + if err != nil { + return nil, err + } + times = append(times, t) + } + return times, nil +} + +// parseTime will parses a string parameter into a time.Time using the RFC3339 format +func parseTime(param string) (time.Time, error) { + if param == "" { + return time.Time{}, nil + } + return time.Parse(time.RFC3339, param) +} + type Number interface { ~int32 | ~int64 | ~float32 | ~float64 } diff --git a/modules/openapi-generator/src/test/resources/3_0/go-server/petstore.yaml b/modules/openapi-generator/src/test/resources/3_0/go-server/petstore.yaml index fce2c52cbde4..97d3a7b38724 100644 --- a/modules/openapi-generator/src/test/resources/3_0/go-server/petstore.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/go-server/petstore.yaml @@ -137,6 +137,24 @@ paths: type: array items: type: string + - name: bornAfter + in: query + description: Find pets born after this date + required: true + style: form + explode: false + schema: + type: string + format: date-time + - name: bornBefore + in: query + description: Find pets born before this date + required: false + style: form + explode: false + schema: + type: string + format: date-time responses: '200': description: successful operation diff --git a/samples/openapi3/server/petstore/go/go-petstore/go/routers.go b/samples/openapi3/server/petstore/go/go-petstore/go/routers.go index af326677bf45..b436aeb8aa67 100644 --- a/samples/openapi3/server/petstore/go/go-petstore/go/routers.go +++ b/samples/openapi3/server/petstore/go/go-petstore/go/routers.go @@ -12,6 +12,7 @@ package petstoreserver import ( "encoding/json" "errors" + "time" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "io/ioutil" @@ -134,6 +135,27 @@ func readFileHeaderToTempFile(fileHeader *multipart.FileHeader) (*os.File, error return file, nil } +func parseTimes(param string) ([]time.Time, error) { + splits := strings.Split(param, ", ") + times := make([]time.Time, 0, len(splits)) + for _, v := range splits { + t, err := parseTime(v) + if err != nil { + return nil, err + } + times = append(times, t) + } + return times, nil +} + +// parseTime will parses a string parameter into a time.Time using the RFC3339 format +func parseTime(param string) (time.Time, error) { + if param == "" { + return time.Time{}, nil + } + return time.Parse(time.RFC3339, param) +} + type Number interface { ~int32 | ~int64 | ~float32 | ~float64 } diff --git a/samples/server/petstore/go-api-server/api/openapi.yaml b/samples/server/petstore/go-api-server/api/openapi.yaml index cc433a6afd59..8fe202fa18b6 100644 --- a/samples/server/petstore/go-api-server/api/openapi.yaml +++ b/samples/server/petstore/go-api-server/api/openapi.yaml @@ -136,6 +136,24 @@ paths: type: string type: array style: form + - description: Find pets born after this date + explode: false + in: query + name: bornAfter + required: true + schema: + format: date-time + type: string + style: form + - description: Find pets born before this date + explode: false + in: query + name: bornBefore + required: false + schema: + format: date-time + type: string + style: form responses: "200": content: diff --git a/samples/server/petstore/go-api-server/go/api.go b/samples/server/petstore/go-api-server/go/api.go index 0f6f14dea75f..27f6518f6c4e 100644 --- a/samples/server/petstore/go-api-server/go/api.go +++ b/samples/server/petstore/go-api-server/go/api.go @@ -12,6 +12,7 @@ package petstoreserver import ( "context" "net/http" + "time" "os" ) @@ -64,7 +65,7 @@ type PetAPIServicer interface { DeletePet(context.Context, int64, string) (ImplResponse, error) FindPetsByStatus(context.Context, []string) (ImplResponse, error) // Deprecated - FindPetsByTags(context.Context, []string) (ImplResponse, error) + FindPetsByTags(context.Context, []string, time.Time, time.Time) (ImplResponse, error) GetPetById(context.Context, int64) (ImplResponse, error) UpdatePet(context.Context, Pet) (ImplResponse, error) UpdatePetWithForm(context.Context, int64, string, string) (ImplResponse, error) diff --git a/samples/server/petstore/go-api-server/go/api_pet.go b/samples/server/petstore/go-api-server/go/api_pet.go index 0161ba41d6cf..125485d0f7a1 100644 --- a/samples/server/petstore/go-api-server/go/api_pet.go +++ b/samples/server/petstore/go-api-server/go/api_pet.go @@ -161,7 +161,21 @@ func (c *PetAPIController) FindPetsByStatus(w http.ResponseWriter, r *http.Reque func (c *PetAPIController) FindPetsByTags(w http.ResponseWriter, r *http.Request) { query := r.URL.Query() tagsParam := strings.Split(query.Get("tags"), ",") - result, err := c.service.FindPetsByTags(r.Context(), tagsParam) + if !query.Has("bornAfter"){ + c.ErrorHandler(w, r, errors.New(errMsgRequiredMissing), nil) + return + } + bornAfterParam, err := parseTime(query.Get("bornAfter")) + if err != nil { + c.errorHandler(w, r, &ParsingError{Err: err}, nil) + return + } + bornBeforeParam, err := parseTime(query.Get("bornBefore")) + if err != nil { + c.errorHandler(w, r, &ParsingError{Err: err}, nil) + return + } + result, err := c.service.FindPetsByTags(r.Context(), tagsParam, bornAfterParam, bornBeforeParam) // If an error occurred, encode the error with the status code if err != nil { c.errorHandler(w, r, err, &result) diff --git a/samples/server/petstore/go-api-server/go/api_pet_service.go b/samples/server/petstore/go-api-server/go/api_pet_service.go index bda4cd897526..5be09861b100 100644 --- a/samples/server/petstore/go-api-server/go/api_pet_service.go +++ b/samples/server/petstore/go-api-server/go/api_pet_service.go @@ -13,6 +13,7 @@ import ( "context" "net/http" "errors" + "time" "os" ) @@ -68,7 +69,7 @@ func (s *PetAPIService) FindPetsByStatus(ctx context.Context, status []string) ( // FindPetsByTags - Finds Pets by tags // Deprecated -func (s *PetAPIService) FindPetsByTags(ctx context.Context, tags []string) (ImplResponse, error) { +func (s *PetAPIService) FindPetsByTags(ctx context.Context, tags []string, bornAfter time.Time, bornBefore time.Time) (ImplResponse, error) { // TODO - update FindPetsByTags with the required logic for this service method. // Add api_pet_service.go to the .openapi-generator-ignore to avoid overwriting this service implementation when updating open api generation. diff --git a/samples/server/petstore/go-api-server/go/routers.go b/samples/server/petstore/go-api-server/go/routers.go index 1fb27970fdcc..987c41856903 100644 --- a/samples/server/petstore/go-api-server/go/routers.go +++ b/samples/server/petstore/go-api-server/go/routers.go @@ -12,6 +12,7 @@ package petstoreserver import ( "encoding/json" "errors" + "time" "github.com/gorilla/mux" "io/ioutil" "mime/multipart" @@ -138,6 +139,27 @@ func readFileHeaderToTempFile(fileHeader *multipart.FileHeader) (*os.File, error return file, nil } +func parseTimes(param string) ([]time.Time, error) { + splits := strings.Split(param, ", ") + times := make([]time.Time, 0, len(splits)) + for _, v := range splits { + t, err := parseTime(v) + if err != nil { + return nil, err + } + times = append(times, t) + } + return times, nil +} + +// parseTime will parses a string parameter into a time.Time using the RFC3339 format +func parseTime(param string) (time.Time, error) { + if param == "" { + return time.Time{}, nil + } + return time.Parse(time.RFC3339, param) +} + type Number interface { ~int32 | ~int64 | ~float32 | ~float64 } diff --git a/samples/server/petstore/go-chi-server/api/openapi.yaml b/samples/server/petstore/go-chi-server/api/openapi.yaml index cc433a6afd59..8fe202fa18b6 100644 --- a/samples/server/petstore/go-chi-server/api/openapi.yaml +++ b/samples/server/petstore/go-chi-server/api/openapi.yaml @@ -136,6 +136,24 @@ paths: type: string type: array style: form + - description: Find pets born after this date + explode: false + in: query + name: bornAfter + required: true + schema: + format: date-time + type: string + style: form + - description: Find pets born before this date + explode: false + in: query + name: bornBefore + required: false + schema: + format: date-time + type: string + style: form responses: "200": content: diff --git a/samples/server/petstore/go-chi-server/go/api.go b/samples/server/petstore/go-chi-server/go/api.go index 0f6f14dea75f..27f6518f6c4e 100644 --- a/samples/server/petstore/go-chi-server/go/api.go +++ b/samples/server/petstore/go-chi-server/go/api.go @@ -12,6 +12,7 @@ package petstoreserver import ( "context" "net/http" + "time" "os" ) @@ -64,7 +65,7 @@ type PetAPIServicer interface { DeletePet(context.Context, int64, string) (ImplResponse, error) FindPetsByStatus(context.Context, []string) (ImplResponse, error) // Deprecated - FindPetsByTags(context.Context, []string) (ImplResponse, error) + FindPetsByTags(context.Context, []string, time.Time, time.Time) (ImplResponse, error) GetPetById(context.Context, int64) (ImplResponse, error) UpdatePet(context.Context, Pet) (ImplResponse, error) UpdatePetWithForm(context.Context, int64, string, string) (ImplResponse, error) diff --git a/samples/server/petstore/go-chi-server/go/api_pet.go b/samples/server/petstore/go-chi-server/go/api_pet.go index 0efd81a77e9f..59d3b13e2bcc 100644 --- a/samples/server/petstore/go-chi-server/go/api_pet.go +++ b/samples/server/petstore/go-chi-server/go/api_pet.go @@ -160,7 +160,21 @@ func (c *PetAPIController) FindPetsByStatus(w http.ResponseWriter, r *http.Reque func (c *PetAPIController) FindPetsByTags(w http.ResponseWriter, r *http.Request) { query := r.URL.Query() tagsParam := strings.Split(query.Get("tags"), ",") - result, err := c.service.FindPetsByTags(r.Context(), tagsParam) + if !query.Has("bornAfter"){ + c.ErrorHandler(w, r, errors.New(errMsgRequiredMissing), nil) + return + } + bornAfterParam, err := parseTime(query.Get("bornAfter")) + if err != nil { + c.errorHandler(w, r, &ParsingError{Err: err}, nil) + return + } + bornBeforeParam, err := parseTime(query.Get("bornBefore")) + if err != nil { + c.errorHandler(w, r, &ParsingError{Err: err}, nil) + return + } + result, err := c.service.FindPetsByTags(r.Context(), tagsParam, bornAfterParam, bornBeforeParam) // If an error occurred, encode the error with the status code if err != nil { c.errorHandler(w, r, err, &result) diff --git a/samples/server/petstore/go-chi-server/go/api_pet_service.go b/samples/server/petstore/go-chi-server/go/api_pet_service.go index bda4cd897526..5be09861b100 100644 --- a/samples/server/petstore/go-chi-server/go/api_pet_service.go +++ b/samples/server/petstore/go-chi-server/go/api_pet_service.go @@ -13,6 +13,7 @@ import ( "context" "net/http" "errors" + "time" "os" ) @@ -68,7 +69,7 @@ func (s *PetAPIService) FindPetsByStatus(ctx context.Context, status []string) ( // FindPetsByTags - Finds Pets by tags // Deprecated -func (s *PetAPIService) FindPetsByTags(ctx context.Context, tags []string) (ImplResponse, error) { +func (s *PetAPIService) FindPetsByTags(ctx context.Context, tags []string, bornAfter time.Time, bornBefore time.Time) (ImplResponse, error) { // TODO - update FindPetsByTags with the required logic for this service method. // Add api_pet_service.go to the .openapi-generator-ignore to avoid overwriting this service implementation when updating open api generation. diff --git a/samples/server/petstore/go-chi-server/go/routers.go b/samples/server/petstore/go-chi-server/go/routers.go index af326677bf45..b436aeb8aa67 100644 --- a/samples/server/petstore/go-chi-server/go/routers.go +++ b/samples/server/petstore/go-chi-server/go/routers.go @@ -12,6 +12,7 @@ package petstoreserver import ( "encoding/json" "errors" + "time" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "io/ioutil" @@ -134,6 +135,27 @@ func readFileHeaderToTempFile(fileHeader *multipart.FileHeader) (*os.File, error return file, nil } +func parseTimes(param string) ([]time.Time, error) { + splits := strings.Split(param, ", ") + times := make([]time.Time, 0, len(splits)) + for _, v := range splits { + t, err := parseTime(v) + if err != nil { + return nil, err + } + times = append(times, t) + } + return times, nil +} + +// parseTime will parses a string parameter into a time.Time using the RFC3339 format +func parseTime(param string) (time.Time, error) { + if param == "" { + return time.Time{}, nil + } + return time.Parse(time.RFC3339, param) +} + type Number interface { ~int32 | ~int64 | ~float32 | ~float64 } From ef87f753a7a244c888399e08e57fd7b51ba37e2a Mon Sep 17 00:00:00 2001 From: Ian Cubbon Date: Wed, 11 Oct 2023 18:31:16 -0700 Subject: [PATCH 4/6] Fix compilation issue and regen --- .../src/main/resources/go-server/controller-api.mustache | 2 +- samples/server/petstore/go-api-server/go/api_pet.go | 2 +- samples/server/petstore/go-chi-server/go/api_pet.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache b/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache index 6616b70bee94..4c85ffd9ccff 100644 --- a/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache +++ b/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache @@ -191,7 +191,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re {{#isDateTime}} {{#required}} if !query.Has("{{baseName}}"){ - c.ErrorHandler(w, r, errors.New(errMsgRequiredMissing), nil) + c.errorHandler(w, r, errors.New(errMsgRequiredMissing), nil) return } {{paramName}}Param, err := parseTime(query.Get("{{baseName}}")) diff --git a/samples/server/petstore/go-api-server/go/api_pet.go b/samples/server/petstore/go-api-server/go/api_pet.go index 125485d0f7a1..57c19929636b 100644 --- a/samples/server/petstore/go-api-server/go/api_pet.go +++ b/samples/server/petstore/go-api-server/go/api_pet.go @@ -162,7 +162,7 @@ func (c *PetAPIController) FindPetsByTags(w http.ResponseWriter, r *http.Request query := r.URL.Query() tagsParam := strings.Split(query.Get("tags"), ",") if !query.Has("bornAfter"){ - c.ErrorHandler(w, r, errors.New(errMsgRequiredMissing), nil) + c.errorHandler(w, r, errors.New(errMsgRequiredMissing), nil) return } bornAfterParam, err := parseTime(query.Get("bornAfter")) diff --git a/samples/server/petstore/go-chi-server/go/api_pet.go b/samples/server/petstore/go-chi-server/go/api_pet.go index 59d3b13e2bcc..54c69aab93b1 100644 --- a/samples/server/petstore/go-chi-server/go/api_pet.go +++ b/samples/server/petstore/go-chi-server/go/api_pet.go @@ -161,7 +161,7 @@ func (c *PetAPIController) FindPetsByTags(w http.ResponseWriter, r *http.Request query := r.URL.Query() tagsParam := strings.Split(query.Get("tags"), ",") if !query.Has("bornAfter"){ - c.ErrorHandler(w, r, errors.New(errMsgRequiredMissing), nil) + c.errorHandler(w, r, errors.New(errMsgRequiredMissing), nil) return } bornAfterParam, err := parseTime(query.Get("bornAfter")) From 19aec8700d5e631c0d8e7154da53e28316204222 Mon Sep 17 00:00:00 2001 From: Ian Cubbon Date: Wed, 11 Oct 2023 18:53:45 -0700 Subject: [PATCH 5/6] Use the `RequiredError` to handle this case --- .../src/main/resources/go-server/controller-api.mustache | 2 +- samples/server/petstore/go-api-server/go/api_pet.go | 2 +- samples/server/petstore/go-chi-server/go/api_pet.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache b/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache index 4c85ffd9ccff..69d69b5803fb 100644 --- a/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache +++ b/modules/openapi-generator/src/main/resources/go-server/controller-api.mustache @@ -191,7 +191,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re {{#isDateTime}} {{#required}} if !query.Has("{{baseName}}"){ - c.errorHandler(w, r, errors.New(errMsgRequiredMissing), nil) + c.errorHandler(w, r, &RequiredError{"{{baseName}}"}, nil) return } {{paramName}}Param, err := parseTime(query.Get("{{baseName}}")) diff --git a/samples/server/petstore/go-api-server/go/api_pet.go b/samples/server/petstore/go-api-server/go/api_pet.go index 57c19929636b..ccbb64036266 100644 --- a/samples/server/petstore/go-api-server/go/api_pet.go +++ b/samples/server/petstore/go-api-server/go/api_pet.go @@ -162,7 +162,7 @@ func (c *PetAPIController) FindPetsByTags(w http.ResponseWriter, r *http.Request query := r.URL.Query() tagsParam := strings.Split(query.Get("tags"), ",") if !query.Has("bornAfter"){ - c.errorHandler(w, r, errors.New(errMsgRequiredMissing), nil) + c.errorHandler(w, r, &RequiredError{"bornAfter"}, nil) return } bornAfterParam, err := parseTime(query.Get("bornAfter")) diff --git a/samples/server/petstore/go-chi-server/go/api_pet.go b/samples/server/petstore/go-chi-server/go/api_pet.go index 54c69aab93b1..87c87ec327f9 100644 --- a/samples/server/petstore/go-chi-server/go/api_pet.go +++ b/samples/server/petstore/go-chi-server/go/api_pet.go @@ -161,7 +161,7 @@ func (c *PetAPIController) FindPetsByTags(w http.ResponseWriter, r *http.Request query := r.URL.Query() tagsParam := strings.Split(query.Get("tags"), ",") if !query.Has("bornAfter"){ - c.errorHandler(w, r, errors.New(errMsgRequiredMissing), nil) + c.errorHandler(w, r, &RequiredError{"bornAfter"}, nil) return } bornAfterParam, err := parseTime(query.Get("bornAfter")) From ebb3148165994b4ec7975da0e8185c03d364166c Mon Sep 17 00:00:00 2001 From: Ian Cubbon Date: Sun, 15 Oct 2023 08:50:21 -0700 Subject: [PATCH 6/6] Only split on a "," and not an extra 'space' after the ",". --- .../src/main/resources/go-server/routers.mustache | 2 +- samples/openapi3/server/petstore/go/go-petstore/go/routers.go | 2 +- samples/server/petstore/go-api-server/go/routers.go | 2 +- samples/server/petstore/go-chi-server/go/routers.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/go-server/routers.mustache b/modules/openapi-generator/src/main/resources/go-server/routers.mustache index 56bc95edb08b..d7eedcc683c5 100644 --- a/modules/openapi-generator/src/main/resources/go-server/routers.mustache +++ b/modules/openapi-generator/src/main/resources/go-server/routers.mustache @@ -172,7 +172,7 @@ func readFileHeaderToTempFile(fileHeader *multipart.FileHeader) (*os.File, error } func parseTimes(param string) ([]time.Time, error) { - splits := strings.Split(param, ", ") + splits := strings.Split(param, ",") times := make([]time.Time, 0, len(splits)) for _, v := range splits { t, err := parseTime(v) diff --git a/samples/openapi3/server/petstore/go/go-petstore/go/routers.go b/samples/openapi3/server/petstore/go/go-petstore/go/routers.go index b436aeb8aa67..cb447ef8327f 100644 --- a/samples/openapi3/server/petstore/go/go-petstore/go/routers.go +++ b/samples/openapi3/server/petstore/go/go-petstore/go/routers.go @@ -136,7 +136,7 @@ func readFileHeaderToTempFile(fileHeader *multipart.FileHeader) (*os.File, error } func parseTimes(param string) ([]time.Time, error) { - splits := strings.Split(param, ", ") + splits := strings.Split(param, ",") times := make([]time.Time, 0, len(splits)) for _, v := range splits { t, err := parseTime(v) diff --git a/samples/server/petstore/go-api-server/go/routers.go b/samples/server/petstore/go-api-server/go/routers.go index 987c41856903..194eaaf57eb5 100644 --- a/samples/server/petstore/go-api-server/go/routers.go +++ b/samples/server/petstore/go-api-server/go/routers.go @@ -140,7 +140,7 @@ func readFileHeaderToTempFile(fileHeader *multipart.FileHeader) (*os.File, error } func parseTimes(param string) ([]time.Time, error) { - splits := strings.Split(param, ", ") + splits := strings.Split(param, ",") times := make([]time.Time, 0, len(splits)) for _, v := range splits { t, err := parseTime(v) diff --git a/samples/server/petstore/go-chi-server/go/routers.go b/samples/server/petstore/go-chi-server/go/routers.go index b436aeb8aa67..cb447ef8327f 100644 --- a/samples/server/petstore/go-chi-server/go/routers.go +++ b/samples/server/petstore/go-chi-server/go/routers.go @@ -136,7 +136,7 @@ func readFileHeaderToTempFile(fileHeader *multipart.FileHeader) (*os.File, error } func parseTimes(param string) ([]time.Time, error) { - splits := strings.Split(param, ", ") + splits := strings.Split(param, ",") times := make([]time.Time, 0, len(splits)) for _, v := range splits { t, err := parseTime(v)