From 39b1625fb53bb51e200bcf0e0bdeee2bd1173631 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D1=82=D0=BE=D0=BD?= Date: Mon, 25 Aug 2025 19:11:08 +0300 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=B0=D0=B7=D0=BE=D0=B2=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D0=BB=D0=B5=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B8=20executor'=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 2 + .../AuthRegistrationExecutor.h | 26 ++++++++++ src/endpoints_handlers/Controller.h | 2 +- src/endpoints_handlers/HandleRequest.h | 49 ++++++++++++++----- src/endpoints_handlers/IController.h | 12 +---- src/endpoints_handlers/IExecutor.h | 16 ++++++ 6 files changed, 85 insertions(+), 22 deletions(-) create mode 100644 src/endpoints_handlers/AuthRegistrationExecutor.h create mode 100644 src/endpoints_handlers/IExecutor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 4317d2c..b68146e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,8 @@ add_executable(App ./src/main.cpp ./src/entities/User.h ./src/DAO/MySQLUserDAO.cpp ./src/DAO/MySQLUserDAO.h + src/endpoints_handlers/IExecutor.h + src/endpoints_handlers/AuthRegistrationExecutor.h ) target_link_libraries(App PRIVATE Boost::boost Threads::Threads mysql::concpp) diff --git a/src/endpoints_handlers/AuthRegistrationExecutor.h b/src/endpoints_handlers/AuthRegistrationExecutor.h new file mode 100644 index 0000000..5e6933c --- /dev/null +++ b/src/endpoints_handlers/AuthRegistrationExecutor.h @@ -0,0 +1,26 @@ +#pragma once + +#include "IExecutor.h" + +namespace uad +{ +template +class AuthRegistrationExecutor : public IExecutor +{ +public: + boost::beast::http::response operator ()( + boost::beast::http::request>&& req + ) override + { + boost::beast::http::response res{ + boost::beast::http::status::ok, req.version() + }; + + res.body() = "{ \"detail\": \"ok\"}"; + res.set(boost::beast::http::field::content_type, "application/json"); + res.content_length(res.body().size()); + + return res; + } +}; +} diff --git a/src/endpoints_handlers/Controller.h b/src/endpoints_handlers/Controller.h index aad7b75..f28124c 100644 --- a/src/endpoints_handlers/Controller.h +++ b/src/endpoints_handlers/Controller.h @@ -7,7 +7,7 @@ namespace uad { template -class Controller : IController +class Controller : public IController { public: using HTTPMethodsToExecutors = std::unordered_map>>; diff --git a/src/endpoints_handlers/HandleRequest.h b/src/endpoints_handlers/HandleRequest.h index 5f9b2e7..0ecd3e7 100644 --- a/src/endpoints_handlers/HandleRequest.h +++ b/src/endpoints_handlers/HandleRequest.h @@ -1,7 +1,11 @@ #pragma once +#include + #include +#include "Controller.h" +#include "AuthRegistrationExecutor.h" #include "./../helpers/helpers.h" namespace uad @@ -11,10 +15,18 @@ void HandleRequest( boost::beast::string_view doc_root, boost::beast::http::request>&& req, Send&& send) { + using IRouteExecutor = IExecutor; + using RouteAuthRegistrationExecutor = AuthRegistrationExecutor< + Body, Allocator, boost::beast::http::string_body>; + using IRouteController = IController; + using RouteController = Controller; + using RoutesPathes = std::unordered_map>; + auto const bad_request = [&req](boost::beast::string_view why) { boost::beast::http::response res{ - boost::beast::http::status::bad_request, req.version()}; + boost::beast::http::status::bad_request, req.version() + }; res.set(boost::beast::http::field::server, BOOST_BEAST_VERSION_STRING); res.set(boost::beast::http::field::content_type, "text/html"); res.keep_alive(req.keep_alive()); @@ -26,7 +38,8 @@ void HandleRequest( auto const not_found = [&req](boost::beast::string_view target) { boost::beast::http::response res{ - boost::beast::http::status::not_found, req.version()}; + boost::beast::http::status::not_found, req.version() + }; res.set(boost::beast::http::field::server, BOOST_BEAST_VERSION_STRING); res.set(boost::beast::http::field::content_type, "text/html"); res.keep_alive(req.keep_alive()); @@ -38,7 +51,8 @@ void HandleRequest( auto const server_error = [&req](boost::beast::string_view what) { boost::beast::http::response res{ - boost::beast::http::status::internal_server_error, req.version()}; + boost::beast::http::status::internal_server_error, req.version() + }; res.set(boost::beast::http::field::server, BOOST_BEAST_VERSION_STRING); res.set(boost::beast::http::field::content_type, "text/html"); res.keep_alive(req.keep_alive()); @@ -47,14 +61,24 @@ void HandleRequest( return res; }; - // /v1/api/MyOwnUrl?query=123 // посмотреть парсер url'ов + static RoutesPathes routes_pathes; + + typename RouteController::HTTPMethodsToExecutors auth_registration_executors; + + auth_registration_executors[boost::beast::http::verb::post] = std::make_shared< + RouteAuthRegistrationExecutor>(RouteAuthRegistrationExecutor()); + + std::unique_ptr auth_registration_controller = + std::make_unique(std::move(auth_registration_executors)); + + routes_pathes["/api/v1/Auth/Register"] = std::move(auth_registration_controller); if (req.method() != boost::beast::http::verb::get && - req.method() != boost::beast::http::verb::head) + req.method() != boost::beast::http::verb::head) return send(bad_request("Unknown boost::beast::HTTP-method")); if (req.target().empty() || req.target()[0] != '/' || - req.target().find("..") != boost::beast::string_view::npos) + req.target().find("..") != boost::beast::string_view::npos) return send(bad_request("Illegal request-target")); std::string path = PathCat(doc_root, req.target()); @@ -75,8 +99,10 @@ void HandleRequest( if (req.method() == boost::beast::http::verb::head) { - boost::beast::http::response res{boost::beast::http::status::ok, - req.version()}; + boost::beast::http::response res{ + boost::beast::http::status::ok, + req.version() + }; res.set(boost::beast::http::field::server, BOOST_BEAST_VERSION_STRING); res.set(boost::beast::http::field::content_type, MimeType(path)); res.content_length(size); @@ -85,12 +111,13 @@ void HandleRequest( } boost::beast::http::response res{ - std::piecewise_construct, std::make_tuple(std::move(body)), - std::make_tuple(boost::beast::http::status::ok, req.version())}; + std::piecewise_construct, std::make_tuple(std::move(body)), + std::make_tuple(boost::beast::http::status::ok, req.version()) + }; res.set(boost::beast::http::field::server, BOOST_BEAST_VERSION_STRING); res.set(boost::beast::http::field::content_type, MimeType(path)); res.content_length(size); res.keep_alive(req.keep_alive()); return send(std::move(res)); } -} // namespace uad +} diff --git a/src/endpoints_handlers/IController.h b/src/endpoints_handlers/IController.h index b67d0c8..fae82bc 100644 --- a/src/endpoints_handlers/IController.h +++ b/src/endpoints_handlers/IController.h @@ -2,18 +2,10 @@ #include +#include "IExecutor.h" + namespace uad { -template -class IExecutor -{ -public: - virtual boost::beast::http::response operator ()( - boost::beast::http::request>&& req - ) = 0; - virtual ~IExecutor() = default; -}; - template class IController { diff --git a/src/endpoints_handlers/IExecutor.h b/src/endpoints_handlers/IExecutor.h new file mode 100644 index 0000000..7142c59 --- /dev/null +++ b/src/endpoints_handlers/IExecutor.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +namespace uad +{ +template +class IExecutor +{ +public: + virtual boost::beast::http::response operator ()( + boost::beast::http::request>&& req + ) = 0; + virtual ~IExecutor() = default; +}; +}