1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- # (c) Nelen & Schuurmans
- from typing import List
- from typing import Union
- from fastapi.encoders import jsonable_encoder
- from fastapi.requests import Request
- from fastapi.responses import JSONResponse
- from starlette import status
- from clean_python import BadRequest
- from clean_python import Conflict
- from clean_python import DoesNotExist
- from clean_python import PermissionDenied
- from clean_python import Unauthorized
- from clean_python import ValueObject
- __all__ = [
- "ValidationErrorResponse",
- "DefaultErrorResponse",
- "not_found_handler",
- "conflict_handler",
- "validation_error_handler",
- "not_implemented_handler",
- "permission_denied_handler",
- "unauthorized_handler",
- ]
- class ValidationErrorEntry(ValueObject):
- loc: List[Union[str, int]]
- msg: str
- type: str
- class ValidationErrorResponse(ValueObject):
- detail: List[ValidationErrorEntry]
- class DefaultErrorResponse(ValueObject):
- message: str
- async def not_found_handler(request: Request, exc: DoesNotExist):
- return JSONResponse(
- status_code=status.HTTP_404_NOT_FOUND,
- content={"message": f"Could not find {exc.name} with id={exc.id}"},
- )
- async def conflict_handler(request: Request, exc: Conflict):
- return JSONResponse(
- status_code=status.HTTP_409_CONFLICT,
- content={"message": str(exc)},
- )
- async def validation_error_handler(request: Request, exc: BadRequest):
- return JSONResponse(
- status_code=status.HTTP_400_BAD_REQUEST,
- content=jsonable_encoder({"detail": exc.errors()}),
- )
- async def not_implemented_handler(request: Request, exc: NotImplementedError):
- return JSONResponse(
- status_code=status.HTTP_501_NOT_IMPLEMENTED,
- content={"message": str(exc)},
- )
- async def unauthorized_handler(request: Request, exc: Unauthorized):
- return JSONResponse(
- status_code=status.HTTP_401_UNAUTHORIZED,
- content={"message": "Unauthorized"},
- )
- async def permission_denied_handler(request: Request, exc: PermissionDenied):
- return JSONResponse(
- status_code=status.HTTP_403_FORBIDDEN,
- content={"message": "Permission denied"},
- )
|