Skip to content

feat: pagina /settings/security con eliminacion de cuenta y cascade delete#44

Merged
DevOtter97 merged 1 commit into
mainfrom
feat/account-security-page-and-delete
May 2, 2026
Merged

feat: pagina /settings/security con eliminacion de cuenta y cascade delete#44
DevOtter97 merged 1 commit into
mainfrom
feat/account-security-page-and-delete

Conversation

@DevOtter97

Copy link
Copy Markdown
Owner

Resumen UX

/settings queda solo perfil (avatar, displayName, edad, país) + una card "Seguridad de la cuenta" que lleva a una pagina nueva /settings/security. Ahi viven:

  • Cambio de username (movido)
  • Cambio de email (movido)
  • Cambio de contraseña (movido)
  • Eliminar cuenta (nuevo) con doble verificacion

Antes los tres formularios de seguridad estaban inline en /settings, lo que hacia la pagina larga y mezclaba campos de identidad con preferencias de perfil. Ahora separamos por nivel de impacto.

Eliminar cuenta — flujo

  1. Doble verificacion:
    • Escribir el username actual (case-insensitive) en un input
    • Contraseña actual
  2. Click en "Eliminar mi cuenta permanentemente" (boton deshabilitado hasta que ambos campos estan correctos)
  3. authService.deleteAccount(password):
    • Re-auth con reauthenticateWithCredential
    • Cascade Firestore (userRepository.cascadeDeleteUserData):
      • Posts del autor → batches de 500 ops
      • Lecturas
      • Listas
      • Notificaciones recibidas (userId == me)
      • Friend requests (fromUserId == me OR toUserId == me) + amistades bidireccionales (users/me/friends/X + users/X/friends/me)
      • usernames/{username} (libera el username)
      • users/{userId} (al final — algunos componentes podrian estar leyendolo)
    • deleteUser(firebaseUser): borra el user de Firebase Auth. Esto invalida el token y deja el cliente sign-out automaticamente.
  4. Redirect a /

Cambios en repos (delete-by-userId)

Cada repo tiene su metodo nuevo, todos con el mismo patron de chunks de 500 (limite Firestore para writeBatch):

  • postRepository.deleteAllByAuthor(authorId)
  • readingRepository.deleteAllByUserId(userId)
  • customListRepository.deleteAllByUserId(userId)
  • notificationRepository.deleteAllByUserId(userId) — solo las recibidas (rules restringen delete al recipient)
  • friendRepository.deleteAllForUser(userId) — el mas complejo: lee users/{me}/friends, borra ambos lados de cada amistad, y dedupe friend_requests por OR-fanout (Firestore no soporta OR nativamente, dos queries + Set).

Limitaciones documentadas

  • Subcollections de posts y listas (likes, comments, reposts) quedan huerfanas. Mismo problema que ya tenia el delete individual de un post. Cleanup en cascada requiere Cloud Functions, fuera de scope.
  • Notificaciones que el user GENERO en bandejas ajenas (campo fromUserId) NO se borran. Las reglas restringen delete al recipient. Quedan con el username viejo.
  • Posts con repostOf u otros snapshots denormalizados siguen mostrando el username viejo. Es deliberado para sobrevivir a borrados — feature, no bug.

Si interrupcion mid-cascade (cierra el navegador), el user queda con datos parciales borrados. Reintentar el delete deberia ser idempotente porque cada paso es un query+filter dinamico (where userId == X).

Archivos

Nuevos

  • src/pages/settings/security.astro — pagina entry
  • src/components/profile/SecuritySettings.tsx — componente que orquesta header + AccountSecurityForm + DeleteAccountSection
  • src/components/profile/DeleteAccountSection.tsx — UI de delete con doble verificacion

Modificados

  • src/components/profile/UserProfile.tsx: quita el <AccountSecurityForm /> inline. Anade card linkeada a /settings/security.
  • src/domain/interfaces/IAuthService.ts: anadido deleteAccount(currentPassword): Promise<void>.
  • src/infrastructure/firebase/FirebaseAuthService.ts: implementacion de deleteAccount (re-auth + cascade + deleteUser de Firebase).
  • src/infrastructure/firebase/Firestore{Post,Reading,CustomList,Notification,Friend}Repository.ts: cada uno gana su metodo deleteAllBy* o deleteAllForUser.
  • src/infrastructure/firebase/FirestoreUserRepository.ts: nuevo cascadeDeleteUserData que orquesta los anteriores.

Sin cambios de reglas

Todas las reglas Firestore actuales ya permiten al owner borrar sus propios docs (verificado para users, usernames, posts, readings, customLists, notifications, friends, friend_requests). No hay deploy de reglas pendiente post-merge.

Testing

  • npx astro check solo persiste el preexistente
  • npm run test:run 60/60
  • npm run test:e2e 7/7
  • npm run build ok
  • Manual con un usuario de test:
    • Crear cuenta dummy con email test@dummy.com
    • Crear 1-2 posts, 1-2 lecturas, 1 lista, mandar friend request a otra cuenta, recibir alguna notif
    • Ir a /settings → click en "Seguridad de la cuenta" → verificar que abre /settings/security
    • Click en "Eliminar cuenta" → escribir username + password
    • Verificar que en Firebase Console el user de Auth ha desaparecido
    • Verificar que los docs del user (users/, usernames/, posts/, readings/, customLists/) ya no existen
    • Login con el otro user: comprobar que la friend request o friendship con el deleted user esta limpia
    • Probar reutilizar el username liberado al crear nueva cuenta — debe funcionar

@vercel

vercel Bot commented May 1, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
gororeads Ready Ready Preview, Comment May 1, 2026 11:27pm

@DevOtter97 DevOtter97 merged commit 2ecee80 into main May 2, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant