Make /api/files/... to proto endpoints
This commit is contained in:
@@ -6,6 +6,8 @@
|
||||
import { modals } from 'svelte-modals'
|
||||
import NewFolderDialog from './NewFolderDialog.svelte'
|
||||
import NewFileDialog from './NewFileDialog.svelte'
|
||||
import { api } from '$lib/api'
|
||||
import type { Response } from '$lib/platform_shared/api'
|
||||
|
||||
let currentPath = $state('/')
|
||||
let files = $state<Array<{ name: string; size: number }>>([])
|
||||
@@ -87,16 +89,17 @@
|
||||
error = ''
|
||||
try {
|
||||
const filePath = currentPath === '/' ? `/${selectedFile}` : `${currentPath}/${selectedFile}`
|
||||
const encoder = new TextEncoder()
|
||||
const data = encoder.encode(fileContent)
|
||||
const content = new TextEncoder().encode(fileContent)
|
||||
|
||||
const result = await fileSystemClient.uploadFile(filePath, data)
|
||||
const result = await api.post_proto<Response>('/api/files/edit', {
|
||||
fileEditRequest: { path: filePath, content }
|
||||
})
|
||||
|
||||
if (result.success) {
|
||||
if (result.ok && result.value.statusCode === 200) {
|
||||
isEditing = false
|
||||
await loadDirectory() // Refresh to update file sizes
|
||||
} else {
|
||||
error = result.error || 'Failed to save file'
|
||||
error = result.ok ? result.value.errorMessage || 'Failed to save file' : 'Failed to save file'
|
||||
}
|
||||
} catch (e) {
|
||||
error = e instanceof Error ? e.message : 'Failed to save file'
|
||||
@@ -189,11 +192,14 @@
|
||||
const path = currentPath === '/' ? `/${folderName}` : `${currentPath}/${folderName}`
|
||||
|
||||
try {
|
||||
const result = await fileSystemClient.createDirectory(path)
|
||||
if (result.success) {
|
||||
const result = await api.post_proto<Response>('/api/files/mkdir', {
|
||||
fileMkdirRequest: { path }
|
||||
})
|
||||
|
||||
if (result.ok && result.value.statusCode === 200) {
|
||||
await loadDirectory()
|
||||
} else {
|
||||
error = result.error || 'Failed to create directory'
|
||||
error = result.ok ? result.value.errorMessage || 'Failed to create directory' : 'Failed to create directory'
|
||||
}
|
||||
} catch (e) {
|
||||
error = e instanceof Error ? e.message : 'Error creating directory'
|
||||
@@ -207,15 +213,15 @@
|
||||
const path = currentPath === '/' ? `/${fileName}` : `${currentPath}/${fileName}`
|
||||
|
||||
try {
|
||||
const encoder = new TextEncoder()
|
||||
const data = encoder.encode('{}') // Default empty JSON
|
||||
const result = await api.post_proto<Response>('/api/files/edit', {
|
||||
fileEditRequest: { path, content: new Uint8Array(0) }
|
||||
})
|
||||
|
||||
const result = await fileSystemClient.uploadFile(path, data)
|
||||
if (result.success) {
|
||||
if (result.ok && result.value.statusCode === 200) {
|
||||
await loadDirectory()
|
||||
await loadFileContent(fileName)
|
||||
} else {
|
||||
error = result.error || 'Failed to create file'
|
||||
error = result.ok ? result.value.errorMessage || 'Failed to create file' : 'Failed to create file'
|
||||
}
|
||||
} catch (e) {
|
||||
error = e instanceof Error ? e.message : 'Error creating file'
|
||||
|
||||
@@ -21,13 +21,13 @@ namespace FileSystem {
|
||||
void listFilesProto(const std::string &directory, api_FileEntry *entry);
|
||||
std::string listFiles(const std::string &directory, bool isRoot = true);
|
||||
bool deleteFile(const char *filename);
|
||||
bool editFile(const char *filename, const char *content);
|
||||
bool editFile(const char *filename, const uint8_t *content, size_t size);
|
||||
|
||||
esp_err_t getFilesProto(httpd_req_t *request);
|
||||
esp_err_t getFiles(httpd_req_t *request);
|
||||
esp_err_t getConfigFile(httpd_req_t *request);
|
||||
esp_err_t handleDelete(httpd_req_t *request, const api_FileDeleteRequest &req);
|
||||
esp_err_t handleEdit(httpd_req_t *request, JsonVariant &json);
|
||||
esp_err_t mkdir(httpd_req_t *request, JsonVariant &json);
|
||||
esp_err_t handleEdit(httpd_req_t *request, const api_FileEditRequest &req);
|
||||
esp_err_t mkdir(httpd_req_t *request, const api_FileMkdirRequest &req);
|
||||
|
||||
} // namespace FileSystem
|
||||
|
||||
+23
-14
@@ -124,15 +124,17 @@ esp_err_t handleDelete(httpd_req_t *request, const api_FileDeleteRequest &req) {
|
||||
}
|
||||
}
|
||||
|
||||
esp_err_t handleEdit(httpd_req_t *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) ? WebServer::sendOk(request)
|
||||
: WebServer::sendError(request, 500, "Edit failed");
|
||||
esp_err_t handleEdit(httpd_req_t *request, const api_FileEditRequest &req) {
|
||||
ESP_LOGI(TAG, "Editing file: %s", req.path);
|
||||
|
||||
api_Response res = api_Response_init_zero;
|
||||
if (editFile(req.path, req.content->bytes, req.content->size)) {
|
||||
res.status_code = 200;
|
||||
res.which_payload = api_Response_empty_message_tag;
|
||||
return WebServer::sendProto(request, 200, res, api_Response_fields);
|
||||
} else {
|
||||
return WebServer::sendError(request, 500, "Edit failed");
|
||||
}
|
||||
return WebServer::sendError(request, 400, "Invalid request");
|
||||
}
|
||||
|
||||
bool deleteFile(const char *filename) { return ESP_FS.remove(filename); }
|
||||
@@ -167,19 +169,26 @@ std::string listFiles(const std::string &directory, bool isRoot) {
|
||||
return output;
|
||||
}
|
||||
|
||||
bool editFile(const char *filename, const char *content) {
|
||||
bool editFile(const char *filename, const uint8_t *content, size_t size) {
|
||||
File file = ESP_FS.open(filename, FILE_WRITE);
|
||||
if (!file) return false;
|
||||
|
||||
file.print(content);
|
||||
file.write(content, size);
|
||||
file.close();
|
||||
return true;
|
||||
}
|
||||
|
||||
esp_err_t mkdir(httpd_req_t *request, JsonVariant &json) {
|
||||
const char *path = json["path"].as<const char *>();
|
||||
ESP_LOGI(TAG, "Creating directory: %s", path);
|
||||
return ESP_FS.mkdir(path) ? WebServer::sendOk(request) : WebServer::sendError(request, 500, "mkdir failed");
|
||||
esp_err_t mkdir(httpd_req_t *request, const api_FileMkdirRequest &req) {
|
||||
ESP_LOGI(TAG, "Creating directory: %s", req.path);
|
||||
|
||||
api_Response res = api_Response_init_zero;
|
||||
if (ESP_FS.mkdir(req.path)) {
|
||||
res.status_code = 200;
|
||||
res.which_payload = api_Response_empty_message_tag;
|
||||
return WebServer::sendProto(request, 200, res, api_Response_fields);
|
||||
} else {
|
||||
return WebServer::sendError(request, 500, "mkdir failed");
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace FileSystem
|
||||
|
||||
+2
-4
@@ -106,10 +106,8 @@ void setupServer() {
|
||||
server.on("/api/config/*", HTTP_GET, [](httpd_req_t *request) { return FileSystem::getConfigFile(request); });
|
||||
server.on("/api/files", HTTP_GET, [&](httpd_req_t *request) { return FileSystem::getFilesProto(request); });
|
||||
PROTO_ENDPOINT(server, "/api/files/delete", file_delete_request, FileSystem::handleDelete);
|
||||
server.on("/api/files/edit", HTTP_POST,
|
||||
[&](httpd_req_t *request, JsonVariant &json) { return FileSystem::handleEdit(request, json); });
|
||||
server.on("/api/files/mkdir", HTTP_POST,
|
||||
[&](httpd_req_t *request, JsonVariant &json) { return FileSystem::mkdir(request, json); });
|
||||
PROTO_ENDPOINT(server, "/api/files/edit", file_edit_request, FileSystem::handleEdit);
|
||||
PROTO_ENDPOINT(server, "/api/files/mkdir", file_mkdir_request, FileSystem::mkdir);
|
||||
#if EMBED_WEBAPP
|
||||
mountStaticAssets(server);
|
||||
#endif
|
||||
|
||||
@@ -84,6 +84,15 @@ message FileDeleteRequest {
|
||||
string path = 1;
|
||||
}
|
||||
|
||||
message FileEditRequest {
|
||||
string path = 1;
|
||||
bytes content = 2;
|
||||
}
|
||||
|
||||
message FileMkdirRequest {
|
||||
string path = 1;
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// REST API wrappers - used by HTTP endpoints
|
||||
// =============================================================================
|
||||
@@ -98,6 +107,8 @@ message Request {
|
||||
ServoSettingsRequest servo_settings_request = 21;
|
||||
FileListRequest file_list_request = 30;
|
||||
FileDeleteRequest file_delete_request = 31;
|
||||
FileEditRequest file_edit_request = 32;
|
||||
FileMkdirRequest file_mkdir_request = 33;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user