feat(frontend): Platform > Infraestrutura > FreeSWITCH/SIP Profiles/Nodes

GET /platform/freeswitch/channels|profiles|nodes fazem introspecção ESL real
(show channels/show calls/sofia status/show registrations/status/show gateways),
reaproveitando os métodos do FreeSwitchTelephonyProvider já verificados manualmente
contra o FreeSWITCH real. Mesmo padrão de conexão avulsa do PlatformHealthController
(connect → comando → disconnect).

Nunca deixa a indisponibilidade do ESL virar 500/503 — devolve { ok: false, error }
com 200, mesma filosofia do health check. Necessário: nesta VM apps/api roda fora do
Docker e a porta 8021 é deliberadamente não publicada no host, então as 3 telas
sempre mostram essa explicação aqui (mesmo texto já usado em Infraestrutura >
Saúde), mesmo com o endpoint 100% funcional — confirmado indiretamente pelo
b2bcall-fs-events, que fala ESL de dentro da rede Docker e está com heartbeat ativo.

"Nodes" mostra explicitamente 1 node (container único, sem clustering) em vez de
fingir uma lista.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BFaBaBSQGhyXGEgtTYZGV8
This commit is contained in:
2026-08-30 08:41:49 -03:00
parent b1a409da09
commit 12af12f276
15 changed files with 303 additions and 3 deletions

26
TODO.md
View File

@@ -1591,6 +1591,32 @@ Usuários (agente.md secao 169)
os números reais e corretos dos dois tenants de teste (Acme com
50% de troncos usados, Beta Corp com zero)
## PHASE 44 — Platform > Infraestrutura > FreeSWITCH/SIP Profiles/Nodes
(agente.md secao 168-169)
- [x] `GET /platform/freeswitch/channels|profiles|nodes` — introspecção
ESL de verdade (`show channels`/`show calls`/`sofia status`/
`show registrations`/`status`/`show gateways`), reaproveitando os
métodos do `FreeSwitchTelephonyProvider` já verificados manualmente
contra o FreeSWITCH real (`packages/telephony`). Mesmo padrão de
conexão avulsa do `PlatformHealthController` (connect → comando →
disconnect, sem manter ESL permanente só pra tela de admin)
- [x] Nunca deixa a indisponibilidade do ESL virar 500/503 pro cliente —
devolve `{ ok: false, error }` (200), mesma filosofia do `timed()`
do health check. Necessário aqui: nesta VM `apps/api` roda fora do
Docker e a porta 8021 é deliberadamente não publicada no host
(agente.md secao 184, docker-compose.yml) — as 3 telas SEMPRE vão
mostrar essa mensagem explicada aqui, mesmo com o endpoint 100%
funcional (confirmado indiretamente: `b2bcall-fs-events`, que fala
ESL de dentro da rede Docker, está com heartbeat ativo o tempo
todo — o FreeSWITCH/ESL está saudável, só inalcançável do host)
- [x] "Nodes" mostra explicitamente "1 node" (container único, sem
clustering) em vez de fingir uma lista — mesma decisão já registrada
pro dashboard de plataforma
- [x] Testado ponta a ponta: os 3 endpoints via curl (200 com
`{ok:false, error:"Timeout conectando..."}`) e as 3 telas via
Puppeteer, mostrando a explicação por que falha aqui (mesmo texto
já usado em Infraestrutura > Saúde)
---
## Riscos conhecidos