Fase 9 (segurança e produção): - GET /api/metrics: endpoint Prometheus com métricas reais (chamadas, agentes, filas, CPS por campanha), protegido por permissão - scripts/backup.sh, restore.sh, healthcheck.sh, install.sh, update.sh — testados contra o ambiente real (backup.sh e healthcheck.sh rodados de verdade; install.sh/update.sh validados por inspeção, ambiente atual já provisionado) - POST /api/agent-console/dispose: aplica disposição de chamada de verdade (lacuna deixada aberta desde a Fase 6), com ações CALLBACK (agenda retorno) e DO_NOT_CALL (suprime automaticamente) - apps/dialer-worker/src/callback-sweep.ts: reativa leads com callback vencido; GET /api/callbacks para consulta - apps/dialer-worker/src/wrap-up-sweep.ts: transição automática WRAP_UP -> AVAILABLE + despausa real na fila do Asterisk. Exigiu corrigir main.ts para conectar ao AMI mesmo em DIALER_SIMULATION=true (DIALER_SIMULATION deve impedir só originação de chamada, não ações administrativas de fila) - nftables revisado (sem alterações necessárias) - Documentação completa: INSTALL, OPERATIONS, BACKUP_RESTORE, SECURITY, DATABASE, API, ASTERISK, OPENSIPS (não implementado, motivo documentado), TROUBLESHOOTING - README.md e CHANGELOG.md reescritos Fase 10 (testes e aceite): - Quality gate completo executado: build/typecheck (7 workspaces), lint, 46 testes unitários, docker compose config/ps, healthcheck — tudo verde - Aceite de segurança (seção 92): 13 itens verificados ao vivo contra o sistema real, não só por inspeção de código - Aceite Asterisk (seção 93): os 5 comandos executados e documentados, comunicação API->AMI->Asterisk validada - docs/RELATORIO_FINAL.md: relatório final no formato da seção 96 Todos os fixtures de teste desta fase foram removidos/desativados ao final. Credenciais de acesso entregues separadamente em CREDENCIAIS.txt (fora do git, nunca versionado).
3.8 KiB
3.8 KiB
B2BCall — Referência da API
Base URL (via Nginx): http://<host>/api
Documentação interativa (Swagger, quando SWAGGER_ENABLED=true): http://<host>/api/docs
Autenticação
Todas as rotas exigem um access_token válido (cookie HttpOnly, definido pelo
login) exceto as marcadas @Public():
/api/auth/login, /api/auth/refresh, /api/auth/forgot-password,
/api/auth/reset-password, /api/health, /api/health/live,
/api/health/ready, GET /api.
Cada rota protegida também é validada contra o RBAC do usuário
(@RequirePermissions(...)) — ver packages/shared/src/permissions.ts para
o catálogo completo de chaves de permissão.
Mapa de rotas
| Módulo | Rotas |
|---|---|
auth |
POST /auth/login, /refresh, /logout, /change-password, /forgot-password, /reset-password, GET /auth/me |
users |
GET /users, GET /users/:id, POST /users, PATCH /users/:id |
roles |
GET /roles/permissions (catálogo), GET/POST/PATCH/DELETE /roles |
audit |
GET /audit (filtros: userId, action, entityType, from, to, paginação) |
trunks |
GET/POST/PATCH/DELETE /trunks, GET /trunks/:id/status |
extensions |
GET/POST/PATCH/DELETE /extensions, POST /extensions/:id/reset-password |
dialplans |
GET/POST/PATCH/DELETE /dialplans, GET /dialplans/versions, POST /dialplans/publish, POST /dialplans/versions/:id/rollback |
asterisk-admin |
GET /asterisk/status, GET /asterisk/modules, GET /asterisk/diagnostic/allowed-commands, POST /asterisk/diagnostic, POST /asterisk/reload |
queues |
GET/POST/PATCH/DELETE /queues, POST /queues/:id/members, DELETE /queues/:id/members/:agentId |
agents |
GET/POST/PATCH/DELETE /agents |
agent-console |
GET /agent-console/me, POST /login, /available, /pause, /unpause, /logout, /dispose |
pause-reasons |
GET/POST/PATCH/DELETE /pause-reasons |
dispositions |
GET/POST/PATCH/DELETE /dispositions |
callbacks |
GET /callbacks?campaignId= (somente leitura — agendamento via agent-console/dispose) |
campaigns |
GET/POST/PATCH/DELETE /campaigns, POST /:id/start, /pause, /stop, /drain |
| leads (sob campanhas) | GET /campaigns/:campaignId/leads, GET .../imports, GET .../imports/:importId/rejected.csv, POST .../import |
suppression |
GET/POST /suppression, POST /suppression/import, DELETE /suppression/:id |
reports |
GET /reports/calls, /calls/export (CSV), /metrics, /agents/:agentId |
dashboard |
GET /dashboard, /calls-by-hour, /campaigns/:id |
compliance |
GET/PATCH /compliance/settings, GET /compliance/indicators |
monitoring |
GET /monitoring/extensions, /queues, /agents |
metrics |
GET /metrics (Prometheus, texto plano) |
health |
GET /health, /health/live, /health/ready |
Convenções
- Paginação server-side em endpoints que retornam listas potencialmente
grandes (
audit,reports/calls,suppression):page,pageSize, resposta com{ items, total, page, pageSize }. - Erros nunca vazam detalhes internos: toda resposta de erro inclui
requestIdpara correlação com o log estruturado do servidor. - Datas em ISO 8601 UTC; conversão de timezone de campanha
(
America/Sao_Paulopor padrão) acontece no backend, nunca no cliente. - Segredos (senha de ramal, senha de tronco) nunca retornam em
GET/PATCH— só noPOSTde criação (senha de ramal) ou nunca em texto puro (senha de tronco, sempresecretEncryptedomitido da resposta).
Exemplos rápidos
# Login
curl -c cookies.txt -X POST http://<host>/api/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"admin@b2bcall.local","password":"..."}'
# Listar troncos (autenticado)
curl -b cookies.txt http://<host>/api/trunks
# Métricas Prometheus
curl -b cookies.txt http://<host>/api/metrics