Busca por nome com destaque e navegação para página

This commit is contained in:
Frederico Castro
2025-12-10 16:20:37 -03:00
parent 90552fe607
commit 01aace497b
7 changed files with 135 additions and 3 deletions

View File

@@ -172,6 +172,24 @@ class RankingOracleRepository:
return results[0]["TOTAL"] if results else 0
def buscar_por_nome(self, nome: str, limit: int = 5) -> List[Dict[str, Any]]:
"""
Busca consultores por nome (like), retornando posições.
"""
query = """
SELECT
ID_PESSOA,
NOME,
POSICAO,
PONTUACAO_TOTAL
FROM TB_RANKING_CONSULTOR
WHERE UPPER(NOME) LIKE UPPER(:nome)
ORDER BY POSICAO NULLS LAST
FETCH FIRST :limit ROWS ONLY
"""
params = {"nome": f"%{nome}%", "limit": limit}
return self.client.executar_query(query, params)
def buscar_por_id(self, id_pessoa: int) -> Optional[ConsultorRanking]:
"""
Busca consultor específico com sua posição no ranking.

View File

@@ -17,6 +17,7 @@ from ..schemas.ranking_schema import (
JobStatusSchema,
ProcessarRankingRequestSchema,
ProcessarRankingResponseSchema,
ConsultaNomeSchema,
)
from .dependencies import get_repository, get_ranking_repository, get_processar_job
from ...application.jobs.job_status import job_status
@@ -113,6 +114,24 @@ async def ranking_paginado(
)
@router.get("/ranking/busca", response_model=List[ConsultaNomeSchema])
async def buscar_por_nome(
nome: str = Query(..., min_length=3, description="Nome (ou parte) para buscar"),
limit: int = Query(default=5, ge=1, le=20, description="Limite de resultados"),
ranking_repo = Depends(get_ranking_repository),
):
resultados = ranking_repo.buscar_por_nome(nome=nome, limit=limit)
return [
ConsultaNomeSchema(
id_pessoa=r["ID_PESSOA"],
nome=r["NOME"],
posicao=r["POSICAO"],
pontuacao_total=float(r["PONTUACAO_TOTAL"]),
)
for r in resultados
]
def _consultor_resumo_from_ranking(c):
consultoria = None
coordenacoes_capes = None

View File

@@ -63,3 +63,10 @@ class ProcessarRankingResponseSchema(BaseModel):
sucesso: bool
mensagem: str
job_id: Optional[str] = None
class ConsultaNomeSchema(BaseModel):
id_pessoa: int
nome: str
posicao: Optional[int]
pontuacao_total: float