From eea5e4257372112b1492c042f6ac99e244797dac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D1=82=D0=BE=D0=BD?= Date: Sat, 30 Aug 2025 07:40:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D1=87=D1=82=D0=B8=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=88=D0=B5=D0=BD=D0=BD=D0=B0=D1=8F=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + src/DAO/MySQLUserDAO.cpp | 44 +++++++++++++------ src/DAO/MySQLUserDAO.h | 15 ++++--- .../AuthRegistrationExecutor.h | 40 +++++++++++++++-- src/entities/User.cpp | 5 +++ src/entities/User.h | 2 + 6 files changed, 84 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index e3b5fa0..d56493f 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ ``` { "user": { + "guid": "51351bb1-7563-479d-a8e9-201d0ff934c2" "login": "ivan_89" } } diff --git a/src/DAO/MySQLUserDAO.cpp b/src/DAO/MySQLUserDAO.cpp index a2c8875..917a964 100644 --- a/src/DAO/MySQLUserDAO.cpp +++ b/src/DAO/MySQLUserDAO.cpp @@ -18,24 +18,16 @@ string MySQLUserDAO::Create(const User& created_user) optional MySQLUserDAO::GetByGUID(string guid) { - return nullopt; + mysqlx::SqlResult sql_result = session_.sql("SELECT * FROM `up_and_down`.`users` WHERE (guid = '" + guid + "') LIMIT 1;"s).execute(); + + return GetSingleUserBySQLResult(std::move(sql_result)); } -std::optional MySQLUserDAO::GetByLogin(std::string login) +optional MySQLUserDAO::GetByLogin(string login) { - auto sql_result = session_.sql("SELECT * FROM `up_and_down`.`users` WHERE (login = '" + login + "') LIMIT 1;"s).execute(); - list rows = sql_result.fetchAll(); + mysqlx::SqlResult sql_result = session_.sql("SELECT * FROM `up_and_down`.`users` WHERE (login = '" + login + "') LIMIT 1;"s).execute(); - if (rows.size()) - { - auto row_data = *rows.begin(); - - string replicated_login = row_data[1].get(); - - cout << "SUCCESS!" << endl; - } - - return nullopt; + return GetSingleUserBySQLResult(std::move(sql_result)); } vector MySQLUserDAO::GetAll() @@ -54,4 +46,28 @@ bool MySQLUserDAO::Delete(string id) { return false; } + +std::optional MySQLUserDAO::GetSingleUserBySQLResult(mysqlx::SqlResult&& sql_result) +{ + list rows = sql_result.fetchAll(); + + if (!rows.size()) + { + return nullopt; + } + + auto row_data = *rows.begin(); + + string user_guid = row_data[0].get(); + string user_login = row_data[1].get(); + string user_hashed_password = row_data[2].get(); + + User user; + + user.SetGUID(user_guid); + user.SetLogin(user_login); + user.SetHashedPassword(user_hashed_password); + + return optional(std::move(user)); +} } // uad \ No newline at end of file diff --git a/src/DAO/MySQLUserDAO.h b/src/DAO/MySQLUserDAO.h index 106470c..1a47378 100644 --- a/src/DAO/MySQLUserDAO.h +++ b/src/DAO/MySQLUserDAO.h @@ -10,16 +10,19 @@ class MySQLUserDAO : public IUserDAO public: explicit MySQLUserDAO(mysqlx::Session& session); - std::string Create(const User& created_user); + std::string Create(const User& created_user) override; - std::optional GetByGUID(std::string guid); + std::optional GetByGUID(std::string guid) override; - std::optional GetByLogin(std::string login); + std::optional GetByLogin(std::string login) override; - std::vector GetAll(); + std::vector GetAll() override; - bool Update(const User& u); + bool Update(const User& u) override; - bool Delete(std::string id); + bool Delete(std::string id) override; + +private: + std::optional GetSingleUserBySQLResult(mysqlx::SqlResult&& sql_result); }; } \ No newline at end of file diff --git a/src/endpoints_handlers/AuthRegistrationExecutor.h b/src/endpoints_handlers/AuthRegistrationExecutor.h index 2ead620..2bc2636 100644 --- a/src/endpoints_handlers/AuthRegistrationExecutor.h +++ b/src/endpoints_handlers/AuthRegistrationExecutor.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -41,7 +42,7 @@ public: { http::response res{http::status::bad_request, req.version()}; - res.body() = "{ \"detail\": \"cannot deserialize json\"}"; + res.body() = "{ \"Result\": \"cannot deserialize json\"}"; res.set(http::field::content_type, "application/json"); res.content_length(res.body().size()); @@ -51,8 +52,26 @@ public: std::string login = req_json.as_object().at("login").as_string().c_str(); std::string password = req_json.as_object().at("password").as_string().c_str(); + if (!ValidateLogin(login) || !ValidatePassword(password)) + { + http::response res{http::status::unprocessable_entity, req.version()}; + + res.body() = "{ \"Result\": \"validations failed\"}"; + res.set(http::field::content_type, "application/json"); + res.content_length(res.body().size()); + + return res; + } + if (user_dao_->GetByLogin(login).has_value()) { + http::response res{http::status::conflict, req.version()}; + + res.body() = "{ \"Result\": \"user with login " + login + " exists\" }"; + res.set(http::field::content_type, "application/json"); + res.content_length(res.body().size()); + + return res; } User user; @@ -61,14 +80,29 @@ public: user.SetPassword(password); http::response res{ - http::status::ok, req.version() + http::status::created, req.version() }; - res.body() = "{ \"detail\": \"ok\"}"; + res.body() = "{ \"Result\": \"ok\"}"; res.set(http::field::content_type, "application/json"); res.content_length(res.body().size()); return res; } + +private: + bool ValidateLogin(const std::string& login) + { + if (login.size() < 3 || login.size() > 50) return false; + + std::regex pattern("[a–z0–9._-]"); + + return std::regex_match(login, pattern); + } + + bool ValidatePassword(const std::string& password) + { + return password.size() >= 5; + } }; } diff --git a/src/entities/User.cpp b/src/entities/User.cpp index 8bd8457..2d2d42c 100644 --- a/src/entities/User.cpp +++ b/src/entities/User.cpp @@ -33,6 +33,11 @@ void User::SetPassword(const string& password) hashed_password_ = ToHex((byte*)&calculated_hash, sizeof(calculated_hash)); } +void User::SetHashedPassword(const std::string& hashed_password) +{ + hashed_password_ = hashed_password; +} + const string& User::GetHashedPassword() const noexcept { return hashed_password_; diff --git a/src/entities/User.h b/src/entities/User.h index 424aae3..b33997b 100644 --- a/src/entities/User.h +++ b/src/entities/User.h @@ -22,6 +22,8 @@ public: void SetPassword(const std::string& password); + void SetHashedPassword(const std::string& hashed_password); + [[nodiscard]] const std::string& GetHashedPassword() const noexcept; }; }