from typing import Awaitable, Callable

from fastapi import HTTPException, Request, Response

MiddlewareCallNext = Callable[[Request], Awaitable[Response]]


async def validate_json(
    request: Request, call_next: MiddlewareCallNext
) -> Response:
    # Only validate JSON for requests with a body
    if request.method in ("POST", "PUT", "PATCH"):
        try:
            # attempt to parse json body
            await request.json()
        except Exception:
            raise HTTPException(status_code=400, detail="Invalid JSON payload")
    response = await call_next(request)
    return response
