feat(monitoramento): status de registro dos ramais (online/offline) em tempo real
Pedido do usuário: "antes de ir para IVR no monitoramento tem que mostrar quantos ramais estão online e o status de cada ramal criado". apps/api roda no host e não alcança o ESL do FreeSWITCH diretamente (freeswitch:8021 só existe na rede interna do Docker) — mesmo padrão já documentado em platform-freeswitch.controller.ts. Por isso, seguido o mesmo caminho já usado por Trunk.status: apps/freeswitch-events (conexão ESL permanente) já consumia sofia::register/unregister/expire pra outros fins, então virou a fonte de verdade — grava `Extension.registeredAt` a cada evento, mais uma reconciliação completa (`show registrations`) ao conectar/reconectar no ESL pra não ficar com dado desatualizado se o serviço caiu no meio de uma sessão de registro. GET /extensions agora devolve `registeredAt`; a página /app/monitoramento ganhou um painel "Ramais" com status ao vivo (online/offline, desde quando, grupo de captura) e um instrumento "Ramais online: X de Y" — a mesma conexão SSE que já existia só precisou aprender a atualizar esse novo estado a partir dos eventos EXTENSION_REGISTERED/UNREGISTERED, que já estavam sendo publicados e só apareciam no log de eventos. Testado: reconciliação confirmada rodando no container real (2 ramais já registrados antes do restart do fs-events foram marcados online corretamente); GET /extensions confirmado devolvendo registeredAt (null num ramal recém-criado, sem registro). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BFaBaBSQGhyXGEgtTYZGV8
This commit is contained in:
@@ -321,6 +321,17 @@ model Extension {
|
||||
|
||||
maxRegistrations Int @default(1) @map("max_registrations")
|
||||
|
||||
// Status de registro SIP em tempo real (PHASE 55, monitoramento —
|
||||
// achado real: usuário pediu "quantos ramais estão online e o status de
|
||||
// cada" antes de ir pro IVR). Preenchido pelo `apps/freeswitch-events`
|
||||
// a cada `sofia::register`/`sofia::unregister`/`sofia::expire` — null =
|
||||
// não registrado agora. Não dá pra consultar o ESL direto de
|
||||
// `apps/api` pra isso (roda no host, `freeswitch:8021` só existe na
|
||||
// rede interna do Docker, ver docs/FREESWITCH.md), mas fs-events já
|
||||
// tem conexão ESL permanente e já consome esses eventos pra outros
|
||||
// fins — mesmo padrão já usado em `Trunk.status`/`statusUpdatedAt`.
|
||||
registeredAt DateTime? @map("registered_at")
|
||||
|
||||
enabled Boolean @default(true)
|
||||
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
|
||||
Reference in New Issue
Block a user