// POST /api/tasks — Create a new task // Body: {"user_id":1, "title":"...", "due_date":1741369200} #include "cJSON.h" #include "esp_http_server.h" #include "todo.hpp" #include "types.hpp" internal esp_err_t api_tasks_post_handler(httpd_req_t *req) { httpd_resp_set_type(req, "application/json"); httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); char buf[256]; int received = httpd_req_recv(req, buf, sizeof(buf) - 1); if (received <= 0) { httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST, "Empty body"); return ESP_FAIL; } buf[received] = '\0'; cJSON *body = cJSON_Parse(buf); if (!body) { httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST, "Invalid JSON"); return ESP_FAIL; } cJSON *user_id_item = cJSON_GetObjectItem(body, "user_id"); cJSON *title_item = cJSON_GetObjectItem(body, "title"); cJSON *due_date_item = cJSON_GetObjectItem(body, "due_date"); if (!cJSON_IsNumber(user_id_item) || !cJSON_IsString(title_item) || !cJSON_IsNumber(due_date_item)) { cJSON_Delete(body); httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST, "Missing user_id, title, or due_date"); return ESP_FAIL; } task_t *task = add_task((uint8)user_id_item->valueint, title_item->valuestring, (int64)due_date_item->valuedouble); cJSON_Delete(body); if (!task) { httpd_resp_send_err(req, HTTPD_500_INTERNAL_SERVER_ERROR, "Task limit reached or invalid user"); return ESP_FAIL; } cJSON *resp = cJSON_CreateObject(); cJSON_AddNumberToObject(resp, "id", task->id); cJSON_AddNumberToObject(resp, "user_id", task->user_id); cJSON_AddStringToObject(resp, "title", task->title); cJSON_AddNumberToObject(resp, "due_date", (double)task->due_date); cJSON_AddBoolToObject(resp, "completed", task->completed); const char *json = cJSON_PrintUnformatted(resp); httpd_resp_sendstr(req, json); free((void *)json); cJSON_Delete(resp); return ESP_OK; } internal const httpd_uri_t api_tasks_post_uri = {.uri = "/api/tasks", .method = HTTP_POST, .handler = api_tasks_post_handler, .user_ctx = NULL};