If parsing a boolean fails, return a ParsingError instead of a straight 500 (#16910)

Add an example endpoint that covers Required, Default, and Not Required cases
This commit is contained in:
Ian Cubbon 2023-10-28 05:32:04 -07:00 committed by GitHub
parent 244a3b4c13
commit 677b6e64c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 219 additions and 7 deletions

View File

@ -295,7 +295,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithParse[bool](parseBool),{{/required}}{{/defaultValue}} WithParse[bool](parseBool),{{/required}}{{/defaultValue}}
) )
if err != nil { if err != nil {
w.WriteHeader(500) c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return return
} }
{{/isBoolean}} {{/isBoolean}}

View File

@ -710,6 +710,36 @@ paths:
items: items:
type: string type: string
format: binary format: binary
/pets/boolean/parsing:
get:
tags:
- pet
summary: Get the pets by only using boolean query parameters
operationId: GetPetsUsingBooleanQueryParameters
parameters:
- in: query
name: expr
required: true
schema:
type: boolean
- in: query
name: grouping
required: false
schema:
type: boolean
- in: query
name: inactive
required: false
schema:
type: boolean
default: false
responses:
'200':
description: successful operation
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResponse'
externalDocs: externalDocs:
description: Find out more about Swagger description: Find out more about Swagger
url: 'http://swagger.io' url: 'http://swagger.io'

View File

@ -179,7 +179,7 @@ func (c *UserAPIController) DeleteUser(w http.ResponseWriter, r *http.Request) {
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
w.WriteHeader(500) c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return return
} }
result, err := c.service.DeleteUser(r.Context(), usernameParam, booleanTestParam) result, err := c.service.DeleteUser(r.Context(), usernameParam, booleanTestParam)
@ -247,7 +247,7 @@ func (c *UserAPIController) LoginUser(w http.ResponseWriter, r *http.Request) {
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
w.WriteHeader(500) c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return return
} }
result, err := c.service.LoginUser(r.Context(), usernameParam, passwordParam, int32TestParam, int64TestParam, float32TestParam, float64TestParam, booleanTestParam) result, err := c.service.LoginUser(r.Context(), usernameParam, passwordParam, int32TestParam, int64TestParam, float32TestParam, float64TestParam, booleanTestParam)

View File

@ -725,6 +725,42 @@ paths:
summary: uploads images (array of files) summary: uploads images (array of files)
tags: tags:
- pet - pet
/pets/boolean/parsing:
get:
operationId: GetPetsUsingBooleanQueryParameters
parameters:
- explode: true
in: query
name: expr
required: true
schema:
type: boolean
style: form
- explode: true
in: query
name: grouping
required: false
schema:
type: boolean
style: form
- explode: true
in: query
name: inactive
required: false
schema:
default: false
type: boolean
style: form
responses:
"200":
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResponse'
description: successful operation
summary: Get the pets by only using boolean query parameters
tags:
- pet
components: components:
requestBodies: requestBodies:
UserArray: UserArray:

View File

