From e6e439b16ea80218c111e509ef38ce963b5ab947 Mon Sep 17 00:00:00 2001 From: Johanness Date: Tue, 16 Jun 2026 11:11:13 +0300 Subject: [PATCH] feat: add node register endpoint and fabric create-target/connect APIs - POST /api/graph/nodes/{id}/register: register manually-started node with control port - POST /api/fabric/create-target: add_writer + poll for target_info - POST /api/fabric/connect: auto-propagate target_info to initiator - fabric-bridge: auto-fetch target_info from remote target via HTTP --- libs/dmf-engine/src/api_server.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/libs/dmf-engine/src/api_server.cpp b/libs/dmf-engine/src/api_server.cpp index fd5786f..7c103d6 100644 --- a/libs/dmf-engine/src/api_server.cpp +++ b/libs/dmf-engine/src/api_server.cpp @@ -321,6 +321,26 @@ static void handle_request(const std::string& method, const std::string& path, } else { error_resp(500, "Failed to send command to node"); } + } else if (path.find("/api/graph/nodes/") == 0 && path.find("/register") != std::string::npos && method == "POST") { + auto prefix = std::string("/api/graph/nodes/"); + auto suffix_start = path.find("/register"); + auto node_id = path.substr(prefix.length(), suffix_start - prefix.length()); + + if (!req_body.contains("port")) { + error_resp(400, "Missing port"); + return; + } + + auto control_port = static_cast(req_body["port"].get()); + cc.register_node(node_id, control_port); + + auto* node = graph.get_node_mut(node_id); + if (node) { + node->control_port = control_port; + node->state = NodeState::Running; + } + + ok({{"node_id", node_id}, {"control_port", control_port}}); } else if (path == "/api/fabric/create-target" && method == "POST") { if (!req_body.contains("node_id")) { error_resp(400, "Missing node_id");