Refactor file handling API and add endpoint to delete files

This commit is contained in:
Thomas Basler 2024-10-19 12:40:43 +02:00
parent aa9f36ee8f
commit 16901482d9
3 changed files with 87 additions and 47 deletions

View File

@ -18,9 +18,10 @@ enum WebApiError {
DtuInvalidCmtFrequency, DtuInvalidCmtFrequency,
DtuInvalidCmtCountry, DtuInvalidCmtCountry,
ConfigBase = 3000, FileBase = 3000,
ConfigNotDeleted, FileNotDeleted,
ConfigSuccess, FileSuccess,
FileDeleteSuccess,
InverterBase = 4000, InverterBase = 4000,
InverterSerialZero, InverterSerialZero,

View File

@ -11,6 +11,7 @@ public:
private: private:
void onFileGet(AsyncWebServerRequest* request); void onFileGet(AsyncWebServerRequest* request);
void onFileDelete(AsyncWebServerRequest* request); void onFileDelete(AsyncWebServerRequest* request);
void onFileDeleteAll(AsyncWebServerRequest* request);
void onFileListGet(AsyncWebServerRequest* request); void onFileListGet(AsyncWebServerRequest* request);
void onFileUploadFinish(AsyncWebServerRequest* request); void onFileUploadFinish(AsyncWebServerRequest* request);
void onFileUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final); void onFileUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final);

View File

@ -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/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", 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/list", HTTP_GET, std::bind(&WebApiFileClass::onFileListGet, this, _1));
server.on("/api/file/upload", HTTP_POST, server.on("/api/file/upload", HTTP_POST,
std::bind(&WebApiFileClass::onFileUploadFinish, this, _1), std::bind(&WebApiFileClass::onFileUploadFinish, this, _1),
std::bind(&WebApiFileClass::onFileUpload, this, _1, _2, _3, _4, _5, _6)); 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<JsonArray>();
File rootfs = LittleFS.open("/");
File file = rootfs.openNextFile();
while (file) {
if (file.isDirectory()) {
continue;
}
JsonObject obj = data.add<JsonObject>();
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) void WebApiFileClass::onFileGet(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentials(request)) { if (!WebApi.checkCredentials(request)) {
@ -62,6 +90,42 @@ void WebApiFileClass::onFileDelete(AsyncWebServerRequest* request)
auto& retMsg = response->getRoot(); auto& retMsg = response->getRoot();
if (!(root["file"].is<String>())) {
retMsg["message"] = "Values are missing!";
retMsg["code"] = WebApiError::GenericValueMissing;
WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__);
return;
}
String name = "/" + root["file"].as<String>();
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<bool>())) { if (!(root["delete"].is<bool>())) {
retMsg["message"] = "Values are missing!"; retMsg["message"] = "Values are missing!";
retMsg["code"] = WebApiError::GenericValueMissing; retMsg["code"] = WebApiError::GenericValueMissing;
@ -71,14 +135,14 @@ void WebApiFileClass::onFileDelete(AsyncWebServerRequest* request)
if (root["delete"].as<bool>() == false) { if (root["delete"].as<bool>() == false) {
retMsg["message"] = "Not deleted anything!"; retMsg["message"] = "Not deleted anything!";
retMsg["code"] = WebApiError::ConfigNotDeleted; retMsg["code"] = WebApiError::FileNotDeleted;
WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__);
return; return;
} }
retMsg["type"] = "success"; retMsg["type"] = "success";
retMsg["message"] = "Configuration resettet. Rebooting now..."; retMsg["message"] = "Configuration resettet. Rebooting now...";
retMsg["code"] = WebApiError::ConfigSuccess; retMsg["code"] = WebApiError::FileSuccess;
WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__);
@ -86,48 +150,6 @@ void WebApiFileClass::onFileDelete(AsyncWebServerRequest* request)
RestartHelper.triggerRestart(); 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<JsonArray>();
File rootfs = LittleFS.open("/");
File file = rootfs.openNextFile();
while (file) {
if (file.isDirectory()) {
continue;
}
JsonObject obj = data.add<JsonObject>();
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) void WebApiFileClass::onFileUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final)
{ {
if (!WebApi.checkCredentials(request)) { if (!WebApi.checkCredentials(request)) {
@ -154,3 +176,19 @@ void WebApiFileClass::onFileUpload(AsyncWebServerRequest* request, String filena
request->_tempFile.close(); 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();
}