--- TrackablesApi_origin.cpp 2024-05-17 13:51:16.050339055 +0200 +++ TrackablesApi.cpp 2024-05-17 11:14:41.058333100 +0200 @@ -20,9 +20,12 @@ #include #include #include - +#include +#include #include "TrackablesApi.h" + + namespace org { namespace openapitools { namespace server { @@ -80,6 +83,13 @@ boost::property_tree::json_parser::read_json(sstream, pt); auto model = MODEL_T(pt); + + if constexpr(std::is_same_v) { + auto unitStr = pt.get("unit", ""); + UnitSystem unit; + unit.fromString(unitStr);// Convertir unitStr en UnitSystem + model.setUnit(unit); + } return model; } @@ -159,88 +169,102 @@ session->close(status, result, { {"Connection", "close"} }); } +void extractBodyContentAsync( + const std::shared_ptr& session, + int content_length, + std::function callback) +{ + session->fetch(content_length, + [callback](const std::shared_ptr session, + const restbed::Bytes &body) { + std::string bodyContent = restbed::String::format( + "%.*s\n", (int)body.size(), body.data()); + callback(bodyContent); + }); +} + void TrackablesResource::handler_POST_internal(const std::shared_ptr session) { const auto request = session->get_request(); - // body params or form params here from the body content string - std::string bodyContent = extractBodyContent(session); - auto trackable = extractJsonModelBodyParam(bodyContent); - // Getting the headers - std::string token = request->get_header("token", ""); - - int status_code = 500; - std::string resultObject = ""; - std::string result = ""; - - try { - std::tie(status_code, resultObject) = - handler_POST(trackable, token); - } - catch(const TrackablesApiException& e) { - std::tie(status_code, result) = handleTrackablesApiException(e); - } - catch(const std::exception& e) { - std::tie(status_code, result) = handleStdException(e); - } - catch(...) { - std::tie(status_code, result) = handleUnspecifiedException(); - } - - std::multimap< std::string, std::string > responseHeaders {}; - static const std::vector contentTypes{ - "text/plain","application/json", - }; - static const std::string acceptTypes{ - "application/json, " - }; - - if (status_code == 200) { - responseHeaders.insert(std::make_pair("Content-Type", selectPreferredContentType(contentTypes))); - if (!acceptTypes.empty()) { - responseHeaders.insert(std::make_pair("Accept", acceptTypes)); - } - - result = resultObject; - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); - return; - } - if (status_code == 201) { - responseHeaders.insert(std::make_pair("Content-Type", selectPreferredContentType(contentTypes))); - if (!acceptTypes.empty()) { - responseHeaders.insert(std::make_pair("Accept", acceptTypes)); - } - - result = resultObject; - returnResponse(session, 201, result.empty() ? "{}" : result, responseHeaders); - return; - } - if (status_code == 400) { - responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); - result = "Bad request."; - - result = resultObject; - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); - return; - } - if (status_code == 409) { - responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); - result = "Invalid UUID, id must be a Nil value."; - - result = resultObject; - returnResponse(session, 409, result.empty() ? "{}" : result, responseHeaders); - return; - } - if (status_code == 0) { - responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); - result = "Unexpected error."; - - result = resultObject.toJsonString(); - returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); - return; - } - defaultSessionClose(session, status_code, result); - - + int content_length = request->get_header("Content-Length", 0); + extractBodyContentAsync(session, content_length, [this, session,request](const std::string& bodyContent) { + + + std::string token = request->get_header("token", ""); + + int status_code = 500; + std::string resultObject = ""; + std::string result = ""; + + auto trackable = extractJsonModelBodyParam(bodyContent); + + try { + std::tie(status_code, resultObject) = + handler_POST(trackable, token); + } + catch (const TrackablesApiException& e) { + std::tie(status_code, result) = handleTrackablesApiException(e); + } + catch (const std::exception& e) { + std::tie(status_code, result) = handleStdException(e); + } + catch (...) { + std::tie(status_code, result) = handleUnspecifiedException(); + } + + std::multimap< std::string, std::string > responseHeaders {}; + static const std::vector contentTypes{ + "text/plain","application/json", + }; + static const std::string acceptTypes{ + "application/json, " + }; + + if (status_code == 200) { + responseHeaders.insert(std::make_pair("Content-Type", selectPreferredContentType(contentTypes))); + if (!acceptTypes.empty()) { + responseHeaders.insert(std::make_pair("Accept", acceptTypes)); + } + + auto result = resultObject; + returnResponse(session, 200, result, responseHeaders); + return; + } + if (status_code == 201) { + responseHeaders.insert(std::make_pair("Content-Type", selectPreferredContentType(contentTypes))); + if (!acceptTypes.empty()) { + responseHeaders.insert(std::make_pair("Accept", acceptTypes)); + } + + auto result = resultObject; + returnResponse(session, 201, result, responseHeaders); + return; + } + if (status_code == 400) { + responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); + result = "Bad request."; + + auto result = resultObject; + returnResponse(session, 400, result, responseHeaders); + return; + } + if (status_code == 409) { + responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); + result = "Invalid UUID, id must be a Nil value."; + + auto result = resultObject; + returnResponse(session, 409, result, responseHeaders); + return; + } + if (status_code == 0) { + responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); + result = "Unexpected error."; + + returnResponse(session, 0, result, responseHeaders); + return; + } + defaultSessionClose(session, status_code, result); + }); } // x-extension @@ -279,8 +303,11 @@ if (!acceptTypes.empty()) { responseHeaders.insert(std::make_pair("Accept", acceptTypes)); } - - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); + std::string rep; + for (const Trackable& item : resultObject) { + rep += item.toJsonString() + ",\n"; + } + returnResponse(session, 200, rep, responseHeaders); return; } if (status_code == 201) { @@ -288,17 +315,20 @@ if (!acceptTypes.empty()) { responseHeaders.insert(std::make_pair("Accept", acceptTypes)); } - - result = resultObject; - returnResponse(session, 201, result.empty() ? "{}" : result, responseHeaders); + std::string rep; + for (const Trackable& item : resultObject) { + rep += item.toJsonString() + ",\n"; + } + + returnResponse(session, 201, rep, responseHeaders); return; } if (status_code == 0) { responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Unexpected error."; - result = resultObject.toJsonString(); - returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); + + returnResponse(session, 0, result, responseHeaders); return; } defaultSessionClose(session, status_code, result); @@ -308,8 +338,11 @@ // x-extension void TrackablesResource::handler_PUT_internal(const std::shared_ptr session) { const auto request = session->get_request(); + int content_length = request->get_header("Content-Length", 0); + // body params or form params here from the body content string - std::string bodyContent = extractBodyContent(session); + extractBodyContentAsync(session, content_length, [this, session,request](const std::string& bodyContent) { + auto trackable = extractJsonModelBodyParam(bodyContent); // Getting the headers std::string token = request->get_header("token", ""); @@ -346,7 +379,6 @@ responseHeaders.insert(std::make_pair("Accept", acceptTypes)); } - result = resultObject; returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); return; } @@ -362,21 +394,19 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Not found, could not find UUID in database."; - result = resultObject; - returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 404, result, responseHeaders); return; } if (status_code == 0) { responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Unexpected error."; - result = resultObject.toJsonString(); - returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); + returnResponse(session, 0, result, responseHeaders); return; } defaultSessionClose(session, status_code, result); - - + }); } std::pair TrackablesResource::handler_POST( @@ -396,18 +426,24 @@ return handler_PUT_func(trackable, token); } -std::string TrackablesResource::extractBodyContent(const std::shared_ptr& session) { - const auto request = session->get_request(); - int content_length = request->get_header("Content-Length", 0); - std::string bodyContent; - session->fetch(content_length, + + +std::string TrackablesResource::extractBodyContent( + const std::shared_ptr& session) { + const auto request = session->get_request(); + int content_length = request->get_header("Content-Length", 0); + + std::string bodyContent; + session->fetch(content_length, [&bodyContent](const std::shared_ptr session, const restbed::Bytes &body) { bodyContent = restbed::String::format( "%.*s\n", (int)body.size(), body.data()); }); - return bodyContent; + return bodyContent; } + + std::string TrackablesResource::extractFormParamsFromBody(const std::string& paramName, const std::string& body) { const auto uri = restbed::Uri("urlencoded?" + body, true); @@ -499,24 +535,24 @@ responseHeaders.insert(std::make_pair("Accept", acceptTypes)); } - result = resultObject; - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 200, result, responseHeaders); return; } if (status_code == 400) { responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Invalid UUID supplied."; - result = resultObject; - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 400,"{}", responseHeaders); return; } if (status_code == 404) { responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Not found, could not find UUID in database."; - result = resultObject; - returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 404, "{}", responseHeaders); return; } defaultSessionClose(session, status_code, result); @@ -564,23 +600,23 @@ } result = resultObject.toJsonString(); - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); + returnResponse(session, 200,result, responseHeaders); return; } if (status_code == 400) { responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Invalid UUID supplied."; - result = resultObject; - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 400, "{}", responseHeaders); return; } if (status_code == 404) { responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Not found, could not find UUID in database."; - result = resultObject; - returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 404, "{}", responseHeaders); return; } defaultSessionClose(session, status_code, result);