Remake delete for api to protobuf
This commit is contained in:
@@ -17,6 +17,17 @@ using WsFrameHandler = std::function<esp_err_t(httpd_req_t*, httpd_ws_frame_t*)>
|
||||
using WsOpenHandler = std::function<void(httpd_req_t*)>;
|
||||
using WsCloseHandler = std::function<void(int)>;
|
||||
|
||||
// Macro to register a proto endpoint that extracts a specific payload type
|
||||
// Usage: PROTO_ENDPOINT(server, "/api/files/delete", file_delete_request, FileSystem::handleDelete)
|
||||
// Handler signature: esp_err_t handleDelete(httpd_req_t* req, const api_FileDeleteRequest& payload)
|
||||
#define PROTO_ENDPOINT(server_ref, uri, payload_type, handler) \
|
||||
(server_ref).onProto(uri, HTTP_POST, [&](httpd_req_t *request, api_Request *protoReq) { \
|
||||
if (protoReq->which_payload != api_Request_##payload_type##_tag) { \
|
||||
return WebServer::sendError(request, 400, "Invalid request payload"); \
|
||||
} \
|
||||
return handler(request, protoReq->payload.payload_type); \
|
||||
})
|
||||
|
||||
struct HttpRoute {
|
||||
std::string uri;
|
||||
httpd_method_t method;
|
||||
|
||||
@@ -26,7 +26,7 @@ bool editFile(const char *filename, const char *content);
|
||||
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, JsonVariant &json);
|
||||
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);
|
||||
|
||||
|
||||
@@ -111,13 +111,17 @@ esp_err_t getConfigFile(httpd_req_t *request) {
|
||||
return httpd_resp_send(request, content.c_str(), content.length());
|
||||
}
|
||||
|
||||
esp_err_t handleDelete(httpd_req_t *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) ? WebServer::sendOk(request) : WebServer::sendError(request, 500, "Delete failed");
|
||||
esp_err_t handleDelete(httpd_req_t *request, const api_FileDeleteRequest &req) {
|
||||
ESP_LOGI(TAG, "Deleting file: %s", req.path);
|
||||
|
||||
api_Response res = api_Response_init_zero;
|
||||
if (deleteFile(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, "Delete failed");
|
||||
}
|
||||
return WebServer::sendError(request, 400, "Invalid request");
|
||||
}
|
||||
|
||||
esp_err_t handleEdit(httpd_req_t *request, JsonVariant &json) {
|
||||
|
||||
+1
-2
@@ -106,8 +106,7 @@ void setupServer() {
|
||||
// TODO: REMAKE TO PROTO
|
||||
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); });
|
||||
server.on("/api/files/delete", HTTP_POST,
|
||||
[&](httpd_req_t *request, JsonVariant &json) { return FileSystem::handleDelete(request, json); });
|
||||
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,
|
||||
|
||||
@@ -11,3 +11,5 @@ api.FileEntry.children type:FT_POINTER
|
||||
api.FileList.entries type:FT_POINTER
|
||||
|
||||
api.Response.error_message type:FT_POINTER
|
||||
|
||||
api.FileDeleteRequest.path max_size:128
|
||||
|
||||
@@ -2,6 +2,10 @@ syntax = "proto3";
|
||||
|
||||
package api;
|
||||
|
||||
|
||||
// Empty message for endpoints which only needs a status
|
||||
message EmptyMessage {}
|
||||
|
||||
// =============================================================================
|
||||
// AP (Access Point) Settings - shared data types
|
||||
// =============================================================================
|
||||
@@ -54,7 +58,7 @@ message Servo {
|
||||
}
|
||||
|
||||
message ServoSettings {
|
||||
repeated Servo servos = 1; // max 12 servos
|
||||
repeated Servo servos = 1; // max 12 servos
|
||||
}
|
||||
|
||||
message ServoSettingsRequest {}
|
||||
@@ -66,8 +70,8 @@ message ServoSettingsRequest {}
|
||||
message FileEntry {
|
||||
string name = 1;
|
||||
bool is_directory = 2;
|
||||
uint32 size = 3; // Only for files
|
||||
repeated FileEntry children = 4; // Only for directories
|
||||
uint32 size = 3; // Only for files
|
||||
repeated FileEntry children = 4; // Only for directories
|
||||
}
|
||||
|
||||
message FileList {
|
||||
@@ -76,6 +80,10 @@ message FileList {
|
||||
|
||||
message FileListRequest {}
|
||||
|
||||
message FileDeleteRequest {
|
||||
string path = 1;
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// REST API wrappers - used by HTTP endpoints
|
||||
// =============================================================================
|
||||
@@ -89,6 +97,7 @@ message Request {
|
||||
ServoSettings servo_settings = 20;
|
||||
ServoSettingsRequest servo_settings_request = 21;
|
||||
FileListRequest file_list_request = 30;
|
||||
FileDeleteRequest file_delete_request = 31;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,6 +107,7 @@ message Response {
|
||||
string error_message = 2;
|
||||
|
||||
oneof payload {
|
||||
EmptyMessage empty_message = 5;
|
||||
APSettings ap_settings = 10;
|
||||
APStatus ap_status = 11;
|
||||
ServoSettings servo_settings = 20;
|
||||
|
||||
Reference in New Issue
Block a user