From d68d602411df357b3de4ab133033b831118167c3 Mon Sep 17 00:00:00 2001 From: Misaka_Company Date: Mon, 11 May 2026 11:12:33 +0800 Subject: [PATCH] feat: add POST /CargoTrace/location endpoint Co-Authored-By: Claude Opus 4.6 --- app/api/__init__.py | 0 app/api/v1/__init__.py | 0 app/api/v1/location.py | 18 ++++++++++++++++++ app/main.py | 24 +++++++++++++++++++++++- 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 app/api/__init__.py create mode 100644 app/api/v1/__init__.py create mode 100644 app/api/v1/location.py diff --git a/app/api/__init__.py b/app/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/api/v1/__init__.py b/app/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/api/v1/location.py b/app/api/v1/location.py new file mode 100644 index 0000000..8405b02 --- /dev/null +++ b/app/api/v1/location.py @@ -0,0 +1,18 @@ +from fastapi import APIRouter, Depends +from sqlalchemy.orm import Session + +from app.core.database import get_db +from app.schemas.location import LocationRequest, LocationResponse +from app.services.location_service import register_location + +router = APIRouter() + + +@router.post("/location", response_model=LocationResponse) +def create_location(req: LocationRequest, db: Session = Depends(get_db)): + record = register_location(db, req) + return LocationResponse( + zongpai_no=record.zongpai_no, + location_code=record.location_code, + created_at=record.created_at.isoformat(), + ) diff --git a/app/main.py b/app/main.py index 7019b25..f50b871 100644 --- a/app/main.py +++ b/app/main.py @@ -1,7 +1,29 @@ -from fastapi import FastAPI +from fastapi import FastAPI, Request +from fastapi.responses import JSONResponse + +from app.api.v1.location import router as location_router app = FastAPI(title="CargoTrace API", version="0.1.0") +app.include_router(location_router, prefix="/CargoTrace") + + +@app.exception_handler(ValueError) +async def value_error_handler(request: Request, exc: ValueError): + error_code = str(exc) + status_map = { + "INVALID_ZONGPAI": 400, + "INVALID_LOCATION": 400, + } + status = status_map.get(error_code, 400) + return JSONResponse( + status_code=status, + content={ + "error_code": error_code, + "message": str(exc), + }, + ) + @app.get("/") async def root():