58 lines
1.7 KiB
Python
58 lines
1.7 KiB
Python
# 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),
|
|
},
|
|
)
|