from fastapi import HTTPException, status class BasicException(HTTPException): base_status_code: int = status.HTTP_500_INTERNAL_SERVER_ERROR base_detail: str = 'Something went wrong' def __init__( self, *, status_code: int | None = None, detail: str | None = None ): status_code = status_code or self.base_status_code detail = detail or self.base_detail super().__init__(status_code=status_code, detail=detail) @classmethod def description(cls, detail: str | None = None): return { 'description': detail or cls.base_detail, 'content': { 'application/json': { 'example': { 'detail': detail or cls.base_detail, } } }, } class BadRequestException(BasicException): base_status_code: int = status.HTTP_400_BAD_REQUEST base_detail: str = 'Bad Request' class UnauthorizedException(BasicException): base_status_code: int = status.HTTP_401_UNAUTHORIZED base_detail: str = 'Unauthorized' class ForbiddenException(BasicException): base_status_code: int = status.HTTP_403_FORBIDDEN base_detail: str = 'Forbidden' class NotFoundException(BasicException): base_status_code: int = status.HTTP_404_NOT_FOUND base_detail: str = 'Not Found' class ConflictException(BasicException): base_status_code: int = status.HTTP_409_CONFLICT base_detail: str = 'Conflict' class TooManyRequestsException(BasicException): base_status_code: int = status.HTTP_429_TOO_MANY_REQUESTS base_detail: str = 'Too Many Requests' class InternalServerErrorException(BasicException): base_status_code: int = status.HTTP_500_INTERNAL_SERVER_ERROR base_detail: str = 'Internal Server Error' class UnknownException(BasicException): base_status_code: int = status.HTTP_500_INTERNAL_SERVER_ERROR base_detail: str = 'Unknown error'