|
|
@@ -2150,7 +2150,30 @@ void HttpServer::HandleDeleteWorkspace(const httplib::Request& req, httplib::Res
|
|
|
// Extract workspace ID from path
|
|
|
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) {
|
|
|
res.status = 404;
|
|
|
@@ -2159,10 +2182,19 @@ void HttpServer::HandleDeleteWorkspace(const httplib::Request& req, httplib::Res
|
|
|
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
|
|
|
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);
|
|
|
|
|
|
} catch (const std::exception& e) {
|