From 21d80d8b73c2502cd3bdc8c3be2fac43bc013559 Mon Sep 17 00:00:00 2001 From: wen2so Date: Wed, 16 Jul 2025 21:43:43 +0800 Subject: [PATCH 1/3] feat: add delete method for uploaded design files --- .../Controllers/FileUploadController.cpp | 33 +++++++++++++++++++ .../Controllers/FileUploadController.h | 1 + swagger/odbdesign-server-0.9-swagger.yaml | 8 +++++ 3 files changed, 42 insertions(+) diff --git a/OdbDesignServer/Controllers/FileUploadController.cpp b/OdbDesignServer/Controllers/FileUploadController.cpp index 857b2187..c64a1405 100644 --- a/OdbDesignServer/Controllers/FileUploadController.cpp +++ b/OdbDesignServer/Controllers/FileUploadController.cpp @@ -97,6 +97,17 @@ namespace Odb::App::Server // // return crow::response(jsonResponse); // }); + CROW_ROUTE(m_serverApp.crow_app(), "/files/delete/all") + .methods(crow::HTTPMethod::Delete) + ([&](const crow::request &req) { + // authenticate request before sending to handler + auto authResp = m_serverApp.request_auth().AuthenticateRequest(req); + if (authResp.code != crow::status::OK) { + return authResp; + } + + return handleRemoveAllDesignFiles(req); + }); } crow::response FileUploadController::handleOctetStreamUpload(const std::string& filename, const crow::request& req) @@ -198,6 +209,28 @@ namespace Odb::App::Server return makeLoadedFileModelsResponse(true); } + crow::response FileUploadController::handleRemoveAllDesignFiles(const crow::request& req) { + // get designs directory + const auto& designsDir = m_serverApp.args().designsDir(); + if (designsDir.empty()) { + return crow::response(crow::status::INTERNAL_SERVER_ERROR, "designs directory not configured"); + } + + // clean cache + m_serverApp.designs().Clear(); + + // delete content in designs directory (including files and folders) + std::error_code ec; + for (const auto& entry : std::filesystem::directory_iterator(designsDir)) { + std::filesystem::remove_all(entry.path(), ec); + if (ec.value() != 0) { + return crow::response(crow::status::INTERNAL_SERVER_ERROR, "failed to delete: " + entry.path().string()); + } + } + + return crow::response(crow::status::OK, "all design files deleted successfully"); + } + std::string FileUploadController::sanitizeFilename(const std::string& filename) const { // TODO: implement sanitize filename diff --git a/OdbDesignServer/Controllers/FileUploadController.h b/OdbDesignServer/Controllers/FileUploadController.h index 86afea0a..7fb723a3 100644 --- a/OdbDesignServer/Controllers/FileUploadController.h +++ b/OdbDesignServer/Controllers/FileUploadController.h @@ -15,6 +15,7 @@ namespace Odb::App::Server private: crow::response handleOctetStreamUpload(const std::string& filename, const crow::request& req); crow::response handleMultipartFormUpload(const crow::request& req); + crow::response handleRemoveAllDesignFiles(const crow::request& req); // TODO: actually implement sanitizeFilename() std::string sanitizeFilename(const std::string& filename) const; diff --git a/swagger/odbdesign-server-0.9-swagger.yaml b/swagger/odbdesign-server-0.9-swagger.yaml index 5aa475cc..9e1c7426 100644 --- a/swagger/odbdesign-server-0.9-swagger.yaml +++ b/swagger/odbdesign-server-0.9-swagger.yaml @@ -73,6 +73,14 @@ paths: description: "" security: - BasicAuth: [] + /files/delete/all: + delete: + tags: [ "file upload" ] + responses: + "200": + description: "" + security: + - BasicAuth: [ ] /filemodels: get: tags: ["filemodel"] From 038d536c255de0d85c25f7fc46f76cf7a1fe1a31 Mon Sep 17 00:00:00 2001 From: wen2so <34877267+wen2so@users.noreply.github.com> Date: Wed, 16 Jul 2025 23:39:45 +0800 Subject: [PATCH 2/3] Update delete logic Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../Controllers/FileUploadController.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/OdbDesignServer/Controllers/FileUploadController.cpp b/OdbDesignServer/Controllers/FileUploadController.cpp index c64a1405..bc5301ca 100644 --- a/OdbDesignServer/Controllers/FileUploadController.cpp +++ b/OdbDesignServer/Controllers/FileUploadController.cpp @@ -221,11 +221,15 @@ namespace Odb::App::Server // delete content in designs directory (including files and folders) std::error_code ec; - for (const auto& entry : std::filesystem::directory_iterator(designsDir)) { - std::filesystem::remove_all(entry.path(), ec); - if (ec.value() != 0) { - return crow::response(crow::status::INTERNAL_SERVER_ERROR, "failed to delete: " + entry.path().string()); - } + std::error_code ec; + std::filesystem::remove_all(designsDir, ec); + if (ec) { + return crow::response(crow::status::INTERNAL_SERVER_ERROR, "failed to remove designs directory: " + ec.message()); + } + + std::filesystem::create_directories(designsDir, ec); + if (ec) { + return crow::response(crow::status::INTERNAL_SERVER_ERROR, "failed to recreate designs directory: " + ec.message()); } return crow::response(crow::status::OK, "all design files deleted successfully"); From fcf3e79a68bc09bae6747cca16776a6917c20bd4 Mon Sep 17 00:00:00 2001 From: wen2so Date: Thu, 17 Jul 2025 09:06:31 +0800 Subject: [PATCH 3/3] refactor: remove duplicate error code --- OdbDesignServer/Controllers/FileUploadController.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/OdbDesignServer/Controllers/FileUploadController.cpp b/OdbDesignServer/Controllers/FileUploadController.cpp index bc5301ca..f8830558 100644 --- a/OdbDesignServer/Controllers/FileUploadController.cpp +++ b/OdbDesignServer/Controllers/FileUploadController.cpp @@ -221,7 +221,6 @@ namespace Odb::App::Server // delete content in designs directory (including files and folders) std::error_code ec; - std::error_code ec; std::filesystem::remove_all(designsDir, ec); if (ec) { return crow::response(crow::status::INTERNAL_SERVER_ERROR, "failed to remove designs directory: " + ec.message());