Coverage for polar/exception_handlers.py: 83%

23 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-12-05 17:15 +0000

1from urllib.parse import urlencode 1a

2 

3from fastapi import FastAPI, Request 1a

4from fastapi.encoders import jsonable_encoder 1a

5from fastapi.exceptions import RequestValidationError 1a

6from fastapi.responses import JSONResponse, RedirectResponse, Response 1a

7 

8from polar.config import settings 1a

9from polar.exceptions import ( 1a

10 PolarError, 

11 PolarRedirectionError, 

12 PolarRequestValidationError, 

13 ResourceNotModified, 

14) 

15 

16 

17async def polar_exception_handler(request: Request, exc: PolarError) -> JSONResponse: 1a

18 return JSONResponse( 1c

19 status_code=exc.status_code, 

20 content={"error": type(exc).__name__, "detail": exc.message}, 

21 headers=exc.headers, 

22 ) 

23 

24 

25async def request_validation_exception_handler( 1a

26 request: Request, exc: RequestValidationError | PolarRequestValidationError 

27) -> JSONResponse: 

28 return JSONResponse( 1c

29 status_code=422, 

30 content={"error": type(exc).__name__, "detail": jsonable_encoder(exc.errors())}, 

31 ) 

32 

33 

34async def polar_redirection_exception_handler( 1a

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) 

45 

46 

47async def polar_not_modified_handler( 1a

48 request: Request, exc: ResourceNotModified 

49) -> Response: 

50 return Response(status_code=exc.status_code) 

51 

52 

53def add_exception_handlers(app: FastAPI) -> None: 1a

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 ) 

62 

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