From 5346bb2849e378a799487e32125351e8edef741c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D1=82=D0=BE=D0=BD?= Date: Sat, 4 Oct 2025 09:54:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BC=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 8 ++--- src/endpoints_handlers/AuthLoginExecutor.h | 11 +++--- src/endpoints_handlers/AuthLogoutExecutor.h | 10 +++--- .../AuthRegistrationExecutor.h | 11 +++--- src/endpoints_handlers/RootExecutor.h | 36 ++----------------- src/exceptions/exception400_bad_request.cpp | 18 ---------- src/exceptions/exception400_bad_request.h | 16 --------- src/exceptions/exception409_conflict.cpp | 18 ---------- src/exceptions/exception409_conflict.h | 16 --------- .../exception422_unprocessable_entity.cpp | 18 ---------- .../exception422_unprocessable_entity.h | 16 --------- src/exceptions/session_exception.cpp | 11 ++++++ src/exceptions/session_exception.h | 20 +++++++++++ 13 files changed, 51 insertions(+), 158 deletions(-) delete mode 100644 src/exceptions/exception400_bad_request.cpp delete mode 100644 src/exceptions/exception400_bad_request.h delete mode 100644 src/exceptions/exception409_conflict.cpp delete mode 100644 src/exceptions/exception409_conflict.h delete mode 100644 src/exceptions/exception422_unprocessable_entity.cpp delete mode 100644 src/exceptions/exception422_unprocessable_entity.h create mode 100644 src/exceptions/session_exception.cpp create mode 100644 src/exceptions/session_exception.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 37febb4..1c5227c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,12 +48,8 @@ add_executable(App ./src/main.cpp ./src/DAO/MemoryAuthDAO.cpp ./src/DAO/MemoryAuthDAO.h ./src/endpoints_handlers/AuthLogoutExecutor.h - ./src/exceptions/exception400_bad_request.cpp - ./src/exceptions/exception400_bad_request.h - ./src/exceptions/exception409_conflict.cpp - ./src/exceptions/exception409_conflict.h - ./src/exceptions/exception422_unprocessable_entity.cpp - ./src/exceptions/exception422_unprocessable_entity.h + ./src/exceptions/session_exception.cpp + ./src/exceptions/session_exception.h ) target_link_libraries(App PRIVATE Boost::boost Boost::json Threads::Threads mysql::concpp) diff --git a/src/endpoints_handlers/AuthLoginExecutor.h b/src/endpoints_handlers/AuthLoginExecutor.h index 7694d88..12f8056 100644 --- a/src/endpoints_handlers/AuthLoginExecutor.h +++ b/src/endpoints_handlers/AuthLoginExecutor.h @@ -10,8 +10,7 @@ #include "../DAO/IUserDAO.h" #include "../DAO/IAuthDAO.h" #include "../helpers/helpers.h" -#include "../exceptions/exception400_bad_request.h" -#include "../exceptions/exception422_unprocessable_entity.h" +#include "../exceptions/session_exception.h" namespace uad { @@ -48,7 +47,7 @@ public: } catch (const system::system_error& err) { - throw exception400_bad_request("cannot deserialize json"); + throw session_exception(http::status::bad_request, "cannot deserialize json"); } @@ -57,14 +56,14 @@ public: if (login.empty() || password.empty()) { - throw exception422_unprocessable_entity("Login or password are empty"s); + throw session_exception(http::status::unprocessable_entity, "Login or password are empty"s); } const std::optional maybe_user = user_dao_->GetByLogin(login); - if (!maybe_user.has_value() || maybe_user.value().hashed_password != HashPassword(password)) + if (!maybe_user.has_value() && maybe_user.value().hashed_password != HashPassword(password)) { - throw exception422_unprocessable_entity("Incorrect login or password"); + throw session_exception(http::status::forbidden,"Incorrect login or password"); } const std::string token = GenerateUUID(); auth_dao_->Login(maybe_user.value().uuid, token); diff --git a/src/endpoints_handlers/AuthLogoutExecutor.h b/src/endpoints_handlers/AuthLogoutExecutor.h index f0f73e9..f543d0c 100644 --- a/src/endpoints_handlers/AuthLogoutExecutor.h +++ b/src/endpoints_handlers/AuthLogoutExecutor.h @@ -21,14 +21,14 @@ class AuthLogoutExecutor : public IExecutor public: AuthLogoutExecutor(mysqlx::Session& session, - const std::shared_ptr& auth_dao) - : session_(session), auth_dao_(auth_dao) + const std::shared_ptr& auth_dao) : + session_(session), auth_dao_(auth_dao) { } boost::beast::http::response operator ()( boost::beast::http::request>&& req - ) override + ) override { using namespace boost; using namespace boost::json; @@ -44,14 +44,14 @@ public: } catch (const system::system_error& err) { - throw exception400_bad_request("cannot deserialize json"s); + throw session_exception(http::status::internal_server_error, "cannot deserialize json"s); } const std::string token = req_json.as_object().at("token").as_string().c_str(); if (!auth_dao_->Logout(token)) { - throw exception400_bad_request("token is not authorized"s); + throw session_exception(http::status::bad_request, "token is not authorized"s); } http::response res{http::status::ok, req.version()}; diff --git a/src/endpoints_handlers/AuthRegistrationExecutor.h b/src/endpoints_handlers/AuthRegistrationExecutor.h index 436441d..673e980 100644 --- a/src/endpoints_handlers/AuthRegistrationExecutor.h +++ b/src/endpoints_handlers/AuthRegistrationExecutor.h @@ -8,9 +8,7 @@ #include "IExecutor.h" #include "../DAO/IUserDAO.h" -#include "../exceptions/exception400_bad_request.h" -#include "../exceptions/exception409_conflict.h" -#include "../exceptions/exception422_unprocessable_entity.h" +#include "../exceptions/session_exception.h" namespace uad { @@ -45,7 +43,7 @@ public: } catch (const system::system_error& err) { - throw exception400_bad_request("cannot deserialize json"); + throw session_exception(http::status::bad_request, "cannot deserialize json"); } const std::string login = req_json.as_object().at("login").as_string().c_str(); @@ -53,14 +51,15 @@ public: if (!ValidateLogin(login) || !ValidatePassword(password)) { - throw exception422_unprocessable_entity( + throw session_exception( + http::status::unprocessable_entity, "Validations failed. Login should have length from 3 to 50. Password from 5 characters length."s ); } if (user_dao_->GetByLogin(login).has_value()) { - throw exception409_conflict("user with login "s + login + " exists"s); + throw session_exception(http::status::conflict, "user with login "s + login + " exists"s); } user user; diff --git a/src/endpoints_handlers/RootExecutor.h b/src/endpoints_handlers/RootExecutor.h index 53e1ca8..27cacfc 100644 --- a/src/endpoints_handlers/RootExecutor.h +++ b/src/endpoints_handlers/RootExecutor.h @@ -10,9 +10,7 @@ #include "../DAO/IUserDAO.h" #include "../DAO/IAuthDAO.h" #include "./../helpers/helpers.h" -#include "./../exceptions/exception400_bad_request.h" -#include "./../exceptions/exception409_conflict.h" -#include "./../exceptions/exception422_unprocessable_entity.h" +#include "./../exceptions/session_exception.h" namespace uad { @@ -96,37 +94,9 @@ public: return send(std::move(res)); } - catch (const exception400_bad_request& e) + catch (const session_exception& e) { - boost::beast::http::response res{boost::beast::http::status::bad_request, req.version()}; - boost::json::value response_body; - - response_body.emplace_object(); - response_body.as_object().emplace("Result", e.what()); - - res.body() = serialize(response_body); - res.set(boost::beast::http::field::content_type, "application/json"); - res.content_length(res.body().size()); - - return send(std::move(res)); - } - catch (const exception409_conflict& e) - { - boost::beast::http::response res{boost::beast::http::status::conflict, req.version()}; - boost::json::value response_body; - - response_body.emplace_object(); - response_body.as_object().emplace("Result", e.what()); - - res.body() = serialize(response_body); - res.set(boost::beast::http::field::content_type, "application/json"); - res.content_length(res.body().size()); - - return send(std::move(res)); - } - catch (const exception422_unprocessable_entity& e) - { - boost::beast::http::response res{boost::beast::http::status::unprocessable_entity, req.version()}; + boost::beast::http::response res{e.code, req.version()}; boost::json::value response_body; response_body.emplace_object(); diff --git a/src/exceptions/exception400_bad_request.cpp b/src/exceptions/exception400_bad_request.cpp deleted file mode 100644 index 5df2403..0000000 --- a/src/exceptions/exception400_bad_request.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "exception400_bad_request.h" - -#include - -using namespace std; -using namespace std::literals; - -namespace uad -{ -exception400_bad_request::exception400_bad_request(const string& info): message_(info) -{ -} - -char const* exception400_bad_request::what() const -{ - return message_.c_str(); -} -} diff --git a/src/exceptions/exception400_bad_request.h b/src/exceptions/exception400_bad_request.h deleted file mode 100644 index c52ecac..0000000 --- a/src/exceptions/exception400_bad_request.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include -#include - -namespace uad -{ -struct exception400_bad_request : std::exception -{ -private: - std::string message_; -public: - exception400_bad_request(const std::string& info); - char const* what() const override; -}; -} diff --git a/src/exceptions/exception409_conflict.cpp b/src/exceptions/exception409_conflict.cpp deleted file mode 100644 index 4f387f9..0000000 --- a/src/exceptions/exception409_conflict.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "exception409_conflict.h" - -#include - -using namespace std; -using namespace std::literals; - -namespace uad -{ -exception409_conflict::exception409_conflict(const string& info): message_(info) -{ -} - -char const* exception409_conflict::what() const -{ - return message_.c_str(); -} -} diff --git a/src/exceptions/exception409_conflict.h b/src/exceptions/exception409_conflict.h deleted file mode 100644 index b930ef3..0000000 --- a/src/exceptions/exception409_conflict.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include -#include - -namespace uad -{ -struct exception409_conflict : std::exception -{ -private: - std::string message_; -public: - exception409_conflict(const std::string& info); - char const* what() const override; -}; -} diff --git a/src/exceptions/exception422_unprocessable_entity.cpp b/src/exceptions/exception422_unprocessable_entity.cpp deleted file mode 100644 index bd9b9f6..0000000 --- a/src/exceptions/exception422_unprocessable_entity.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "exception422_unprocessable_entity.h" - -#include - -using namespace std; -using namespace std::literals; - -namespace uad -{ -exception422_unprocessable_entity::exception422_unprocessable_entity(const string& info): message_(info) -{ -} - -char const* exception422_unprocessable_entity::what() const -{ - return message_.c_str(); -} -} diff --git a/src/exceptions/exception422_unprocessable_entity.h b/src/exceptions/exception422_unprocessable_entity.h deleted file mode 100644 index 2d80b4d..0000000 --- a/src/exceptions/exception422_unprocessable_entity.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include -#include - -namespace uad -{ -struct exception422_unprocessable_entity : std::exception -{ -private: - std::string message_; -public: - exception422_unprocessable_entity(const std::string& info); - char const* what() const override; -}; -} diff --git a/src/exceptions/session_exception.cpp b/src/exceptions/session_exception.cpp new file mode 100644 index 0000000..83a883f --- /dev/null +++ b/src/exceptions/session_exception.cpp @@ -0,0 +1,11 @@ +#include "session_exception.h" + +using namespace std; + +namespace uad +{ +char const* session_exception::what() const +{ + return message.c_str(); +} +} \ No newline at end of file diff --git a/src/exceptions/session_exception.h b/src/exceptions/session_exception.h new file mode 100644 index 0000000..4ae3926 --- /dev/null +++ b/src/exceptions/session_exception.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include +#include + +namespace uad +{ +struct session_exception : std::exception +{ + const boost::beast::http::status code; + const std::string comment; + const std::string message; + + session_exception(const boost::beast::http::status ec, const std::string info) + : code(ec), comment(info), message(std::to_string(static_cast(ec)) + " - " + comment) + {} + char const* what() const override; +}; +}