From 84e8aadf1198ba2a8b6b55222a77089b23b035a1 Mon Sep 17 00:00:00 2001 From: gabdevele Date: Wed, 3 Jun 2026 01:20:11 +0200 Subject: [PATCH] Remove photo alias --- AGENTS.md | 2 +- README.md | 2 +- controllers/ReportController.cc | 2 -- controllers/ReportController.h | 3 --- docs/API_SPEC.md | 3 +-- docs/MILESTONE_03.md | 4 ++-- main.cc | 5 ++--- services/ReportService.cc | 7 ++----- tools/drogon-openapi-gen/generate.py | 2 +- 9 files changed, 10 insertions(+), 20 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 62ba1ac..1c09a07 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -26,7 +26,7 @@ - OpenAPI: `cmake --build build --target openapi` - Lab frontend: `streamlit run tools/visione-lab/app.py` - Local services: `docker compose up -d` -- App: `./build/visione-backend config.json` +- App: `./build/visione-backend` ## Development Workflow - Update docs when behavior, schema, setup or API contracts change. diff --git a/README.md b/README.md index 327ef49..3c7ce0e 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ docker compose up -d cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug cmake --build build -./build/visione-backend config.json +./build/visione-backend ``` The API listens on `http://localhost:5555`. diff --git a/controllers/ReportController.cc b/controllers/ReportController.cc index d4fd1e4..1a8c2bf 100644 --- a/controllers/ReportController.cc +++ b/controllers/ReportController.cc @@ -287,7 +287,6 @@ void ReportController::uploadMedia( Json::Value response; response["ok"] = true; response["media"] = Json::arrayValue; - response["photos"] = Json::arrayValue; for (const auto &file : parser.getFiles()) { @@ -325,7 +324,6 @@ void ReportController::uploadMedia( item["kind"] = mediaType.kind; item["content_type"] = mediaType.contentType; response["media"].append(item); - response["photos"].append(url); } callback(visione::http::json(std::move(response), drogon::k201Created)); diff --git a/controllers/ReportController.h b/controllers/ReportController.h index e6d6a3b..d7f90bc 100644 --- a/controllers/ReportController.h +++ b/controllers/ReportController.h @@ -30,9 +30,6 @@ class ReportController : public drogon::HttpController ADD_METHOD_TO(ReportController::uploadMedia, "/api/v1/reports/{1}/media", drogon::Post); - ADD_METHOD_TO(ReportController::uploadMedia, - "/api/v1/reports/{1}/photos", - drogon::Post); METHOD_LIST_END void create(const drogon::HttpRequestPtr &req, diff --git a/docs/API_SPEC.md b/docs/API_SPEC.md index fbea04d..e56826f 100644 --- a/docs/API_SPEC.md +++ b/docs/API_SPEC.md @@ -33,8 +33,7 @@ Authorization: Bearer - `POST /reports/{id}/assignments`: assign a team. - `POST /reports/{id}/feedback`: add citizen feedback. - `POST /reports/{id}/media`: upload up to five multipart media files. Supported - types are JPEG, PNG, WebP, MP4, WebM and QuickTime. The legacy - `/reports/{id}/photos` path is kept as a compatibility alias. + types are JPEG, PNG, WebP, MP4, WebM and QuickTime. ## Admin Reference Data - `GET|POST /admin/categories` diff --git a/docs/MILESTONE_03.md b/docs/MILESTONE_03.md index 4cd1a56..4bac00a 100644 --- a/docs/MILESTONE_03.md +++ b/docs/MILESTONE_03.md @@ -7,7 +7,7 @@ than plain SHA-256 and available through the existing OpenSSL dependency. - Added report media uploads at `POST /api/v1/reports/{id}/media`. - Supported JPEG, PNG, WebP, MP4, WebM and QuickTime uploads. -- Kept `POST /api/v1/reports/{id}/photos` as a temporary compatibility alias. +- Removed the old `/photos` upload path; report attachments now use `/media`. - Added generated OpenAPI JSON from Drogon controller route macros. - Exposed `/api/v1/openapi.json` and `/api/v1/docs`. - Added a small Streamlit API lab for visual endpoint testing. @@ -17,5 +17,5 @@ - Consider extracting `tools/drogon-openapi-gen` into an open-source standalone project once the conventions stabilize. - Add minimal media upload integration tests after endpoint contracts settle. -- Replace the compatibility `/photos` alias once external scripts use `/media`. +- Keep API and docs on `media` terminology only. - Keep the Streamlit lab small and replace it with the real frontend later. diff --git a/main.cc b/main.cc index 93cac37..933dc4c 100644 --- a/main.cc +++ b/main.cc @@ -6,16 +6,15 @@ #include -int main(int argc, char *argv[]) +int main() { setvbuf(stdout, nullptr, _IONBF, 0); (void)RequestLogger::classTypeName(); - const auto configPath = argc > 1 ? argv[1] : "config.json"; Json::Value requestLoggerConfig; requestLoggerConfig["include_query"] = true; - drogon::app().loadConfigFile(configPath); + drogon::app().loadConfigFile("config.json"); drogon::app().addPlugin("RequestLogger", {}, requestLoggerConfig); visione::cors::configure(); diff --git a/services/ReportService.cc b/services/ReportService.cc index f9c2b62..200c0fd 100644 --- a/services/ReportService.cc +++ b/services/ReportService.cc @@ -181,11 +181,9 @@ Json::Value ReportService::createReport(const auth::UserContext &user, reportId, user.id); - const auto &mediaItems = - body["media"].isArray() ? body["media"] : body["photos"]; - if (mediaItems.isArray()) + if (body["media"].isArray()) { - for (const auto &item : mediaItems) + for (const auto &item : body["media"]) { if (item.isString() && !item.asString().empty()) { @@ -287,7 +285,6 @@ Json::Value ReportService::reportDetail(const auth::UserContext &user, response["media"] = repositories::resultToJson(db->execSqlSync( "SELECT * FROM report_photos WHERE report_id = ? ORDER BY id", reportId)); - response["photos"] = response["media"]; return response; } diff --git a/tools/drogon-openapi-gen/generate.py b/tools/drogon-openapi-gen/generate.py index 26597ac..0c85df7 100644 --- a/tools/drogon-openapi-gen/generate.py +++ b/tools/drogon-openapi-gen/generate.py @@ -54,7 +54,7 @@ def openapi_path(path: str) -> tuple[str, list[dict]]: def request_body(path: str, method: str) -> dict | None: if method != "post" and method != "patch": return None - if path.endswith("/media") or path.endswith("/photos"): + if path.endswith("/media"): return { "required": True, "content": {