""" User 모듈 커스텀 예외 정의 인증 및 사용자 관련 에러를 처리하기 위한 예외 클래스들입니다. """ from fastapi import HTTPException, status class AuthException(HTTPException): """인증 관련 기본 예외""" def __init__( self, status_code: int, code: str, message: str, ): super().__init__( status_code=status_code, detail={"code": code, "message": message}, ) # ============================================================================= # 카카오 OAuth 관련 예외 # ============================================================================= class InvalidAuthCodeError(AuthException): """유효하지 않은 인가 코드""" def __init__(self, message: str = "유효하지 않은 인가 코드입니다."): super().__init__( status_code=status.HTTP_400_BAD_REQUEST, code="INVALID_CODE", message=message, ) class KakaoAuthFailedError(AuthException): """카카오 인증 실패""" def __init__(self, message: str = "카카오 인증에 실패했습니다."): super().__init__( status_code=status.HTTP_400_BAD_REQUEST, code="KAKAO_AUTH_FAILED", message=message, ) class KakaoAPIError(AuthException): """카카오 API 호출 오류""" def __init__(self, message: str = "카카오 API 호출 중 오류가 발생했습니다."): super().__init__( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, code="KAKAO_API_ERROR", message=message, ) # ============================================================================= # JWT 토큰 관련 예외 # ============================================================================= class TokenExpiredError(AuthException): """토큰 만료""" def __init__(self, message: str = "토큰이 만료되었습니다. 다시 로그인해주세요."): super().__init__( status_code=status.HTTP_401_UNAUTHORIZED, code="TOKEN_EXPIRED", message=message, ) class InvalidTokenError(AuthException): """유효하지 않은 토큰""" def __init__(self, message: str = "유효하지 않은 토큰입니다."): super().__init__( status_code=status.HTTP_401_UNAUTHORIZED, code="INVALID_TOKEN", message=message, ) class TokenRevokedError(AuthException): """취소된 토큰""" def __init__(self, message: str = "취소된 토큰입니다. 다시 로그인해주세요."): super().__init__( status_code=status.HTTP_401_UNAUTHORIZED, code="TOKEN_REVOKED", message=message, ) class MissingTokenError(AuthException): """토큰 누락""" def __init__(self, message: str = "인증 토큰이 필요합니다."): super().__init__( status_code=status.HTTP_401_UNAUTHORIZED, code="MISSING_TOKEN", message=message, ) # ============================================================================= # 사용자 관련 예외 # ============================================================================= class UserNotFoundError(AuthException): """사용자 없음""" def __init__(self, message: str = "가입되지 않은 사용자 입니다."): super().__init__( status_code=status.HTTP_404_NOT_FOUND, code="USER_NOT_FOUND", message=message, ) class UserInactiveError(AuthException): """비활성화된 계정""" def __init__(self, message: str = "활성화 상태가 아닌 사용자 입니다."): super().__init__( status_code=status.HTTP_403_FORBIDDEN, code="USER_INACTIVE", message=message, ) class AdminRequiredError(AuthException): """관리자 권한 필요""" def __init__(self, message: str = "관리자 권한이 필요합니다."): super().__init__( status_code=status.HTTP_403_FORBIDDEN, code="ADMIN_REQUIRED", message=message, )