Decisão:
id: UniqueIdsempre injetado de fora; domínio não importa infra (id-generator/clock). Timestamp só fica no domínio se uma regra de negócio usa (ex.:RefreshToken.expiresAt/revokedAt); auditoria (createdAt,updatedAt) sai do domínio → banco preenche.
id injetado, createdAt fora do domínio. ✅ (PR D1+D2+Opção A)id/now já injetados (padrão de referência). ✅ (mas ainda carrega createdAt/updatedAt no domínio — ver abaixo)id (remover generateId() interno) + remover createdAt do domíniouser.ts:50 — await generateId() interno; tem createdAt). Callers de User.create passam o id.password-credential.ts:19 — mesma coisa).id E now)streamer.ts:44-45 (create usa generateId() + now()), :66 (changeSlug usa now()), :72 (updatePixKey usa now()).onboard-streamer, change-streamer-slug, update-streamer-pix-key) passam id/now. (O createdAt já saiu daqui.)createdAt/updatedAt do domínioid/now já injetados, mas o agregado ainda carrega createdAt/updatedAt (auditoria). Remover do domínio + mapper; updateDetails para de setar updatedAt.updatedAt gerenciado pelo banco.$onUpdate/trigger. As colunas updated_at de profile e streamer ficariam null pra sempre..$onUpdate(() => new Date()) (ou trigger) nas duas.| Item | Status |
|---|---|
| RefreshToken (id + createdAt) | ✅ |
| Profile — id/now injetados | ✅ |
| User — id + createdAt | ❌ |
| PasswordCredential — id + createdAt | ❌ |
| Streamer — id + now + infra imports | ❌ |
| Profile — remover createdAt/updatedAt | ❌ |
updatedAt DB-managed (profile + streamer) | ❌ |
| ADR do D1 | ❌ |
User + PasswordCredential juntos (mesmo padrão, só o id, rápido), deixando Streamer (3 métodos com now()) e o updatedAt/ADR pra depois.