Pular para o conteúdo

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.

PortaO que fazAdaptador de produção
storeGuarda 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)
storeBackupFaz 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
sessionsCria, 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
passwordsGera e confere o hash das senhas.Argon2id pelo Bun.password (panel/adapters/passwords-bun.ts)
auditRegistra uma ação (quem, o quê, quando) e lista as mais recentes.panel/adapters/sql/audit.ts
mediaGuarda 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)
mailerEnvia 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.
clockEntrega 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)
schedulerAgenda uma função a cada 1m, 1h ou 1d, e para tudo com stop().Intervalo do processo (panel/adapters/scheduler-interval.ts)
publisherPede 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)
contentSourceEntrega 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:

  • preview desenha 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, limitCount e normalizeText ficam em panel/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.