#pragma once #include #include #include #include #include #include #include #include "NodeContext.h" #include "NodeInfo.h" #include "TaskManager.h" using namespace std; using namespace std::placeholders; class ApiServer { public: ApiServer(NodeContext& ctx, TaskManager& taskMgr, uint16_t port = 80); void begin(); void addEndpoint(const String& uri, int method, std::function requestHandler); void addEndpoint(const String& uri, int method, std::function requestHandler, std::function uploadHandler); // Minimal capability spec types and registration overloads struct ParamSpec { String name; bool required; String location; // "query" | "body" | "path" | "header" String type; // e.g. "string", "number", "boolean" std::vector values; // optional allowed values }; struct EndpointCapability { String uri; int method; std::vector params; }; void addEndpoint(const String& uri, int method, std::function requestHandler, const std::vector& params); void addEndpoint(const String& uri, int method, std::function requestHandler, std::function uploadHandler, const std::vector& params); private: AsyncWebServer server; NodeContext& ctx; TaskManager& taskManager; std::vector> serviceRegistry; std::vector capabilityRegistry; void onClusterMembersRequest(AsyncWebServerRequest *request); void methodToStr(const std::tuple &endpoint, ArduinoJson::V742PB22::JsonObject &apiObj); void onSystemStatusRequest(AsyncWebServerRequest *request); void onFirmwareUpdateRequest(AsyncWebServerRequest *request); void onFirmwareUpload(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final); void onRestartRequest(AsyncWebServerRequest *request); // Task management endpoints void onTaskStatusRequest(AsyncWebServerRequest *request); void onTaskControlRequest(AsyncWebServerRequest *request); // Capabilities endpoint void onCapabilitiesRequest(AsyncWebServerRequest *request); };