feat(telefonia): edição de ramal (nome/caller ID/contexto/codecs/grupo) junto da senha SIP
Pedido do usuário: abrir a edição completa do ramal no mesmo lugar de ver/redefinir a senha, em vez de só um campo (grupo de captura) editável isoladamente. UpdateExtensionDto ganha name/context/codecs (só callGroup e caller ID eram editáveis antes); codecs valida contra uma lista fixa e agora realmente vira absolute_codec_string no directory XML — antes a coluna existia no schema mas não tinha efeito nenhum no FreeSWITCH. Grupo de captura vira um input com datalist alimentado pelos grupos já usados em outros ramais do tenant, em vez de digitar de novo do zero. Testado ponta a ponta com Playwright (tenant/ramais descartáveis): grupo reaproveitado de outro ramal, edição de nome/caller ID/contexto, remoção de um codec — tudo persistido e refletido na tela depois de salvar. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BFaBaBSQGhyXGEgtTYZGV8
This commit is contained in:
48
TODO.md
48
TODO.md
@@ -2636,6 +2636,54 @@ do usuário: "o widget não conecta mais fica só cinza")
|
||||
em 4 execuções seguidas) e o status evolui
|
||||
`connecting → connected` sem nunca voltar pra cinza.
|
||||
|
||||
## PHASE 73 — Editar ramal (nome/caller ID/contexto/codecs/grupo) no
|
||||
mesmo lugar da senha (pedido do usuário: "quando clicar no ramal pra
|
||||
editar a senha ou ver a senha atual já abra pra alterar o nome, o
|
||||
callerid, contexto, a lista de codec disponível e grupo de captura com
|
||||
uma lista dos que já foram criados, e um botão de salvar")
|
||||
- [x] `UpdateExtensionDto` só aceitava `callerIdName`/`callerIdNumber`/
|
||||
`maxRegistrations`/`callGroup` — `name`, `context` e `codecs`
|
||||
existiam no schema (`codecs` com default `"PCMU,PCMA,OPUS"`) mas
|
||||
não tinham caminho de update nenhum. Adicionados os três, `codecs`
|
||||
validado contra a lista fixa `AVAILABLE_CODECS` (PCMU/PCMA/OPUS/
|
||||
G722/G729/GSM, mesma constante espelhada no frontend).
|
||||
- [x] **Achado real construindo isto**: a coluna `codecs` nunca tinha
|
||||
sido ligada em nada — `buildDirectoryUserXml` (directory XML que o
|
||||
FreeSWITCH consulta via mod_xml_curl) não emitia variável nenhuma
|
||||
pra ela, então mudar o campo não teria efeito real nenhum na
|
||||
negociação SDP do ramal. Adicionada a variável `absolute_codec_string`
|
||||
(nome padrão do FreeSWITCH pra restringir/ordenar os codecs de um
|
||||
usuário específico) em `packages/telephony/src/directory-xml.ts`,
|
||||
e `apps/freeswitch-config/src/main.ts` passa `extension.codecs`
|
||||
pra ela — agora o campo realmente controla o que o FreeSWITCH
|
||||
oferece nesse ramal, não só um valor decorativo no banco.
|
||||
- [x] Frontend: painel único "Configuração e senha SIP" em
|
||||
`ramais/[id]/page.tsx` — a antiga `dl` só-leitura virou um
|
||||
formulário (`ExtensionEditForm` em `actions-panel.tsx`) com nome,
|
||||
caller ID (nome+número), contexto, checkboxes dos codecs
|
||||
disponíveis e grupo de captura, tudo num "Editar configuração" +
|
||||
Salvar, bem ao lado de "Ver senha atual"/"Redefinir senha" (mesmo
|
||||
painel, não mais escondido em telas separadas). Grupo de captura
|
||||
usa um `<input list>` com `<datalist>` alimentado pelos grupos já
|
||||
cadastrados nos OUTROS ramais do tenant (busca `GET /extensions`
|
||||
na própria server component da página) — escolhe um já existente
|
||||
ou digita um novo, sem re-digitar do zero. Substituiu o antigo
|
||||
`CallGroupEditAction` (isolado, só esse campo).
|
||||
- [x] `callerIdName`/`callerIdNumber` agora aceitam `null` explícito pra
|
||||
limpar o valor (antes só dava pra trocar por outro texto, nunca
|
||||
voltar a vazio, porque o form mandava `undefined` — que o backend
|
||||
trata como "não mudar nada" — em vez de `null`). Mesmo padrão que
|
||||
`callGroup` já usava.
|
||||
- [x] Testado ponta a ponta com Playwright: tenant descartável com dois
|
||||
ramais, um com grupo de captura "vendas"; abriu o segundo ramal,
|
||||
"Editar configuração" mostrou "vendas" na lista suspensa (vindo do
|
||||
OUTRO ramal), editou nome/caller ID/contexto, desmarcou OPUS —
|
||||
salvou e a tela voltou mostrando exatamente os valores novos
|
||||
(`codecs: "PCMU,PCMA"`, grupo "vendas" reaproveitado). Precisou
|
||||
`systemctl restart b2bcall-api.service` pra pegar o DTO novo —
|
||||
`apps/api` roda `tsc` uma vez no start (não é watch mode), então
|
||||
mudança de `src/` só entra em produção depois do restart.
|
||||
|
||||
---
|
||||
|
||||
## Riscos conhecidos
|
||||
|
||||
Reference in New Issue
Block a user