diff --git a/src/api/exception-response-handler.cpp b/src/api/exception-response-handler.cpp new file mode 100644 index 0000000..3ee95d0 --- /dev/null +++ b/src/api/exception-response-handler.cpp @@ -0,0 +1,22 @@ +#include "exception-response-handler.h" + +#include + +drogon::HttpResponsePtr ExceptionResponseHandler::handle(const std::string& status, const std::string& message, drogon::HttpStatusCode status_code) +{ + Json::Value responseBody; + responseBody["status"] = status; + responseBody["message"] = message; + + auto response = drogon::HttpResponse::newHttpJsonResponse(responseBody); + response->setStatusCode(status_code); + + return response; +} + +drogon::HttpResponsePtr ExceptionResponseHandler::handle(const std::exception& exception) +{ + LOG_ERROR << "Exception occured: " << exception.what(); + + return ExceptionResponseHandler::handle("error", "Internal server error", drogon::k500InternalServerError); +} diff --git a/src/api/exception-response-handler.h b/src/api/exception-response-handler.h new file mode 100644 index 0000000..6000bb0 --- /dev/null +++ b/src/api/exception-response-handler.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +#include + +class ExceptionResponseHandler +{ +public: + /// @brief Creates a JSON HTTP error response with the specified status and message. + /// @param status Status value included in the JSON response body. + /// @param message Message included in the JSON response body. + /// @param status_code HTTP status code returned to the client. + /// @return JSON HTTP response. + [[nodiscard]] static drogon::HttpResponsePtr handle(const std::string& status, const std::string& message, drogon::HttpStatusCode status_code); + + /// @brief Handles an unexpected exception and creates an internal server error response. + /// @param exception Exception caught while handling an HTTP request. + /// @return HTTP 500 JSON response. + [[nodiscard]] static drogon::HttpResponsePtr handle(const std::exception& exception); +}; \ No newline at end of file diff --git a/src/api/features/to-dos/to-dos-controller.cpp b/src/api/features/to-dos/to-dos-controller.cpp index 5ee7178..fc553b6 100644 --- a/src/api/features/to-dos/to-dos-controller.cpp +++ b/src/api/features/to-dos/to-dos-controller.cpp @@ -1,18 +1,7 @@ #include "to-dos-controller.h" #include "db_connection.h" +#include -// TODO(https://github.com/TourmalineCore/to-dos-api-cpp/issues/25): Create http exception handler or generic class for handling that type of errors -HttpResponsePtr ToDosController::createInternalServerErrorResponse(const std::string& error) const -{ - Json::Value jsonResponse; - jsonResponse["status"] = "Error"; - jsonResponse["message"] = "Internal server error"; - jsonResponse["error"] = error; - - auto resp = HttpResponse::newHttpJsonResponse(jsonResponse); - resp->setStatusCode(k500InternalServerError); - return resp; -} ToDosController::ToDosController() { @@ -48,9 +37,9 @@ void ToDosController::getToDos(const HttpRequestPtr& req, std::functionsetStatusCode(k200OK); callback(resp); } - catch (const std::exception& e) + catch (const std::exception& exception) { - callback(createInternalServerErrorResponse(e.what())); + callback(ExceptionResponseHandler::handle(exception)); } } @@ -79,9 +68,9 @@ void ToDosController::addToDo(const HttpRequestPtr& req, std::functionsetStatusCode(k201Created); callback(resp); } - catch (const std::exception& e) + catch (const std::exception& exception) { - callback(createInternalServerErrorResponse(e.what())); + callback(ExceptionResponseHandler::handle(exception)); } } @@ -114,9 +103,9 @@ void ToDosController::completeToDos(const HttpRequestPtr& req, std::functionsetStatusCode(k200OK); callback(resp); } - catch (const std::exception& e) + catch (const std::exception& exception) { - callback(createInternalServerErrorResponse(e.what())); + callback(ExceptionResponseHandler::handle(exception)); } } @@ -134,8 +123,8 @@ void ToDosController::deleteToDo(const HttpRequestPtr& req, std::functionsetStatusCode(k200OK); callback(resp); } - catch (const std::exception& e) + catch (const std::exception& exception) { - callback(createInternalServerErrorResponse(e.what())); + callback(ExceptionResponseHandler::handle(exception)); } } \ No newline at end of file