migration-reference · implemented
Migration 06 — email_messages
Snapshot imutável da mensagem de e-mail preparada para envio.
Contrato
| Campo | Regra |
|---|---|
id | bigint autoincremental, chave primária. |
notification_id | UUID nullable, FK para notifications.id. |
purpose | Finalidade Notification, AccountCreated, NewAffiliation, AccountEmailChanged ou AdministrativeChange. Recuperação de senha não cria mensagem. |
subject | Assunto da notificação ou do aviso. |
content_text / content_html | Conteúdo renderizado, ao menos uma versão obrigatória. |
template_key / template_version | Identificadores opcionais do template. |
idempotency_key | UUID único para a mensagem. |
| timestamps | Criação e atualização. |
O Model permite as cinco finalidades. Notification pode estar vinculada a uma notificação interna existente; as quatro finalidades administrativas não usam notification_id. O Model oculta assunto e corpo na serialização e bloqueia atualização e exclusão via Eloquent. O conteúdo é armazenado sem cast criptografado. Destinatário, solicitante e contexto do registro afetado pertencem à tentativa de entrega, não à mensagem. Todas as finalidades administrativas guardam assunto, HTML e texto já renderizados, incluindo o nome/tipo do vínculo solicitante quando houver; o snapshot mantém o mesmo texto nas tentativas posteriores. A finalidade AdministrativeChange cobre os avisos de desativação/exclusão de vínculo e exclusão de conta. Recuperação de senha não cria mensagem.
O conteúdo é acessível ao Administrador do Sistema pela tela de e-mails somente quando a tentativa tem contexto administrativo verificável. A prévia é HTML sandboxed, com scripts e recursos externos bloqueados; o texto simples é escapado.
Limites e testes
EmailMessageTest verifica o esquema, a finalidade, o conteúdo e a imutabilidade; EmailDeliveryFlowTest cobre a criação do aviso, idempotência e reenvio. SQL direto pode contornar as regras do Model; o acesso ao banco precisa ser restrito.