optimize so easier to port to IDF later

This commit is contained in:
Proddy
2024-01-14 21:12:36 +01:00
parent f9516860e3
commit a34c8661bd

View File

@@ -13,76 +13,47 @@
using namespace std::placeholders; // for `_1` etc using namespace std::placeholders; // for `_1` etc
template <class T> template <class T>
class HttpGetEndpoint { class HttpEndpoint {
public:
HttpGetEndpoint(JsonStateReader<T> stateReader,
StatefulService<T> * statefulService,
AsyncWebServer * server,
const String & servicePath,
SecurityManager * securityManager,
AuthenticationPredicate authenticationPredicate = AuthenticationPredicates::IS_ADMIN)
: _stateReader(stateReader)
, _statefulService(statefulService) {
server->on(servicePath.c_str(), HTTP_GET, securityManager->wrapRequest(std::bind(&HttpGetEndpoint::fetchSettings, this, _1), authenticationPredicate));
}
HttpGetEndpoint(JsonStateReader<T> stateReader, StatefulService<T> * statefulService, AsyncWebServer * server, const String & servicePath)
: _stateReader(stateReader)
, _statefulService(statefulService) {
server->on(servicePath.c_str(), HTTP_GET, std::bind(&HttpGetEndpoint::fetchSettings, this, _1));
}
protected: protected:
JsonStateReader<T> _stateReader; JsonStateReader<T> _stateReader;
JsonStateUpdater<T> _stateUpdater;
StatefulService<T> * _statefulService; StatefulService<T> * _statefulService;
void fetchSettings(AsyncWebServerRequest * request) { AsyncCallbackWebHandler * GEThandler;
AsyncJsonResponse * response = new AsyncJsonResponse(false); AsyncCallbackJsonWebHandler * POSThandler;
JsonObject jsonObject = response->getRoot().to<JsonObject>();
_statefulService->read(jsonObject, _stateReader);
response->setLength();
request->send(response);
}
};
template <class T>
class HttpPostEndpoint {
public: public:
HttpPostEndpoint(JsonStateReader<T> stateReader, HttpEndpoint(JsonStateReader<T> stateReader,
JsonStateUpdater<T> stateUpdater, JsonStateUpdater<T> stateUpdater,
StatefulService<T> * statefulService, StatefulService<T> * statefulService,
AsyncWebServer * server, AsyncWebServer * server,
const String & servicePath, const String & servicePath,
SecurityManager * securityManager, SecurityManager * securityManager,
AuthenticationPredicate authenticationPredicate = AuthenticationPredicates::IS_ADMIN) AuthenticationPredicate authenticationPredicate = AuthenticationPredicates::IS_ADMIN)
: _stateReader(stateReader) : _stateReader(stateReader)
, _stateUpdater(stateUpdater) , _stateUpdater(stateUpdater)
, _statefulService(statefulService) , _statefulService(statefulService) {
, _updateHandler(servicePath, securityManager->wrapCallback(std::bind(&HttpPostEndpoint::updateSettings, this, _1, _2), authenticationPredicate)) { // Create the GET and POST endpoints
_updateHandler.setMethod(HTTP_POST); // We can't use HTTP_ANY and process one a single endpoint due to the way the ESPAsyncWebServer library works
server->addHandler(&_updateHandler); // Could also use server->on() but this is more efficient
}
HttpPostEndpoint(JsonStateReader<T> stateReader, // create the GET
JsonStateUpdater<T> stateUpdater, GEThandler = new AsyncCallbackWebHandler();
StatefulService<T> * statefulService, GEThandler->setUri(servicePath);
AsyncWebServer * server, GEThandler->setMethod(HTTP_GET);
const String & servicePath) GEThandler->onRequest(securityManager->wrapRequest(std::bind(&HttpEndpoint::fetchSettings, this, _1), authenticationPredicate));
: _stateReader(stateReader) server->addHandler(GEThandler);
, _stateUpdater(stateUpdater)
, _statefulService(statefulService) // create the POST
, _updateHandler(servicePath, std::bind(&HttpPostEndpoint::updateSettings, this, _1, _2)) { POSThandler =
_updateHandler.setMethod(HTTP_POST); new AsyncCallbackJsonWebHandler(servicePath,
server->addHandler(&_updateHandler); securityManager->wrapCallback(std::bind(&HttpEndpoint::updateSettings, this, _1, _2), authenticationPredicate));
POSThandler->setMethod(HTTP_POST);
server->addHandler(POSThandler);
} }
protected: protected:
JsonStateReader<T> _stateReader; // for POST
JsonStateUpdater<T> _stateUpdater;
StatefulService<T> * _statefulService;
AsyncCallbackJsonWebHandler _updateHandler;
void updateSettings(AsyncWebServerRequest * request, JsonVariant json) { void updateSettings(AsyncWebServerRequest * request, JsonVariant json) {
if (!json.is<JsonObject>()) { if (!json.is<JsonObject>()) {
request->send(400); request->send(400);
@@ -105,29 +76,15 @@ class HttpPostEndpoint {
response->setLength(); response->setLength();
request->send(response); request->send(response);
} }
};
template <class T> // for GET
class HttpEndpoint : public HttpGetEndpoint<T>, public HttpPostEndpoint<T> { void fetchSettings(AsyncWebServerRequest * request) {
public: AsyncJsonResponse * response = new AsyncJsonResponse(false);
HttpEndpoint(JsonStateReader<T> stateReader, JsonObject jsonObject = response->getRoot().to<JsonObject>();
JsonStateUpdater<T> stateUpdater, _statefulService->read(jsonObject, _stateReader);
StatefulService<T> * statefulService,
AsyncWebServer * server,
const String & servicePath,
SecurityManager * securityManager,
AuthenticationPredicate authenticationPredicate = AuthenticationPredicates::IS_ADMIN)
: HttpGetEndpoint<T>(stateReader, statefulService, server, servicePath, securityManager, authenticationPredicate)
, HttpPostEndpoint<T>(stateReader, stateUpdater, statefulService, server, servicePath, securityManager, authenticationPredicate) {
}
HttpEndpoint(JsonStateReader<T> stateReader, response->setLength();
JsonStateUpdater<T> stateUpdater, request->send(response);
StatefulService<T> * statefulService,
AsyncWebServer * server,
const String & servicePath)
: HttpGetEndpoint<T>(stateReader, statefulService, server, servicePath)
, HttpPostEndpoint<T>(stateReader, stateUpdater, statefulService, server, servicePath) {
} }
}; };