# middlewares/error_handler.py from fastapi import Request from fastapi.responses import JSONResponse from sqlalchemy.exc import OperationalError, IntegrityError import pymysql async def database_error_handler(request: Request, call_next): """ Middleware para capturar erros de banco de dados e retornar respostas JSON amigáveis. """ try: response = await call_next(request) return response except OperationalError as e: # Erros de conexão (ex: Access denied, banco inexistente) return JSONResponse( status_code=500, content={ "success": False, "error": "Database connection failed", "details": str(e.orig) if hasattr(e, "orig") else str(e), }, ) except IntegrityError as e: # Erros de integridade (ex: unique constraint, foreign key) return JSONResponse( status_code=400, content={ "success": False, "error": "Database integrity error", "details": str(e.orig) if hasattr(e, "orig") else str(e), }, ) except pymysql.err.OperationalError as e: # Erro específico do PyMySQL (ex: senha errada) return JSONResponse( status_code=500, content={ "success": False, "error": "MySQL Operational Error", "details": str(e), }, ) except Exception as e: # Qualquer outro erro genérico return JSONResponse( status_code=500, content={ "success": False, "error": "Internal Server Error", "details": str(e), }, )