From 025ac7b8108bdec4f66bb84f291e1e16d66e189a Mon Sep 17 00:00:00 2001 From: Patrick Balsiger Date: Tue, 23 Sep 2025 21:29:18 +0200 Subject: [PATCH] fix: endpoints result --- include/spore/core/ApiServer.h | 15 ++++++---- include/spore/types/ApiResponse.h | 9 +++++- include/spore/types/NodeResponse.h | 1 + src/spore/core/ApiServer.cpp | 38 ++++-------------------- src/spore/services/ClusterService.cpp | 2 +- src/spore/services/MonitoringService.cpp | 2 +- src/spore/services/NetworkService.cpp | 8 ++--- src/spore/services/NodeService.cpp | 8 ++--- src/spore/services/TaskService.cpp | 4 +-- 9 files changed, 36 insertions(+), 51 deletions(-) diff --git a/include/spore/core/ApiServer.h b/include/spore/core/ApiServer.h index dcb59dd..8892b9f 100644 --- a/include/spore/core/ApiServer.h +++ b/include/spore/core/ApiServer.h @@ -11,6 +11,7 @@ #include "spore/types/NodeInfo.h" #include "spore/core/TaskManager.h" #include "spore/types/ApiTypes.h" +#include "spore/util/Logging.h" class Service; // Forward declaration @@ -19,15 +20,17 @@ public: ApiServer(NodeContext& ctx, TaskManager& taskMgr, uint16_t port = 80); void begin(); void addService(Service& service); - void addEndpoint(const String& uri, int method, std::function requestHandler); void addEndpoint(const String& uri, int method, std::function requestHandler, - std::function uploadHandler); - - void addEndpoint(const String& uri, int method, std::function requestHandler, - const std::vector& params); + const String& serviceName = "unknown"); void addEndpoint(const String& uri, int method, std::function requestHandler, std::function uploadHandler, - const std::vector& params); + const String& serviceName = "unknown"); + + void addEndpoint(const String& uri, int method, std::function requestHandler, + const std::vector& params, const String& serviceName = "unknown"); + void addEndpoint(const String& uri, int method, std::function requestHandler, + std::function uploadHandler, + const std::vector& params, const String& serviceName = "unknown"); // Static file serving void serveStatic(const String& uri, fs::FS& fs, const String& path, const String& cache_header = ""); diff --git a/include/spore/types/ApiResponse.h b/include/spore/types/ApiResponse.h index 5dc7744..de8a154 100644 --- a/include/spore/types/ApiResponse.h +++ b/include/spore/types/ApiResponse.h @@ -1,5 +1,6 @@ #pragma once #include "spore/util/JsonSerializable.h" +#include "spore/util/Logging.h" #include namespace spore { @@ -57,6 +58,7 @@ public: * @param item The serializable item to add */ void addItem(const util::JsonSerializable& item) { + // Ensure the array exists and get a reference to it if (!doc[collectionKey].is()) { doc[collectionKey] = JsonArray(); } @@ -70,6 +72,7 @@ public: * @param item The serializable item to add */ void addItem(util::JsonSerializable&& item) { + // Ensure the array exists and get a reference to it if (!doc[collectionKey].is()) { doc[collectionKey] = JsonArray(); } @@ -84,7 +87,11 @@ public: */ template void addItems(const Container& items) { - JsonArray arr = doc[collectionKey].to(); + // Ensure the array exists and get a reference to it + if (!doc[collectionKey].is()) { + doc[collectionKey] = JsonArray(); + } + JsonArray arr = doc[collectionKey].as(); for (const auto& item : items) { JsonObject obj = arr.add(); item.toJson(obj); diff --git a/include/spore/types/NodeResponse.h b/include/spore/types/NodeResponse.h index 2706f0b..9ec2a6b 100644 --- a/include/spore/types/NodeResponse.h +++ b/include/spore/types/NodeResponse.h @@ -2,6 +2,7 @@ #include "ApiResponse.h" #include "EndpointInfoSerializable.h" #include "NodeInfo.h" +#include "spore/util/Logging.h" #include namespace spore { diff --git a/src/spore/core/ApiServer.cpp b/src/spore/core/ApiServer.cpp index 9b44f7c..b6c5276 100644 --- a/src/spore/core/ApiServer.cpp +++ b/src/spore/core/ApiServer.cpp @@ -21,57 +21,31 @@ void ApiServer::registerEndpoint(const String& uri, int method, const String& serviceName) { // Add to local endpoints endpoints.push_back(EndpointInfo{uri, method, params, serviceName, true}); - - // Update cluster if needed - if (ctx.memberList && !ctx.memberList->empty()) { - auto it = ctx.memberList->find(ctx.hostname); - if (it != ctx.memberList->end()) { - it->second.endpoints.push_back(EndpointInfo{uri, method, params, serviceName, true}); - } - } } -void ApiServer::addEndpoint(const String& uri, int method, std::function requestHandler) { - // Get current service name if available - String serviceName = "unknown"; - if (!services.empty()) { - serviceName = services.back().get().getName(); - } +void ApiServer::addEndpoint(const String& uri, int method, std::function requestHandler, + const String& serviceName) { registerEndpoint(uri, method, {}, serviceName); server.on(uri.c_str(), method, requestHandler); } void ApiServer::addEndpoint(const String& uri, int method, std::function requestHandler, - std::function uploadHandler) { - // Get current service name if available - String serviceName = "unknown"; - if (!services.empty()) { - serviceName = services.back().get().getName(); - } + std::function uploadHandler, + const String& serviceName) { registerEndpoint(uri, method, {}, serviceName); server.on(uri.c_str(), method, requestHandler, uploadHandler); } // Overloads that also record minimal capability specs void ApiServer::addEndpoint(const String& uri, int method, std::function requestHandler, - const std::vector& params) { - // Get current service name if available - String serviceName = "unknown"; - if (!services.empty()) { - serviceName = services.back().get().getName(); - } + const std::vector& params, const String& serviceName) { registerEndpoint(uri, method, params, serviceName); server.on(uri.c_str(), method, requestHandler); } void ApiServer::addEndpoint(const String& uri, int method, std::function requestHandler, std::function uploadHandler, - const std::vector& params) { - // Get current service name if available - String serviceName = "unknown"; - if (!services.empty()) { - serviceName = services.back().get().getName(); - } + const std::vector& params, const String& serviceName) { registerEndpoint(uri, method, params, serviceName); server.on(uri.c_str(), method, requestHandler, uploadHandler); } diff --git a/src/spore/services/ClusterService.cpp b/src/spore/services/ClusterService.cpp index d9a1d78..da244a8 100644 --- a/src/spore/services/ClusterService.cpp +++ b/src/spore/services/ClusterService.cpp @@ -9,7 +9,7 @@ ClusterService::ClusterService(NodeContext& ctx) : ctx(ctx) {} void ClusterService::registerEndpoints(ApiServer& api) { api.addEndpoint("/api/cluster/members", HTTP_GET, [this](AsyncWebServerRequest* request) { handleMembersRequest(request); }, - std::vector{}); + std::vector{}, "ClusterService"); } void ClusterService::handleMembersRequest(AsyncWebServerRequest* request) { diff --git a/src/spore/services/MonitoringService.cpp b/src/spore/services/MonitoringService.cpp index a611456..eb9885d 100644 --- a/src/spore/services/MonitoringService.cpp +++ b/src/spore/services/MonitoringService.cpp @@ -12,7 +12,7 @@ MonitoringService::MonitoringService(CpuUsage& cpuUsage) void MonitoringService::registerEndpoints(ApiServer& api) { api.addEndpoint("/api/monitoring/resources", HTTP_GET, [this](AsyncWebServerRequest* request) { handleResourcesRequest(request); }, - std::vector{}); + std::vector{}, "MonitoringService"); } MonitoringService::SystemResources MonitoringService::getSystemResources() const { diff --git a/src/spore/services/NetworkService.cpp b/src/spore/services/NetworkService.cpp index 1009f4f..a147e26 100644 --- a/src/spore/services/NetworkService.cpp +++ b/src/spore/services/NetworkService.cpp @@ -8,16 +8,16 @@ void NetworkService::registerEndpoints(ApiServer& api) { // WiFi scanning endpoints api.addEndpoint("/api/network/wifi/scan", HTTP_POST, [this](AsyncWebServerRequest* request) { handleWifiScanRequest(request); }, - std::vector{}); + std::vector{}, "NetworkService"); api.addEndpoint("/api/network/wifi/scan", HTTP_GET, [this](AsyncWebServerRequest* request) { handleGetWifiNetworks(request); }, - std::vector{}); + std::vector{}, "NetworkService"); // Network status and configuration endpoints api.addEndpoint("/api/network/status", HTTP_GET, [this](AsyncWebServerRequest* request) { handleNetworkStatus(request); }, - std::vector{}); + std::vector{}, "NetworkService"); api.addEndpoint("/api/network/wifi/config", HTTP_POST, [this](AsyncWebServerRequest* request) { handleSetWifiConfig(request); }, @@ -26,7 +26,7 @@ void NetworkService::registerEndpoints(ApiServer& api) { ParamSpec{String("password"), true, String("body"), String("string"), {}, String("")}, ParamSpec{String("connect_timeout_ms"), false, String("body"), String("number"), {}, String("10000")}, ParamSpec{String("retry_delay_ms"), false, String("body"), String("number"), {}, String("500")} - }); + }, "NetworkService"); } void NetworkService::handleWifiScanRequest(AsyncWebServerRequest* request) { diff --git a/src/spore/services/NodeService.cpp b/src/spore/services/NodeService.cpp index 50bb8d1..b3ab3c4 100644 --- a/src/spore/services/NodeService.cpp +++ b/src/spore/services/NodeService.cpp @@ -13,7 +13,7 @@ void NodeService::registerEndpoints(ApiServer& api) { // Status endpoint api.addEndpoint("/api/node/status", HTTP_GET, [this](AsyncWebServerRequest* request) { handleStatusRequest(request); }, - std::vector{}); + std::vector{}, "NodeService"); // Update endpoint with file upload api.addEndpoint("/api/node/update", HTTP_POST, @@ -23,17 +23,17 @@ void NodeService::registerEndpoints(ApiServer& api) { }, std::vector{ ParamSpec{String("firmware"), true, String("body"), String("file"), {}, String("")} - }); + }, "NodeService"); // Restart endpoint api.addEndpoint("/api/node/restart", HTTP_POST, [this](AsyncWebServerRequest* request) { handleRestartRequest(request); }, - std::vector{}); + std::vector{}, "NodeService"); // Endpoints endpoint api.addEndpoint("/api/node/endpoints", HTTP_GET, [this](AsyncWebServerRequest* request) { handleEndpointsRequest(request); }, - std::vector{}); + std::vector{}, "NodeService"); } void NodeService::handleStatusRequest(AsyncWebServerRequest* request) { diff --git a/src/spore/services/TaskService.cpp b/src/spore/services/TaskService.cpp index 2700499..fe7f5b4 100644 --- a/src/spore/services/TaskService.cpp +++ b/src/spore/services/TaskService.cpp @@ -11,7 +11,7 @@ TaskService::TaskService(TaskManager& taskManager) : taskManager(taskManager) {} void TaskService::registerEndpoints(ApiServer& api) { api.addEndpoint("/api/tasks/status", HTTP_GET, [this](AsyncWebServerRequest* request) { handleStatusRequest(request); }, - std::vector{}); + std::vector{}, "TaskService"); api.addEndpoint("/api/tasks/control", HTTP_POST, [this](AsyncWebServerRequest* request) { handleControlRequest(request); }, @@ -32,7 +32,7 @@ void TaskService::registerEndpoints(ApiServer& api) { {String("enable"), String("disable"), String("start"), String("stop"), String("status")}, String("") } - }); + }, "TaskService"); } void TaskService::handleStatusRequest(AsyncWebServerRequest* request) {