Todas as rotas vivem em public/api/ como scripts PHP planos (sem roteador). Cada endpoint valida entrada com filter_input() e devolve JSON no padrão {sucesso, mensagem, dados}.
Rotas
| Rota | Método | Descrição |
|---|---|---|
/api/search.php | GET | Busca full-text (Elasticsearch, fallback MySQL) |
/api/researchers.php | GET/POST | CRUD de pesquisadores |
/api/upload_and_index.php | POST | Upload de XML + indexação (só .xml) |
/api/export.php | GET | Exportação multi-formato (BibTeX, RIS, CSV, JSON, XML) |
/api/umc_dashboard.php | GET | Dados agregados do dashboard institucional |
/api/umc_filters.php | GET | Opções de filtro por PPG |
/api/filter_values.php | GET | Valores disponíveis por filtro |
/api/validation.php | GET/POST | Validação técnica/funcional do sistema |
/api/health.php | GET | Health check de todos os serviços |
Ciclo de vida de uma busca
flowchart TD
U["Cliente (fetch via API.js)"] --> EP["search.php"]
EP --> VAL["filter_input() valida a query"]
VAL --> ES{"Elasticsearch disponível?"}
ES -- sim --> ESQ["ElasticsearchService::search()"]
ES -- não --> SQL["Fallback: DatabaseService (MySQL)"]
ESQ --> RESP["JSON: sucesso, mensagem, dados"]
SQL --> RESP
RESP --> U
Regra: todo endpoint novo segue o mesmo contrato —
{"sucesso": bool, "mensagem": string, "dados": mixed} — e trata a ausência do Elasticsearch como caso esperado, nunca como erro fatal.