SGEProduto · Domínio · Desenvolvimento
Repositório

migration-reference · implemented

Migration 05 — notifications

Tabela nativa do Laravel para notificações internas por vínculo ou conta.

Contrato

CampoRegra
idUUID, chave primária da tabela nativa.
typeclasse ou tipo estável da notificação.
notifiable_type / notifiable_iddestinatário polimórfico: Affiliation para operação e User para comunicação de conta.
datajsonb convertido pelo cast array de DatabaseNotification.
read_atnullable; leitura interna, nunca leitura do e-mail.
timestampsauditoria temporal.

O comando php artisan make:notifications-table --no-interaction produz a base desse schema. A migration troca apenas data para jsonb, compatível com o cast array de DatabaseNotification no PostgreSQL. User reutiliza Notifiable, notifications(), readNotifications() e unreadNotifications() do framework. Affiliation também usa Notifiable; a caixa operacional consulta a relação do vínculo ativo e nunca a relação geral de User. Não há Model customizado nem tabela paralela do SGE.

O UUID de notifications.id é intencional: preserva o schema e a geração de identificadores nativos de Laravel Notifications. As tabelas próprias de e-mail usam IDs bigint autoincrementais; somente email_messages.notification_id permanece UUID para referenciar esta tabela.

Notificações operacionais de estágio, avaliação e documento usarão notifiable = Affiliation. AffiliationPolicy::viewNotifications exige que o vínculo exista, esteja ativo e pertença à conta autenticada. A relação polimórfica limita cada consulta ao par notifiable_type/notifiable_id, inclusive quando a conta possui outros vínculos. User também aceita notificações pelo Laravel, mas recuperação de senha, convite inicial e novo vínculo são enviados pelo canal de e-mail e não criam linhas em notifications. As classes de domínio e a integração aos seus fluxos ainda não foram criadas.

Deduplicação durável de eventos repetíveis não deve alterar a tabela nativa. A Action que gerar um evento precisa usar a fonte de idempotência do domínio; quando ela ainda não existir, o fluxo deve definir um registro operacional próprio antes de ser ativado.

Checklist

  • Gerar a migration com php artisan make:notifications-table --no-interaction e adaptar data para jsonb.
  • Criar Notifications de domínio com canal database, toDatabase() e databaseType() quando os respectivos fluxos forem implementados.
  • Adicionar Notifiable a Affiliation e consultar a caixa operacional pelo vínculo ativo.
  • Garantir que data não contenha tokens, senhas, códigos ou URLs sensíveis.
  • Testar criação e leitura/não leitura pelo Model nativo para Affiliation e User.
  • Testar que uma notificação de vínculo não aparece em outro vínculo da mesma conta.
  • Testar migrate/rollback da migration isolada.

Próxima etapa

email_messages e email_delivery_attempts implementam a persistência relacionada; RequestEmailDelivery e SendEmailDelivery implementam reserva e transporte em fila. A recuperação de senha do Fortify também usa fila, sem criar registros nessas tabelas. A ligação aos eventos de domínio ainda será feita conforme E-mails, notificações e entregas.