#include "services/ClusterService.h" #include "ApiServer.h" 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{}); } void ClusterService::handleMembersRequest(AsyncWebServerRequest* request) { JsonDocument doc; JsonArray arr = doc["members"].to(); for (const auto& pair : *ctx.memberList) { const NodeInfo& node = pair.second; JsonObject obj = arr.add(); obj["hostname"] = node.hostname; obj["ip"] = node.ip.toString(); obj["lastSeen"] = node.lastSeen; obj["latency"] = node.latency; obj["status"] = statusToStr(node.status); obj["resources"]["freeHeap"] = node.resources.freeHeap; obj["resources"]["chipId"] = node.resources.chipId; obj["resources"]["sdkVersion"] = node.resources.sdkVersion; obj["resources"]["cpuFreqMHz"] = node.resources.cpuFreqMHz; obj["resources"]["flashChipSize"] = node.resources.flashChipSize; // Add labels if present if (!node.labels.empty()) { JsonObject labelsObj = obj["labels"].to(); for (const auto& kv : node.labels) { labelsObj[kv.first.c_str()] = kv.second; } } } String json; serializeJson(doc, json); request->send(200, "application/json", json); }