#pragma once #include #include #include #include #include #include #include #include "spore/core/NodeContext.h" #include "spore/types/NodeInfo.h" #include "spore/core/TaskManager.h" #include "spore/types/ApiTypes.h" class Service; // Forward declaration class ApiServer { 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); void addEndpoint(const String& uri, int method, std::function requestHandler, std::function uploadHandler, const std::vector& params); // Static file serving void serveStatic(const String& uri, fs::FS& fs, const String& path, const String& cache_header = ""); static const char* methodToStr(int method); // Access to endpoints for endpoints endpoint const std::vector& getEndpoints() const { return endpoints; } private: AsyncWebServer server; NodeContext& ctx; TaskManager& taskManager; std::vector> services; std::vector endpoints; // Single source of truth for endpoints // Internal helpers void registerEndpoint(const String& uri, int method, const std::vector& params, const String& serviceName); };