Portas
O núcleo do painel não fala com o banco, com o disco, com o e-mail nem com o relógio diretamente. Ele fala com portas: interfaces pequenas, definidas em panel/ports/. Os adaptadores ficam em panel/adapters/, e os de memória servem a testes e ao desenvolvimento. Trocar um adaptador não muda o núcleo.
Um módulo não cria portas. Ele recebe as portas pelo objeto services das telas, das rotas, das tarefas e dos ganchos. O tipo desse objeto é PanelServices, do contrato. Ver Contrato de módulo.
| Porta | O que faz | Adaptador de produção |
|---|---|---|
store | Guarda os documentos das coleções: criar, ler, atualizar, remover e listar, com transação. Uma atualização com versão antiga é recusada com ConflictError, e um documento inexistente gera NotFoundError. | Banco SQLite (panel/adapters/sql/store.ts) |
storeBackup | Faz uma cópia consistente do banco e restaura uma cópia dessas. A restauração é tudo ou nada: um arquivo truncado ou de outro formato é recusado e o estado atual fica como estava. | panel/adapters/sql/backup.ts |
sessions | Cria, consulta e encerra sessões de login, uma a uma ou todas de um usuário. A sessão dura 8 horas; com “lembrar de mim”, 30 dias. | panel/adapters/sql/sessions.ts |
passwords | Gera e confere o hash das senhas. | Argon2id pelo Bun.password (panel/adapters/passwords-bun.ts) |
audit | Registra uma ação (quem, o quê, quando) e lista as mais recentes. | panel/adapters/sql/audit.ts |
media | Guarda as imagens da biblioteca: enviar, ler, editar o texto alternativo e o ponto focal, remover e listar. Remover uma imagem em uso gera InUseError, com a lista de usos. | Disco (panel/adapters/media-disk.ts) |
mailer | Envia um e-mail (to, subject, text e, opcionalmente, html e cabeçalhos). Só alguns cabeçalhos são aceitos. Uma falha de entrega vira MailerError. | Resend (panel/adapters/mailer-resend.ts) quando há RESEND_API_KEY; console (panel/adapters/mailer-console.ts) quando não há. Em produção a chave é obrigatória. |
clock | Entrega a data e a hora (now()). O núcleo nunca chama Date direto, para que os testes controlem o tempo. | systemClock (panel/adapters/memory/clock.ts) |
scheduler | Agenda uma função a cada 1m, 1h ou 1d, e para tudo com stop(). | Intervalo do processo (panel/adapters/scheduler-interval.ts) |
publisher | Pede uma publicação do site, consulta a fila de publicações e marca como falha as que ficaram em andamento depois de uma restauração. Os estados são queued, running, done e failed. | Gerador estático por subprocesso (panel/adapters/publisher-ssg.ts) |
contentSource | Entrega o conteúdo publicado do site (snapshot()): posts, páginas, categorias, tags, autores, menus e configurações. | Montado pelo núcleo a partir das outras portas, a menos que o projeto informe outro |
Duas peças não são portas, mas completam o conjunto:
previewdesenha um post como o site público o mostraria, mesmo sem publicação. O projeto a entrega ao painel, junto com os blocos do modelo ativo.- Funções de apoio como
paginate,limitCountenormalizeTextficam empanel/ports/. Os adaptadores as usam, para que a paginação e a busca sem acento se comportem igual em todos.
O conjunto completo das portas do núcleo está na interface Ports, em panel/ports/index.ts.