diff --git a/app/orders/routes.py b/app/orders/routes.py index 3cb8372..d639ecb 100644 --- a/app/orders/routes.py +++ b/app/orders/routes.py @@ -1,12 +1,13 @@ -from fastapi import APIRouter +from fastapi import APIRouter, Depends from ..schemas import Order +from ..request_guards import require_json_body from ..services import OrdersService orders = APIRouter() -@orders.post("/orders", status_code=201) +@orders.post("/orders", status_code=201, dependencies=[Depends(require_json_body)]) async def create_order(order: Order) -> dict[str, int]: new_order = await OrdersService.create_order(order) return {"id": new_order["id"]} diff --git a/app/products/routes.py b/app/products/routes.py index bc3309c..be6e883 100644 --- a/app/products/routes.py +++ b/app/products/routes.py @@ -1,7 +1,8 @@ -from fastapi import APIRouter, Header, HTTPException +from fastapi import APIRouter, Depends, Header, HTTPException from fastapi.responses import JSONResponse from ..schemas import Product, ProductType +from ..request_guards import require_json_body from ..services import ProductService products = APIRouter() @@ -22,7 +23,7 @@ async def find_available_products( return JSONResponse(content=products) -@products.post("/products", status_code=201) +@products.post("/products", status_code=201, dependencies=[Depends(require_json_body)]) async def add_product(data: Product) -> dict[str, int]: product = await ProductService.create_product(data) return {"id": product["id"]} diff --git a/app/request_guards.py b/app/request_guards.py new file mode 100644 index 0000000..688f1fd --- /dev/null +++ b/app/request_guards.py @@ -0,0 +1,10 @@ +from fastapi import HTTPException, Request + + +async def require_json_body(request: Request) -> None: + content_type = (request.headers.get("content-type") or "").split(";")[0].strip().lower() + if content_type != "application/json": + raise HTTPException(status_code=415, detail="Request body is required") + + if not await request.body(): + raise HTTPException(status_code=415, detail="Request body is required") diff --git a/requirements.txt b/requirements.txt index 713c18f..675a135 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ fastapi>=0.110 pytest>=7.4 python-dotenv>=1.0 -specmatic==2.39.6.post1 +specmatic==2.48.0 redis==7.0.1 testcontainers==4.13.2 -coverage==7.11.0 \ No newline at end of file +coverage==7.11.0 diff --git a/specmatic.yaml b/specmatic.yaml index 26656ca..682dc29 100644 --- a/specmatic.yaml +++ b/specmatic.yaml @@ -29,6 +29,7 @@ components: specmaticOrderContracts: git: url: https://github.com/specmatic/specmatic-order-contracts.git + branch: missing-response-codes services: productSearchBffService: description: Product Search BFF Service