fix: retornando erro 503 com origem correta por banco

main
parent 28d7daccb2
commit 772c8d8055

@ -1,6 +1,7 @@
from typing import List, Dict, Any from typing import List, Dict, Any
from fastapi import APIRouter, Depends from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from app.api.schemas import ( from app.api.schemas import (
@ -32,6 +33,22 @@ def get_db():
finally: finally:
db.close() db.close()
def _db_error_detail(exc: SQLAlchemyError) -> str:
text = str(exc).lower()
# Heuristica para identificar falhas no MySQL (base ficticia).
mysql_markers = ("mysql", "pymysql", "(2003", "mock", "3306")
if any(marker in text for marker in mysql_markers):
return "Servico temporariamente indisponivel: banco MySQL (dados ficticios) inacessivel."
# Heuristica para identificar falhas no PostgreSQL (tools).
pg_markers = ("postgres", "psycopg", "postgresql", "5432", "tools")
if any(marker in text for marker in pg_markers):
return "Servico temporariamente indisponivel: banco PostgreSQL (tools) inacessivel."
return "Servico temporariamente indisponivel: erro de acesso ao banco de dados."
''' '''
# Removido momentaniamente para teste do Vertex IA # Removido momentaniamente para teste do Vertex IA
@router.post("/chat", response_model=ChatResponse) @router.post("/chat", response_model=ChatResponse)
@ -45,33 +62,48 @@ async def chat(request: ChatRequest, db: Session = Depends(get_db)):
''' '''
@router.post("/chat", response_model=ChatResponse) @router.post("/chat", response_model=ChatResponse)
async def chat(request: ChatRequest, db: Session = Depends(get_db)): async def chat(request: ChatRequest, db: Session = Depends(get_db)):
service = OrquestradorService(db) try:
service = OrquestradorService(db)
result = await service.handle_message( result = await service.handle_message(message=request.message)
message=request.message return ChatResponse(response=result)
) except SQLAlchemyError as exc:
raise HTTPException(
return ChatResponse(response=result) status_code=503,
detail=_db_error_detail(exc),
)
except ValueError as exc:
# Erros de configuracao de Vertex (regiao/projeto/modelo)
raise HTTPException(status_code=500, detail=f"Configuracao invalida do Vertex AI: {exc}")
except RuntimeError as exc:
raise HTTPException(status_code=503, detail=f"Falha temporaria no LLM/Vertex AI: {exc}")
@router.post("/mock/consultar-estoque") @router.post("/mock/consultar-estoque")
async def consultar_estoque_endpoint( async def consultar_estoque_endpoint(
body: ConsultarEstoqueRequest, body: ConsultarEstoqueRequest,
) -> List[Dict[str, Any]]: ) -> List[Dict[str, Any]]:
return await consultar_estoque( try:
preco_max=body.preco_max, return await consultar_estoque(
categoria=body.categoria, preco_max=body.preco_max,
) categoria=body.categoria,
ordenar_preco=body.ordenar_preco,
limite=body.limite,
)
except SQLAlchemyError as exc:
raise HTTPException(status_code=503, detail=_db_error_detail(exc))
@router.post("/mock/validar-cliente-venda") @router.post("/mock/validar-cliente-venda")
async def validar_cliente_venda_endpoint( async def validar_cliente_venda_endpoint(
body: ValidarClienteVendaRequest, body: ValidarClienteVendaRequest,
) -> Dict[str, Any]: ) -> Dict[str, Any]:
return await validar_cliente_venda( try:
cpf=body.cpf, return await validar_cliente_venda(
valor_veiculo=body.valor_veiculo, cpf=body.cpf,
) valor_veiculo=body.valor_veiculo,
)
except SQLAlchemyError as exc:
raise HTTPException(status_code=503, detail=_db_error_detail(exc))
@router.post("/mock/avaliar-veiculo-troca") @router.post("/mock/avaliar-veiculo-troca")
@ -89,17 +121,23 @@ async def avaliar_veiculo_troca_endpoint(
async def agendar_revisao_endpoint( async def agendar_revisao_endpoint(
body: AgendarRevisaoRequest, body: AgendarRevisaoRequest,
) -> Dict[str, Any]: ) -> Dict[str, Any]:
return await agendar_revisao( try:
placa=body.placa, return await agendar_revisao(
data_hora=body.data_hora, placa=body.placa,
) data_hora=body.data_hora,
)
except SQLAlchemyError as exc:
raise HTTPException(status_code=503, detail=_db_error_detail(exc))
@router.post("/mock/cancelar-pedido") @router.post("/mock/cancelar-pedido")
async def cancelar_pedido_endpoint( async def cancelar_pedido_endpoint(
body: CancelarPedidoRequest, body: CancelarPedidoRequest,
) -> Dict[str, Any]: ) -> Dict[str, Any]:
return await cancelar_pedido( try:
numero_pedido=body.numero_pedido, return await cancelar_pedido(
motivo=body.motivo, numero_pedido=body.numero_pedido,
) motivo=body.motivo,
)
except SQLAlchemyError as exc:
raise HTTPException(status_code=503, detail=_db_error_detail(exc))

Loading…
Cancel
Save