from fastapi.responses import JSONResponse from fastapi import Request class BaseAppException(Exception): status_code = 500 message = "An error occurred" def __init__(self, message: str = None): self.message = message or self.message super().__init__(self.message) class InvalidFileTypeError(BaseAppException): status_code = 415 message = "Invalid file type. Only PDF files are allowed." class FileSizeExceededError(BaseAppException): status_code = 400 message = "File size exceeds maximum allowed size." class DuplicateDocumentError(BaseAppException): status_code = 409 message = "Document with this file hash already exists." class ProcessingError(BaseAppException): status_code = 500 message = "Document processing failed." class ParsingError(BaseAppException): status_code = 500 message = "PDF parsing failed." class IndexingError(BaseAppException): status_code = 500 message = "Indexing to vector database failed." class EmbeddingError(BaseAppException): status_code = 500 message = "Embedding generation failed." class DocumentNotFoundError(BaseAppException): status_code = 404 message = "Document not found." class PaperFetchError(BaseAppException): status_code = 502 message = "Failed to fetch paper from external source." async def global_exception_handler(request: Request, exc: Exception): if isinstance(exc, BaseAppException): return JSONResponse( status_code=exc.status_code, content={ "error": exc.__class__.__name__, "message": exc.message, } ) return JSONResponse( status_code=500, content={ "error": "Internal Server Error", "details": str(exc) if request.app.debug else "An unexpected error occurred", } )