Refactors filesystem service

This commit is contained in:
Rune Harlyk
2024-11-07 16:45:14 +01:00
committed by Rune Harlyk
parent 3a3de53752
commit fd652bd967
13 changed files with 145 additions and 94 deletions
+101
View File
@@ -0,0 +1,101 @@
#include <filesystem.h>
static const char *TAG = "FileService";
namespace FileSystem {
PsychicUploadHandler *uploadHandler;
class Initializer {
public:
Initializer() {
uploadHandler = new PsychicUploadHandler();
uploadHandler->onUpload(uploadFile);
uploadHandler->onRequest([](PsychicRequest *request) { return request->reply(200); });
}
};
static Initializer initializer;
esp_err_t getFiles(PsychicRequest *request) { return request->reply(200, "application/json", listFiles("/").c_str()); }
esp_err_t handleDelete(PsychicRequest *request, JsonVariant &json) {
if (json.is<JsonObject>()) {
const char *filename = json["file"].as<const char *>();
ESP_LOGI(TAG, "Deleting file: %s", filename);
return deleteFile(filename) ? request->reply(200) : request->reply(500);
}
return request->reply(400);
}
esp_err_t handleEdit(PsychicRequest *request, JsonVariant &json) {
if (json.is<JsonObject>()) {
const char *filename = json["file"].as<const char *>();
const char *content = json["content"].as<const char *>();
ESP_LOGI(TAG, "Editing file: %s", filename);
return editFile(filename, content) ? request->reply(200) : request->reply(500);
}
return request->reply(400);
}
/* Helpers */
bool deleteFile(const char *filename) { return ESPFS.remove(filename); }
String listFiles(const String &directory, bool isRoot) {
File root = ESPFS.open(directory.startsWith("/") ? directory : "/" + directory);
if (!root.isDirectory()) return "";
File file = root.openNextFile();
String output = isRoot ? "{ \"root\": {" : "{";
while (file) {
if (file.isDirectory()) {
output += "\"" + String(file.name()) + "\": " + listFiles(file.name(), false) + ", ";
} else {
output += "\"" + String(file.name()) + "\": " + String(file.size()) + ", ";
}
file = root.openNextFile();
}
if (output.endsWith(", ")) {
output.remove(output.length() - 2);
}
output += "}";
if (isRoot) output += "}";
return output;
}
esp_err_t uploadFile(PsychicRequest *request, const String &filename, uint64_t index, uint8_t *data, size_t len,
bool last) {
File file;
String path = "/www/" + filename;
ESP_LOGI(TAG, "Writing %d/%d bytes to: %s\n", (int)index + (int)len, request->contentLength(), path.c_str());
if (last) ESP_LOGI(TAG, "%s is finished. Total bytes: %d\n", path.c_str(), (int)index + (int)len);
file = LittleFS.open(path, !index ? FILE_WRITE : FILE_APPEND);
if (!file) {
ESP_LOGE(TAG, "Failed to open file");
return ESP_FAIL;
}
if (!file.write(data, len)) {
ESP_LOGE(TAG, "Write failed");
return ESP_FAIL;
}
return ESP_OK;
}
bool editFile(const char *filename, const char *content) {
File file = ESPFS.open(filename, FILE_WRITE);
if (!file) return false;
file.print(content);
file.close();
return true;
}
} // namespace FileSystem