Coverage for polar/exception_handlers.py: 96%
23 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
1from urllib.parse import urlencode
3from fastapi import FastAPI, Request
4from fastapi.encoders import jsonable_encoder
5from fastapi.exceptions import RequestValidationError
6from fastapi.responses import JSONResponse, RedirectResponse, Response
8from polar.config import settings
9from polar.exceptions import (
10 PolarError,
11 PolarRedirectionError,
12 PolarRequestValidationError,
13 ResourceNotModified,
14)
17async def polar_exception_handler(request: Request, exc: PolarError) -> JSONResponse:
18 return JSONResponse(
19 status_code=exc.status_code,
20 content={"error": type(exc).__name__, "detail": exc.message},
21 headers=exc.headers,
22 )
25async def request_validation_exception_handler(
26 request: Request, exc: RequestValidationError | PolarRequestValidationError
27) -> JSONResponse:
28 return JSONResponse(
29 status_code=422,
30 content={"error": type(exc).__name__, "detail": jsonable_encoder(exc.errors())},
31 )
34async def polar_redirection_exception_handler(
35 request: Request, exc: PolarRedirectionError
36) -> RedirectResponse:
37 error_url_params = urlencode(
38 {
39 "message": exc.message,
40 "return_to": exc.return_to or settings.FRONTEND_DEFAULT_RETURN_PATH,
41 }
42 )
43 error_url = f"{settings.generate_frontend_url('/error')}?{error_url_params}"
44 return RedirectResponse(error_url, 303)
47async def polar_not_modified_handler(
48 request: Request, exc: ResourceNotModified
49) -> Response:
50 return Response(status_code=exc.status_code)
53def add_exception_handlers(app: FastAPI) -> None:
54 app.add_exception_handler(
55 PolarRedirectionError,
56 polar_redirection_exception_handler, # type: ignore
57 )
58 app.add_exception_handler(
59 ResourceNotModified,
60 polar_not_modified_handler, # type: ignore
61 )
63 app.add_exception_handler(
64 RequestValidationError,
65 request_validation_exception_handler, # type: ignore
66 )
67 app.add_exception_handler(
68 PolarRequestValidationError,
69 request_validation_exception_handler, # type: ignore
70 )
71 app.add_exception_handler(PolarError, polar_exception_handler) # type: ignore