From ce650fe83e915095353344726f33bdb9c7bb3feb Mon Sep 17 00:00:00 2001 From: Richard Ward Date: Tue, 30 Dec 2025 22:32:00 +0000 Subject: [PATCH] docs: production,dbal,txt (2 files) --- dbal/production/build-config/CMakeLists.txt | 1 + dbal/production/src/daemon/server_routes.cpp | 68 ++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/dbal/production/build-config/CMakeLists.txt b/dbal/production/build-config/CMakeLists.txt index 6e1156f00..9870806cc 100644 --- a/dbal/production/build-config/CMakeLists.txt +++ b/dbal/production/build-config/CMakeLists.txt @@ -44,6 +44,7 @@ add_executable(dbal_daemon ${DBAL_SRC_DIR}/daemon/server_helpers/serialization.cpp ${DBAL_SRC_DIR}/daemon/server_helpers/response.cpp ${DBAL_SRC_DIR}/daemon/rpc_user_actions.cpp + ${DBAL_SRC_DIR}/daemon/rpc_schema_actions.cpp ${DBAL_SRC_DIR}/daemon/security.cpp ) diff --git a/dbal/production/src/daemon/server_routes.cpp b/dbal/production/src/daemon/server_routes.cpp index 6dd063712..98510651e 100644 --- a/dbal/production/src/daemon/server_routes.cpp +++ b/dbal/production/src/daemon/server_routes.cpp @@ -147,6 +147,74 @@ void Server::registerRoutes() { drogon::app().registerHandler("/api/status", status_handler, {drogon::HttpMethod::Get}); drogon::app().registerHandler("/api/dbal", rpc_handler, {drogon::HttpMethod::Post}); + // Schema management routes + auto schema_handler = [](const drogon::HttpRequestPtr& request, + std::function&& callback) { + // Get paths from environment or use defaults + const char* env_registry = std::getenv("DBAL_SCHEMA_REGISTRY_PATH"); + const char* env_packages = std::getenv("DBAL_PACKAGES_PATH"); + const char* env_output = std::getenv("DBAL_PRISMA_OUTPUT_PATH"); + + const std::string registry_path = env_registry ? env_registry : "/app/prisma/schema-registry.json"; + const std::string packages_path = env_packages ? env_packages : "/app/packages"; + const std::string output_path = env_output ? env_output : "/app/prisma/generated-from-packages.prisma"; + + auto send_success = [&callback](const Json::Value& data) { + callback(build_json_response(data)); + }; + + auto send_error = [&callback](const std::string& message, int status) { + Json::Value body; + body["success"] = false; + body["error"] = message; + auto response = drogon::HttpResponse::newHttpJsonResponse(body); + response->setStatusCode(static_cast(status)); + callback(response); + }; + + // Handle GET - list/status + if (request->method() == drogon::HttpMethod::Get) { + rpc::handle_schema_list(registry_path, send_success, send_error); + return; + } + + // Handle POST - actions + std::istringstream stream(request->getBody()); + Json::CharReaderBuilder reader_builder; + Json::Value body; + JSONCPP_STRING errs; + if (!Json::parseFromStream(reader_builder, stream, &body, &errs)) { + send_error("Invalid JSON payload", 400); + return; + } + + const std::string action = body.get("action", "").asString(); + const std::string id = body.get("id", "").asString(); + + if (action == "scan") { + rpc::handle_schema_scan(registry_path, packages_path, send_success, send_error); + } else if (action == "approve") { + if (id.empty()) { + send_error("Migration ID required", 400); + return; + } + rpc::handle_schema_approve(registry_path, id, send_success, send_error); + } else if (action == "reject") { + if (id.empty()) { + send_error("Migration ID required", 400); + return; + } + rpc::handle_schema_reject(registry_path, id, send_success, send_error); + } else if (action == "generate") { + rpc::handle_schema_generate(registry_path, output_path, send_success, send_error); + } else { + send_error("Unknown action: " + action, 400); + } + }; + + drogon::app().registerHandler("/api/dbal/schema", schema_handler, + {drogon::HttpMethod::Get, drogon::HttpMethod::Post}); + routes_registered_ = true; }