Files
ranking/backend/src/interface/api/app.py
Frederico Castro e11cdcd083 feat: Implementa duas conexões Oracle simultâneas
- Oracle LOCAL (Docker): Para salvar TB_RANKING_CONSULTOR
- Oracle REMOTO (CAPES): Para ler SUCUPIRA_PAINEL.VM_COORDENADOR
- ConsultorRepositoryImpl usa oracle_remote para buscar PPG
- RankingRepository usa oracle_local para salvar ranking
- ProcessarRankingJob recebe ambos os clientes
- Componente B agora está preparado para funcionar

Nota: Elasticsearch precisa ser acessível da rede CAPES
2025-12-10 04:21:17 -03:00

84 lines
1.9 KiB
Python

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
from .routes import router
from .config import settings
from .dependencies import es_client, oracle_local_client, oracle_remote_client, get_processar_job
from ...application.jobs.scheduler import RankingScheduler
@asynccontextmanager
async def lifespan(app: FastAPI):
await es_client.connect()
# Conectar Oracle LOCAL (Docker)
try:
oracle_local_client.connect()
print("Oracle LOCAL conectado (Docker)")
except Exception as e:
print(f"AVISO: Oracle LOCAL não conectou: {e}")
# Conectar Oracle REMOTO (CAPES)
try:
oracle_remote_client.connect()
print("Oracle REMOTO conectado (CAPES/SUCUPIRA_PAINEL)")
except Exception as e:
print(f"AVISO: Oracle REMOTO não conectou: {e}. Sistema rodando sem Componente B (PPG).")
scheduler = None
try:
job = get_processar_job()
scheduler = RankingScheduler(job)
await scheduler.iniciar()
except Exception as e:
print(f"AVISO: Scheduler não iniciou: {e}")
yield
if scheduler:
try:
scheduler.parar()
except:
pass
await es_client.close()
try:
oracle_local_client.close()
except:
pass
try:
oracle_remote_client.close()
except:
pass
app = FastAPI(
title="Ranking de Consultores CAPES",
description="Sistema de Ranking de Consultores CAPES baseado na Minuta Técnica",
version="1.0.0",
lifespan=lifespan,
)
app.add_middleware(
CORSMiddleware,
allow_origins=settings.cors_origins_list,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.include_router(router)
@app.get("/")
async def root():
return {
"message": "API Ranking CAPES",
"version": "1.0.0",
"docs": "/docs",
"health": "/api/v1/health",
}