diff --git a/include/WebApi_errors.h b/include/WebApi_errors.h index c4cdaf2..68e107d 100644 --- a/include/WebApi_errors.h +++ b/include/WebApi_errors.h @@ -18,9 +18,10 @@ enum WebApiError { DtuInvalidCmtFrequency, DtuInvalidCmtCountry, - ConfigBase = 3000, - ConfigNotDeleted, - ConfigSuccess, + FileBase = 3000, + FileNotDeleted, + FileSuccess, + FileDeleteSuccess, InverterBase = 4000, InverterSerialZero, diff --git a/include/WebApi_file.h b/include/WebApi_file.h index 2f6e331..ce958b0 100644 --- a/include/WebApi_file.h +++ b/include/WebApi_file.h @@ -11,6 +11,7 @@ public: private: void onFileGet(AsyncWebServerRequest* request); void onFileDelete(AsyncWebServerRequest* request); + void onFileDeleteAll(AsyncWebServerRequest* request); void onFileListGet(AsyncWebServerRequest* request); void onFileUploadFinish(AsyncWebServerRequest* request); void onFileUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final); diff --git a/src/WebApi_file.cpp b/src/WebApi_file.cpp index c3a290a..60c0bea 100644 --- a/src/WebApi_file.cpp +++ b/src/WebApi_file.cpp @@ -22,12 +22,40 @@ void WebApiFileClass::init(AsyncWebServer& server, Scheduler& scheduler) server.on("/api/file/get", HTTP_GET, std::bind(&WebApiFileClass::onFileGet, this, _1)); server.on("/api/file/delete", HTTP_POST, std::bind(&WebApiFileClass::onFileDelete, this, _1)); + server.on("/api/file/delete_all", HTTP_POST, std::bind(&WebApiFileClass::onFileDeleteAll, this, _1)); server.on("/api/file/list", HTTP_GET, std::bind(&WebApiFileClass::onFileListGet, this, _1)); server.on("/api/file/upload", HTTP_POST, std::bind(&WebApiFileClass::onFileUploadFinish, this, _1), std::bind(&WebApiFileClass::onFileUpload, this, _1, _2, _3, _4, _5, _6)); } +void WebApiFileClass::onFileListGet(AsyncWebServerRequest* request) +{ + if (!WebApi.checkCredentials(request)) { + return; + } + + AsyncJsonResponse* response = new AsyncJsonResponse(); + auto& root = response->getRoot(); + auto data = root.to(); + + File rootfs = LittleFS.open("/"); + File file = rootfs.openNextFile(); + while (file) { + if (file.isDirectory()) { + continue; + } + JsonObject obj = data.add(); + obj["name"] = String(file.name()); + obj["size"] = file.size(); + + file = rootfs.openNextFile(); + } + file.close(); + + WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); +} + void WebApiFileClass::onFileGet(AsyncWebServerRequest* request) { if (!WebApi.checkCredentials(request)) { @@ -62,6 +90,42 @@ void WebApiFileClass::onFileDelete(AsyncWebServerRequest* request) auto& retMsg = response->getRoot(); + if (!(root["file"].is())) { + retMsg["message"] = "Values are missing!"; + retMsg["code"] = WebApiError::GenericValueMissing; + WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); + return; + } + + String name = "/" + root["file"].as(); + if (!LittleFS.exists(name)) { + request->send(404); + return; + } + + LittleFS.remove(name); + + retMsg["type"] = "success"; + retMsg["message"] = "File deleted"; + retMsg["code"] = WebApiError::FileDeleteSuccess; + + WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); +} + +void WebApiFileClass::onFileDeleteAll(AsyncWebServerRequest* request) +{ + if (!WebApi.checkCredentials(request)) { + return; + } + + AsyncJsonResponse* response = new AsyncJsonResponse(); + JsonDocument root; + if (!WebApi.parseRequestData(request, response, root)) { + return; + } + + auto& retMsg = response->getRoot(); + if (!(root["delete"].is())) { retMsg["message"] = "Values are missing!"; retMsg["code"] = WebApiError::GenericValueMissing; @@ -71,14 +135,14 @@ void WebApiFileClass::onFileDelete(AsyncWebServerRequest* request) if (root["delete"].as() == false) { retMsg["message"] = "Not deleted anything!"; - retMsg["code"] = WebApiError::ConfigNotDeleted; + retMsg["code"] = WebApiError::FileNotDeleted; WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); return; } retMsg["type"] = "success"; retMsg["message"] = "Configuration resettet. Rebooting now..."; - retMsg["code"] = WebApiError::ConfigSuccess; + retMsg["code"] = WebApiError::FileSuccess; WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); @@ -86,48 +150,6 @@ void WebApiFileClass::onFileDelete(AsyncWebServerRequest* request) RestartHelper.triggerRestart(); } -void WebApiFileClass::onFileListGet(AsyncWebServerRequest* request) -{ - if (!WebApi.checkCredentials(request)) { - return; - } - - AsyncJsonResponse* response = new AsyncJsonResponse(); - auto& root = response->getRoot(); - auto data = root["configs"].to(); - - File rootfs = LittleFS.open("/"); - File file = rootfs.openNextFile(); - while (file) { - if (file.isDirectory()) { - continue; - } - JsonObject obj = data.add(); - obj["name"] = String(file.name()); - - file = rootfs.openNextFile(); - } - file.close(); - - WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); -} - -void WebApiFileClass::onFileUploadFinish(AsyncWebServerRequest* request) -{ - if (!WebApi.checkCredentials(request)) { - return; - } - - // the request handler is triggered after the upload has finished... - // create the response, add header, and send response - - AsyncWebServerResponse* response = request->beginResponse(200, "text/plain", "OK"); - response->addHeader("Connection", "close"); - response->addHeader("Access-Control-Allow-Origin", "*"); - request->send(response); - RestartHelper.triggerRestart(); -} - void WebApiFileClass::onFileUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final) { if (!WebApi.checkCredentials(request)) { @@ -154,3 +176,19 @@ void WebApiFileClass::onFileUpload(AsyncWebServerRequest* request, String filena request->_tempFile.close(); } } + +void WebApiFileClass::onFileUploadFinish(AsyncWebServerRequest* request) +{ + if (!WebApi.checkCredentials(request)) { + return; + } + + // the request handler is triggered after the upload has finished... + // create the response, add header, and send response + + AsyncWebServerResponse* response = request->beginResponse(200, "text/plain", "OK"); + response->addHeader("Connection", "close"); + response->addHeader("Access-Control-Allow-Origin", "*"); + request->send(response); + RestartHelper.triggerRestart(); +}