Bläddra i källkod

fix: workspace delete now creates archive by default

Changed HandleDeleteWorkspace to use DeleteWorkspaceWithArchive instead
of simple DeleteWorkspace. This ensures all workspace deletions:
- Create an archive snapshot before deletion
- Cascade delete all child entities (pages, views, collections, docs)
- Support query params: ?archive=false, ?cascade=false, ?retention_days=N
fszontagh 7 månader sedan
förälder
incheckning
a3ced9ade0
1 ändrade filer med 34 tillägg och 2 borttagningar
  1. 34 2
      webserver/src/http_server.cpp

+ 34 - 2
webserver/src/http_server.cpp

@@ -2150,7 +2150,30 @@ void HttpServer::HandleDeleteWorkspace(const httplib::Request& req, httplib::Res
         // Extract workspace ID from path
         // Extract workspace ID from path
         std::string workspace_id = req.matches[1].str();
         std::string workspace_id = req.matches[1].str();
 
 
-        auto result = workspaceService_->DeleteWorkspace(workspace_id);
+        // Parse options from query params or request body
+        DeleteWorkspaceOptions options;
+        options.actor_id = auth_user->user_id;
+        options.create_archive = true;  // Default: always archive
+        options.cascade_delete = true;  // Default: cascade delete children
+        options.retention_days = 30;    // Default: 30 days
+
+        // Check query params
+        if (req.has_param("archive")) {
+            options.create_archive = req.get_param_value("archive") != "false";
+        }
+        if (req.has_param("cascade")) {
+            options.cascade_delete = req.get_param_value("cascade") != "false";
+        }
+        if (req.has_param("retention_days")) {
+            try {
+                options.retention_days = std::stoi(req.get_param_value("retention_days"));
+            } catch (...) {
+                // Ignore invalid retention_days
+            }
+        }
+
+        // Use DeleteWorkspaceWithArchive for full cascade delete with archiving
+        auto result = workspaceService_->DeleteWorkspaceWithArchive(workspace_id, options);
 
 
         if (!result.success) {
         if (!result.success) {
             res.status = 404;
             res.status = 404;
@@ -2159,10 +2182,19 @@ void HttpServer::HandleDeleteWorkspace(const httplib::Request& req, httplib::Res
             return;
             return;
         }
         }
 
 
-        res.set_content(R"({"message":"Workspace deleted successfully"})", "application/json");
+        nlohmann::json response;
+        response["message"] = "Workspace deleted successfully";
+        if (!result.archive_id.empty()) {
+            response["archive_id"] = result.archive_id;
+        }
+        response["cascaded_count"] = result.cascaded_count;
+        res.set_content(response.dump(), "application/json");
 
 
         // Broadcast workspace deleted event to all authenticated users
         // Broadcast workspace deleted event to all authenticated users
         nlohmann::json delete_data = {{"id", workspace_id}};
         nlohmann::json delete_data = {{"id", workspace_id}};
+        if (!result.archive_id.empty()) {
+            delete_data["archive_id"] = result.archive_id;
+        }
         BroadcastWorkspaceEvent(workspace_id, WorkspaceAction::Delete, delete_data);
         BroadcastWorkspaceEvent(workspace_id, WorkspaceAction::Delete, delete_data);
 
 
     } catch (const std::exception& e) {
     } catch (const std::exception& e) {