Contexto
En #168 (PR #201) el pre-registro de un donante sin cuenta que deja un email crea un perfil sin contraseña (EnsureDonorAccount) y enlaza la donación, para que la vea en «Mis donaciones» cuando active su cuenta. El envío del email de «crea tu contraseña» se dejó como hueco (no implementado en esa PR).
Estado actual (verificado en código)
- Puerto
apps/api/src/contexts/identity/domain/ports/set-password-inviter.ts (SetPasswordInviter.invite({ userId, email, name })).
- Adaptador no-op
apps/api/src/contexts/identity/infrastructure/noop-set-password-inviter.ts (solo loguea; registrado como SET_PASSWORD_INVITER en identity.module.ts).
EnsureDonorAccount llama al inviter al crear un perfil passwordless (passwordHash = null).
Diseño / alcance
- Implementar un notificador real que envíe el correo con un enlace de set-password (token de un solo uso, con caducidad).
- Endpoint para establecer la contraseña con ese token (p. ej.
POST /auth/set-password) y dejar la cuenta utilizable; reenvío y expiración del enlace; rate-limit.
- Plantilla de email ES/EN vía el provider de email / contexto
notifications.
- Sustituir
NoopSetPasswordInviter por la implementación real en identity.module.ts.
Aceptación
- Un donante que pre-registra sin cuenta recibe un email para crear su contraseña; al hacerlo, accede y ve sus donaciones en
/panel/mis-donaciones.
pnpm gen:api (si cambia el contrato) + TDD + gate.
Área: identity / notifications. Esfuerzo: M. Parte de #168.
Contexto
En #168 (PR #201) el pre-registro de un donante sin cuenta que deja un email crea un perfil sin contraseña (
EnsureDonorAccount) y enlaza la donación, para que la vea en «Mis donaciones» cuando active su cuenta. El envío del email de «crea tu contraseña» se dejó como hueco (no implementado en esa PR).Estado actual (verificado en código)
apps/api/src/contexts/identity/domain/ports/set-password-inviter.ts(SetPasswordInviter.invite({ userId, email, name })).apps/api/src/contexts/identity/infrastructure/noop-set-password-inviter.ts(solo loguea; registrado comoSET_PASSWORD_INVITERenidentity.module.ts).EnsureDonorAccountllama al inviter al crear un perfil passwordless (passwordHash = null).Diseño / alcance
POST /auth/set-password) y dejar la cuenta utilizable; reenvío y expiración del enlace; rate-limit.notifications.NoopSetPasswordInviterpor la implementación real enidentity.module.ts.Aceptación
/panel/mis-donaciones.pnpm gen:api(si cambia el contrato) + TDD + gate.Área: identity / notifications. Esfuerzo: M. Parte de #168.