diff --git a/kwik/applications/kwik.py b/kwik/applications/kwik.py index 08e11adf..15a40b5f 100644 --- a/kwik/applications/kwik.py +++ b/kwik/applications/kwik.py @@ -6,6 +6,7 @@ from fastapi import FastAPI from kwik import settings from kwik.api.endpoints.docs import get_swagger_ui_html +from kwik.exceptions import KwikException from kwik.middlewares import DBSessionMiddleware, RequestContextMiddleware from kwik.websocket.deps import broadcast from starlette.middleware.cors import CORSMiddleware @@ -62,6 +63,8 @@ def __init__(self, api_router: APIRouter) -> None: self._app.include_router(api_router, prefix=settings.API_V1_STR) + self._app.exception_handler(KwikException)(kwik.exceptions.handler.kwik_exception_handler) + @self._app.get("/docs", include_in_schema=False) async def custom_swagger_ui_html(): return get_swagger_ui_html( diff --git a/kwik/exceptions/__init__.py b/kwik/exceptions/__init__.py index ee11d60f..b449f458 100644 --- a/kwik/exceptions/__init__.py +++ b/kwik/exceptions/__init__.py @@ -1,3 +1,6 @@ -from .base import KwikException, DuplicatedEntity, Forbidden, NotFound +from __future__ import annotations + +from .base import DuplicatedEntity, Forbidden, KwikException, NotFound from .exporters import ExporterLimitExceeded -from .users import UserInactive, IncorrectCredentials, UserNotFound +from .handler import kwik_exception_handler +from .users import IncorrectCredentials, UserInactive, UserNotFound diff --git a/kwik/exceptions/handler.py b/kwik/exceptions/handler.py new file mode 100644 index 00000000..dcaadef0 --- /dev/null +++ b/kwik/exceptions/handler.py @@ -0,0 +1,12 @@ +from __future__ import annotations + +from fastapi import Request +from kwik.exceptions import KwikException +from starlette.responses import JSONResponse + + +async def kwik_exception_handler(request: Request, exc: KwikException): + return JSONResponse( + status_code=exc.status_code, + content={"detail": exc.detail}, + )