@ -30,6 +30,7 @@ type PetAPIRouter interface {
FindPetsByTags(http.ResponseWriter, *http.Request) FindPetsByTags(http.ResponseWriter, *http.Request)
GetPetById(http.ResponseWriter, *http.Request) GetPetById(http.ResponseWriter, *http.Request)
GetPetImageById(http.ResponseWriter, *http.Request) GetPetImageById(http.ResponseWriter, *http.Request)
GetPetsUsingBooleanQueryParameters(http.ResponseWriter, *http.Request)
UpdatePet(http.ResponseWriter, *http.Request) UpdatePet(http.ResponseWriter, *http.Request)
UpdatePetWithForm(http.ResponseWriter, *http.Request) UpdatePetWithForm(http.ResponseWriter, *http.Request)
UploadFile(http.ResponseWriter, *http.Request) UploadFile(http.ResponseWriter, *http.Request)
@ -72,6 +73,7 @@ type PetAPIServicer interface {
FindPetsByTags(context.Context, []string, time.Time, time.Time) (ImplResponse, error) FindPetsByTags(context.Context, []string, time.Time, time.Time) (ImplResponse, error)
GetPetById(context.Context, int64) (ImplResponse, error) GetPetById(context.Context, int64) (ImplResponse, error)
GetPetImageById(context.Context, int64) (ImplResponse, error) GetPetImageById(context.Context, int64) (ImplResponse, error)
GetPetsUsingBooleanQueryParameters(context.Context, bool, bool, bool) (ImplResponse, error)
UpdatePet(context.Context, Pet) (ImplResponse, error) UpdatePet(context.Context, Pet) (ImplResponse, error)
UpdatePetWithForm(context.Context, int64, string, string) (ImplResponse, error) UpdatePetWithForm(context.Context, int64, string, string) (ImplResponse, error)
UploadFile(context.Context, int64, string, *os.File) (ImplResponse, error) UploadFile(context.Context, int64, string, *os.File) (ImplResponse, error)

View File

@ -85,6 +85,11 @@ func (c *PetAPIController) Routes() Routes {
"/v2/pet/{petId}/uploadImage", "/v2/pet/{petId}/uploadImage",
c.GetPetImageById, c.GetPetImageById,
}, },
"GetPetsUsingBooleanQueryParameters": Route{
strings.ToUpper("Get"),
"/v2/pets/boolean/parsing",
c.GetPetsUsingBooleanQueryParameters,
},
"UpdatePet": Route{ "UpdatePet": Route{
strings.ToUpper("Put"), strings.ToUpper("Put"),
"/v2/pet", "/v2/pet",
@ -289,6 +294,43 @@ func (c *PetAPIController) GetPetImageById(w http.ResponseWriter, r *http.Reques
EncodeJSONResponse(result.Body, &result.Code, result.Headers, w) EncodeJSONResponse(result.Body, &result.Code, result.Headers, w)
} }
// GetPetsUsingBooleanQueryParameters - Get the pets by only using boolean query parameters
func (c *PetAPIController) GetPetsUsingBooleanQueryParameters(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
exprParam, err := parseBoolParameter(
query.Get("expr"),
WithRequire[bool](parseBool),
)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
groupingParam, err := parseBoolParameter(
query.Get("grouping"),
WithParse[bool](parseBool),
)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
inactiveParam, err := parseBoolParameter(
query.Get("inactive"),
WithDefaultOrParse[bool](false, parseBool),
)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
result, err := c.service.GetPetsUsingBooleanQueryParameters(r.Context(), exprParam, groupingParam, inactiveParam)
// If an error occurred, encode the error with the status code
if err != nil {
c.errorHandler(w, r, err, &result)
return
}
// If no error, encode the body and the result code
EncodeJSONResponse(result.Body, &result.Code, result.Headers, w)
}
// UpdatePet - Update an existing pet // UpdatePet - Update an existing pet
func (c *PetAPIController) UpdatePet(w http.ResponseWriter, r *http.Request) { func (c *PetAPIController) UpdatePet(w http.ResponseWriter, r *http.Request) {
petParam := Pet{} petParam := Pet{}

View File

@ -130,6 +130,17 @@ func (s *PetAPIService) GetPetImageById(ctx context.Context, petId int64) (ImplR
return Response(http.StatusNotImplemented, nil), errors.New("GetPetImageById method not implemented") return Response(http.StatusNotImplemented, nil), errors.New("GetPetImageById method not implemented")
} }
// GetPetsUsingBooleanQueryParameters - Get the pets by only using boolean query parameters
func (s *PetAPIService) GetPetsUsingBooleanQueryParameters(ctx context.Context, expr bool, grouping bool, inactive bool) (ImplResponse, error) {
// TODO - update GetPetsUsingBooleanQueryParameters 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.
// TODO: Uncomment the next line to return response Response(200, ApiResponse{}) or use other options such as http.Ok ...
// return Response(200, ApiResponse{}), nil
return Response(http.StatusNotImplemented, nil), errors.New("GetPetsUsingBooleanQueryParameters method not implemented")
}
// UpdatePet - Update an existing pet // UpdatePet - Update an existing pet
func (s *PetAPIService) UpdatePet(ctx context.Context, pet Pet) (ImplResponse, error) { func (s *PetAPIService) UpdatePet(ctx context.Context, pet Pet) (ImplResponse, error) {
// TODO - update UpdatePet with the required logic for this service method. // TODO - update UpdatePet with the required logic for this service method.

View File

@ -180,7 +180,7 @@ func (c *UserAPIController) DeleteUser(w http.ResponseWriter, r *http.Request) {
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
w.WriteHeader(500) c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return return
} }
result, err := c.service.DeleteUser(r.Context(), usernameParam, booleanTestParam) result, err := c.service.DeleteUser(r.Context(), usernameParam, booleanTestParam)
@ -217,7 +217,7 @@ func (c *UserAPIController) LoginUser(w http.ResponseWriter, r *http.Request) {
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
w.WriteHeader(500) c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return return
} }
result, err := c.service.LoginUser(r.Context(), usernameParam, passwordParam, booleanTestParam) result, err := c.service.LoginUser(r.Context(), usernameParam, passwordParam, booleanTestParam)

View File

@ -725,6 +725,42 @@ paths:
summary: uploads images (array of files) summary: uploads images (array of files)
tags: tags:
- pet - pet
/pets/boolean/parsing:
get:
operationId: GetPetsUsingBooleanQueryParameters
parameters:
- explode: true
in: query
name: expr
required: true
schema:
type: boolean
style: form
- explode: true
in: query
name: grouping
required: false
schema:
type: boolean
style: form
- explode: true
in: query
name: inactive
required: false
schema:
default: false
type: boolean
style: form
responses:
"200":
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResponse'
description: successful operation
summary: Get the pets by only using boolean query parameters
tags:
- pet
components: components:
requestBodies: requestBodies:
UserArray: UserArray:

View File

@ -30,6 +30,7 @@ type PetAPIRouter interface {
FindPetsByTags(http.ResponseWriter, *http.Request) FindPetsByTags(http.ResponseWriter, *http.Request)
GetPetById(http.ResponseWriter, *http.Request) GetPetById(http.ResponseWriter, *http.Request)
GetPetImageById(http.ResponseWriter, *http.Request) GetPetImageById(http.ResponseWriter, *http.Request)
GetPetsUsingBooleanQueryParameters(http.ResponseWriter, *http.Request)
UpdatePet(http.ResponseWriter, *http.Request) UpdatePet(http.ResponseWriter, *http.Request)
UpdatePetWithForm(http.ResponseWriter, *http.Request) UpdatePetWithForm(http.ResponseWriter, *http.Request)
UploadFile(http.ResponseWriter, *http.Request) UploadFile(http.ResponseWriter, *http.Request)
@ -72,6 +73,7 @@ type PetAPIServicer interface {
FindPetsByTags(context.Context, []string, time.Time, time.Time) (ImplResponse, error) FindPetsByTags(context.Context, []string, time.Time, time.Time) (ImplResponse, error)
GetPetById(context.Context, int64) (ImplResponse, error) GetPetById(context.Context, int64) (ImplResponse, error)
GetPetImageById(context.Context, int64) (ImplResponse, error) GetPetImageById(context.Context, int64) (ImplResponse, error)
GetPetsUsingBooleanQueryParameters(context.Context, bool, bool, bool) (ImplResponse, error)
UpdatePet(context.Context, Pet) (ImplResponse, error) UpdatePet(context.Context, Pet) (ImplResponse, error)
UpdatePetWithForm(context.Context, int64, string, string) (ImplResponse, error) UpdatePetWithForm(context.Context, int64, string, string) (ImplResponse, error)
UploadFile(context.Context, int64, string, *os.File) (ImplResponse, error) UploadFile(context.Context, int64, string, *os.File) (ImplResponse, error)

View File

@ -85,6 +85,11 @@ func (c *PetAPIController) Routes() Routes {
"/v2/pet/{petId}/uploadImage", "/v2/pet/{petId}/uploadImage",
c.GetPetImageById, c.GetPetImageById,
}, },
"GetPetsUsingBooleanQueryParameters": Route{
strings.ToUpper("Get"),
"/v2/pets/boolean/parsing",
c.GetPetsUsingBooleanQueryParameters,
},
"UpdatePet": Route{ "UpdatePet": Route{
strings.ToUpper("Put"), strings.ToUpper("Put"),
"/v2/pet", "/v2/pet",
@ -285,6 +290,43 @@ func (c *PetAPIController) GetPetImageById(w http.ResponseWriter, r *http.Reques
EncodeJSONResponse(result.Body, &result.Code, result.Headers, w) EncodeJSONResponse(result.Body, &result.Code, result.Headers, w)
} }
// GetPetsUsingBooleanQueryParameters - Get the pets by only using boolean query parameters
func (c *PetAPIController) GetPetsUsingBooleanQueryParameters(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
exprParam, err := parseBoolParameter(
query.Get("expr"),
WithRequire[bool](parseBool),
)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
groupingParam, err := parseBoolParameter(
query.Get("grouping"),
WithParse[bool](parseBool),
)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
inactiveParam, err := parseBoolParameter(
query.Get("inactive"),
WithDefaultOrParse[bool](false, parseBool),
)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
result, err := c.service.GetPetsUsingBooleanQueryParameters(r.Context(), exprParam, groupingParam, inactiveParam)
// If an error occurred, encode the error with the status code
if err != nil {
c.errorHandler(w, r, err, &result)
return
}
// If no error, encode the body and the result code
EncodeJSONResponse(result.Body, &result.Code, result.Headers, w)
}
// UpdatePet - Update an existing pet // UpdatePet - Update an existing pet
func (c *PetAPIController) UpdatePet(w http.ResponseWriter, r *http.Request) { func (c *PetAPIController) UpdatePet(w http.ResponseWriter, r *http.Request) {
petParam := Pet{} petParam := Pet{}

View File

@ -130,6 +130,17 @@ func (s *PetAPIService) GetPetImageById(ctx context.Context, petId int64) (ImplR
return Response(http.StatusNotImplemented, nil), errors.New("GetPetImageById method not implemented") return Response(http.StatusNotImplemented, nil), errors.New("GetPetImageById method not implemented")
} }
// GetPetsUsingBooleanQueryParameters - Get the pets by only using boolean query parameters
func (s *PetAPIService) GetPetsUsingBooleanQueryParameters(ctx context.Context, expr bool, grouping bool, inactive bool) (ImplResponse, error) {
// TODO - update GetPetsUsingBooleanQueryParameters 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.
// TODO: Uncomment the next line to return response Response(200, ApiResponse{}) or use other options such as http.Ok ...
// return Response(200, ApiResponse{}), nil
return Response(http.StatusNotImplemented, nil), errors.New("GetPetsUsingBooleanQueryParameters method not implemented")
}
// UpdatePet - Update an existing pet // UpdatePet - Update an existing pet
func (s *PetAPIService) UpdatePet(ctx context.Context, pet Pet) (ImplResponse, error) { func (s *PetAPIService) UpdatePet(ctx context.Context, pet Pet) (ImplResponse, error) {
// TODO - update UpdatePet with the required logic for this service method. // TODO - update UpdatePet with the required logic for this service method.

View File

@ -179,7 +179,7 @@ func (c *UserAPIController) DeleteUser(w http.ResponseWriter, r *http.Request) {
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
w.WriteHeader(500) c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return return
} }
result, err := c.service.DeleteUser(r.Context(), usernameParam, booleanTestParam) result, err := c.service.DeleteUser(r.Context(), usernameParam, booleanTestParam)
@ -215,7 +215,7 @@ func (c *UserAPIController) LoginUser(w http.ResponseWriter, r *http.Request) {
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
w.WriteHeader(500) c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return return
} }
result, err := c.service.LoginUser(r.Context(), usernameParam, passwordParam, booleanTestParam) result, err := c.service.LoginUser(r.Context(), usernameParam, passwordParam, booleanTestParam)