diff --git a/OdbDesignServer/Controllers/FileUploadController.cpp b/OdbDesignServer/Controllers/FileUploadController.cpp index 857b2187..f8830558 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,31 @@ 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; + 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"); + } + 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"]