From 93e0acb3997ca019cbcd72e2cbe3ba4350845c92 Mon Sep 17 00:00:00 2001 From: "Dr. Amr Osman" Date: Tue, 26 Nov 2024 21:14:48 +0200 Subject: [PATCH] check if entity exists before update, delete and read --- .../base/controller/controller.hpp | 5 ++++ .../clientcontroller/clientcontroller.hpp | 7 ++++++ .../entitycontroller/entitycontroller.hpp | 25 ++++++++++++------- .../staffcontroller/staffcontroller.hpp | 2 +- src/entities/base/types.hpp | 2 +- 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/controllers/base/controller/controller.hpp b/src/controllers/base/controller/controller.hpp index b5dd0b2..8c188f7 100644 --- a/src/controllers/base/controller/controller.hpp +++ b/src/controllers/base/controller/controller.hpp @@ -45,6 +45,11 @@ class Controller template void Read(T &entity, CALLBACK_ &&callback) { + if (!entity.template check_id_exists()) + { + callback(HttpStatus::BAD_REQUEST, "ID does not exist"); + return; + } std::optional (T::*sqlstatement)() = &T::getSqlReadStatement; cruds(entity, sqlstatement, dbrexec, std::forward(callback)); } diff --git a/src/controllers/clientcontroller/clientcontroller.hpp b/src/controllers/clientcontroller/clientcontroller.hpp index 7be4b31..38c9ea3 100644 --- a/src/controllers/clientcontroller/clientcontroller.hpp +++ b/src/controllers/clientcontroller/clientcontroller.hpp @@ -107,6 +107,13 @@ void ClientController::Update(CALLBACK_&& callback, std::string_view data, co if (success) { T client(client_data); + + if (!client.template check_id_exists()) + { + callback(HttpStatus::BAD_REQUEST, "ID does not exist"); + return; + } + Controller::Update(client, std::move(callback)); } else diff --git a/src/controllers/entitycontroller/entitycontroller.hpp b/src/controllers/entitycontroller/entitycontroller.hpp index eddbd6a..d948e8d 100644 --- a/src/controllers/entitycontroller/entitycontroller.hpp +++ b/src/controllers/entitycontroller/entitycontroller.hpp @@ -33,21 +33,22 @@ void EntityController::Create(CALLBACK_ &&callback, std::string_view data) api::v2::Global::HttpError error; std::unordered_set exclude; auto next_id = this->template getNextID(error); + if (!next_id.has_value()) { callback(error.code, fmt::format("Failed to generate next ID, {}.", error.message)); return; } - std::optional request_json = jsoncons::json::parse(data); + std::optional request_j = jsoncons::json::parse(data); - if (!request_json.has_value()) + if (!request_j.has_value()) { callback(HttpStatus::Code::BAD_REQUEST, "Invalid request body."); return; } - success = Validator::validateDatabaseCreateSchema(T::getTableName(), request_json, error); + success = Validator::validateDatabaseCreateSchema(T::getTableName(), request_j, error); if (!success) { @@ -55,7 +56,7 @@ void EntityController::Create(CALLBACK_ &&callback, std::string_view data) return; } - Types::Create_t entity_data = Types::Create_t(request_json.value(), next_id.value()); + Types::Create_t entity_data = Types::Create_t(request_j.value(), next_id.value()); T entity(entity_data); @@ -70,12 +71,11 @@ void EntityController::Create(CALLBACK_ &&callback, std::string_view data) template void EntityController::Read(CALLBACK_ &&callback, std::string_view data) { - jsoncons::json request_json; try { - request_json = jsoncons::json::parse(data); - uint64_t id = request_json.at("id").as(); - std::unordered_set schema = request_json.at("schema").as>(); + jsoncons::json request_j = jsoncons::json::parse(data); + uint64_t id = request_j.at("id").as(); + std::unordered_set schema = request_j.at("schema").as>(); api::v2::Global::HttpError error; if (!Validator::validateDatabaseReadSchema(schema, std::format("{}_safe", T::getTableName()), error)) @@ -125,7 +125,14 @@ void EntityController::Update(CALLBACK_ &&callback, std::string_view data, co } Types::Update_t entity_data = Types::Update_t(request_json.value(), id.value()); - T entity(entity_data); + + T entity(entity_data); + + if (!entity.template check_id_exists()) + { + callback(HttpStatus::BAD_REQUEST, "ID does not exist"); + return; + } Controller::Update(entity, std::move(callback)); } diff --git a/src/controllers/staffcontroller/staffcontroller.hpp b/src/controllers/staffcontroller/staffcontroller.hpp index 7fd3be6..a2e4b58 100644 --- a/src/controllers/staffcontroller/staffcontroller.hpp +++ b/src/controllers/staffcontroller/staffcontroller.hpp @@ -79,7 +79,7 @@ void StaffController::InviteStaffToEntity(CALLBACK_ &&callback, std::string_v if (response.has_value()) { - callback(200, response.value()); + callback(HttpStatus::Code::OK, response.value()); } else { diff --git a/src/entities/base/types.hpp b/src/entities/base/types.hpp index 116e9b5..9e0fc09 100644 --- a/src/entities/base/types.hpp +++ b/src/entities/base/types.hpp @@ -295,7 +295,7 @@ class Types StaffData() = default; private: - std::shared_ptr cfg_ = Store::getObject(); + const std::shared_ptr cfg_ = Store::getObject(); const Configurator::ServerConfig &servercfg_ = cfg_->get(); const Configurator::FrontEndConfig &frontendcfg_ = cfg_->get(); };