SGEProduto · Domínio · Desenvolvimento
Repositório

migration-reference · implemented

Migration 06 — email_messages

Snapshot imutável da mensagem de e-mail preparada para envio.

Contrato

CampoRegra
idbigint autoincremental, chave primária.
notification_idUUID nullable, FK para notifications.id.
purposeFinalidade Notification, AccountCreated, NewAffiliation, AccountEmailChanged ou AdministrativeChange. Recuperação de senha não cria mensagem.
subjectAssunto da notificação ou do aviso.
content_text / content_htmlConteúdo renderizado, ao menos uma versão obrigatória.
template_key / template_versionIdentificadores opcionais do template.
idempotency_keyUUID único para a mensagem.
timestampsCriaçã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.

Dependências