Skip to content

Commit

Permalink
Add optional default-value for QUERY parameters to ease the implement…
Browse files Browse the repository at this point in the history
…ation of optional QUERY parameters.
  • Loading branch information
Benedikt-Alexander Mokroß committed Jan 12, 2021
1 parent 6b44135 commit 5502a0c
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 0 deletions.
14 changes: 14 additions & 0 deletions src/oatpp/codegen/api_controller/base_define.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,17 @@ if(!__param_validation_check_##NAME){ \
"'. Expected type is '" #TYPE "'"); \
}

#define OATPP_MACRO_API_CONTROLLER_QUERY_3(TYPE, NAME, QUALIFIER, DEFAULT) \
const auto& __param_str_val_##NAME = __request->getQueryParameter(QUALIFIER, DEFAULT); \
bool __param_validation_check_##NAME; \
const auto& NAME = ApiController::TypeInterpretation<TYPE>::fromString(#TYPE, __param_str_val_##NAME, __param_validation_check_##NAME); \
if(!__param_validation_check_##NAME){ \
return ApiController::handleError(Status::CODE_400, \
oatpp::String("Invalid QUERY parameter '") + \
QUALIFIER + \
"'. Expected type is '" #TYPE "'"); \
}

#define OATPP_MACRO_API_CONTROLLER_QUERY(TYPE, PARAM_LIST) \
OATPP_MACRO_API_CONTROLLER_MACRO_SELECTOR(OATPP_MACRO_API_CONTROLLER_QUERY_, TYPE, OATPP_MACRO_UNFOLD_VA_ARGS PARAM_LIST)

Expand All @@ -197,6 +208,9 @@ info->queryParams.add(#NAME, TYPE::Class::getType());
#define OATPP_MACRO_API_CONTROLLER_QUERY_INFO_2(TYPE, NAME, QUALIFIER) \
info->queryParams.add(QUALIFIER, TYPE::Class::getType());

#define OATPP_MACRO_API_CONTROLLER_QUERY_INFO_3(TYPE, NAME, QUALIFIER, DEFAULT) \
info->queryParams.add(QUALIFIER, TYPE::Class::getType());

#define OATPP_MACRO_API_CONTROLLER_QUERY_INFO(TYPE, PARAM_LIST) \
OATPP_MACRO_API_CONTROLLER_MACRO_SELECTOR(OATPP_MACRO_API_CONTROLLER_QUERY_INFO_, TYPE, OATPP_MACRO_UNFOLD_VA_ARGS PARAM_LIST)

Expand Down
8 changes: 8 additions & 0 deletions test/oatpp/web/FullTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,14 @@ void FullTest::onRun() {
OATPP_ASSERT(dto->testValue == "name=oatpp&age=1");
}

{ // test GET with optional query parameters
auto response = client->getWithOptQueries("oatpp", connection);
OATPP_ASSERT(response->getStatusCode() == 200);
auto dto = response->readBodyToDto<oatpp::Object<app::TestDto>>(objectMapper.get());
OATPP_ASSERT(dto);
OATPP_ASSERT(dto->testValue == "name=oatpp&age=101");
}

{ // test GET with query parameters
auto response = client->getWithQueriesMap("value1", 32, 0.32f, connection);
OATPP_ASSERT(response->getStatusCode() == 200);
Expand Down
1 change: 1 addition & 0 deletions test/oatpp/web/app/Client.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ class Client : public oatpp::web::client::ApiClient {
API_CALL("GET", "/cors-origin-methods-headers", getCorsOriginMethodsHeader)
API_CALL("GET", "params/{param}", getWithParams, PATH(String, param))
API_CALL("GET", "queries", getWithQueries, QUERY(String, name), QUERY(Int32, age))
API_CALL("GET", "queries/optional", getWithOptQueries, QUERY(String, name))
API_CALL("GET", "queries/map", getWithQueriesMap, QUERY(String, key1), QUERY(Int32, key2), QUERY(Float32, key3))
API_CALL("GET", "headers", getWithHeaders, HEADER(String, param, "X-TEST-HEADER"))
API_CALL("POST", "body", postBody, BODY_STRING(String, body))
Expand Down
7 changes: 7 additions & 0 deletions test/oatpp/web/app/Controller.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,13 @@ class Controller : public oatpp::web::server::api::ApiController {
return createDtoResponse(Status::CODE_200, dto);
}

ENDPOINT("GET", "queries/optional", getWithOptQueries,
QUERY(String, name, "name", "Default"), QUERY(Int32, age, "age", "101")) {
auto dto = TestDto::createShared();
dto->testValue = "name=" + name + "&age=" + oatpp::utils::conversion::int32ToStr(*age);
return createDtoResponse(Status::CODE_200, dto);
}

ENDPOINT("GET", "queries/map", getWithQueriesMap,
QUERIES(QueryParams, queries)) {
auto dto = TestDto::createShared();
Expand Down

0 comments on commit 5502a0c

Please sign in to comment.