64 lines
1.8 KiB
Python
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
|
|
) |