From 9e59254a945617df8cb9231fb4bb15ac5b425b7c Mon Sep 17 00:00:00 2001 From: StarKhan6368 Date: Sat, 6 Jun 2026 02:51:13 +0530 Subject: [PATCH 1/2] Align sample project with latest changes --- app/orders/routes.py | 5 +++-- app/products/routes.py | 5 +++-- app/request_guards.py | 10 ++++++++++ requirements.txt | 2 +- specmatic.yaml | 1 + 5 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 app/request_guards.py 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..8cb7c15 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.46.4 redis==7.0.1 testcontainers==4.13.2 coverage==7.11.0 \ No newline at end of file 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 From 5887462bf122e01536a9274a2fb987a777fbed14 Mon Sep 17 00:00:00 2001 From: StarKhan6368 Date: Fri, 19 Jun 2026 12:51:38 +0530 Subject: [PATCH 2/2] Updated specmatic version to latest --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 8cb7c15..675a135 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ fastapi>=0.110 pytest>=7.4 python-dotenv>=1.0 -specmatic==2.46.4 +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