youtube-summarizer/backend/core/exceptions.py

64 lines
1.8 KiB
Python

from enum import Enum
from typing import Optional, Dict, Any
from fastapi import status
class ErrorCode(str, Enum):
INVALID_URL = "INVALID_URL"
UNSUPPORTED_FORMAT = "UNSUPPORTED_FORMAT"
VIDEO_NOT_FOUND = "VIDEO_NOT_FOUND"
TRANSCRIPT_NOT_AVAILABLE = "TRANSCRIPT_NOT_AVAILABLE"
AI_SERVICE_ERROR = "AI_SERVICE_ERROR"
RATE_LIMIT_EXCEEDED = "RATE_LIMIT_EXCEEDED"
INTERNAL_ERROR = "INTERNAL_ERROR"
class BaseAPIException(Exception):
def __init__(
self,
message: str,
error_code: ErrorCode,
status_code: int = status.HTTP_500_INTERNAL_SERVER_ERROR,
details: Optional[Dict[str, Any]] = None,
recoverable: bool = False
):
self.message = message
self.error_code = error_code
self.status_code = status_code
self.details = details or {}
self.recoverable = recoverable
super().__init__(message)
class UserInputError(BaseAPIException):
def __init__(
self,
message: str,
error_code: ErrorCode,
details: Optional[Dict[str, Any]] = None
):
super().__init__(
message=message,
error_code=error_code,
status_code=status.HTTP_400_BAD_REQUEST,
details=details,
recoverable=True
)
class ValidationError(UserInputError):
def __init__(self, message: str, details: Optional[Dict[str, Any]] = None):
super().__init__(
message=message,
error_code=ErrorCode.INVALID_URL,
details=details
)
class UnsupportedFormatError(UserInputError):
def __init__(self, message: str, details: Optional[Dict[str, Any]] = None):
super().__init__(
message=message,
error_code=ErrorCode.UNSUPPORTED_FORMAT,
details=details
)