# US-MGN-001-003-002: Gestión de Perfil Propio y Cambio de Contraseña **RF Asociado:** [RF-MGN-001-003](../../02-modelado/requerimientos-funcionales/mgn-001/RF-MGN-001-003-gestion-usuarios.md) **Módulo:** MGN-001 - Fundamentos **Epic:** Gestión de Usuarios **Prioridad:** P0 (MVP) **Story Points:** 3 **Sprint:** Sprint 2 **Estado:** Ready for Development **Fecha:** 2025-11-24 --- ## User Story **Como** usuario autenticado, **Quiero** editar mi perfil (nombre, foto, idioma) y cambiar mi contraseña, **Para** personalizar mi cuenta y mantener mi seguridad. --- ## Descripción Detallada Usuario puede actualizar su propio perfil (NO email ni roles, solo admin puede). Cambio de contraseña requiere contraseña actual, revoca refresh tokens existentes. --- ## Criterios de Aceptación ### Escenario 1: Actualizar perfil propio **Dado que** estoy autenticado, **Cuando** actualizo nombre, teléfono, foto, idioma, **Entonces** cambios se guardan, NO puedo cambiar email ni roles. ### Escenario 2: Cambiar contraseña **Dado que** ingreso contraseña actual correcta y nueva contraseña válida, **Cuando** cambio mi contraseña, **Entonces** password_hash actualizado, refresh tokens revocados, sesiones en otros dispositivos cerradas. ### Escenario 3: Contraseña actual incorrecta **Dado que** ingreso contraseña actual incorrecta, **Cuando** intento cambiar contraseña, **Entonces** retorna error 401 "Contraseña actual incorrecta". ### Escenario 4: Nueva contraseña no cumple política **Dado que** nueva contraseña tiene menos de 8 chars o sin mayúscula, **Cuando** intento cambiarla, **Entonces** retorna error 400 con política de contraseñas. --- ## Reglas de Negocio - **RN-1:** Usuario NO puede cambiar su email ni roles (solo admin) - **RN-2:** Cambio de contraseña requiere contraseña actual - **RN-3:** Nueva contraseña: 8+ chars, 1 mayúscula, 1 número, 1 símbolo - **RN-4:** Al cambiar contraseña: revocar todos los refresh tokens --- ## Tareas Técnicas ### Backend - [ ] GET /api/v1/auth/me - Obtener perfil propio - [ ] PATCH /api/v1/auth/me - Actualizar perfil - [ ] POST /api/v1/auth/me/change-password - Cambiar contraseña - [ ] UsersService.updateProfile/changePassword - [ ] Validar contraseña actual con bcrypt.compare - [ ] Revocar refresh tokens al cambiar contraseña - [ ] Unit + Integration tests (8 casos) ### Frontend - [ ] ProfilePage con formulario de perfil - [ ] ChangePasswordModal con 3 campos (actual, nueva, confirmar) - [ ] Upload de foto con preview - [ ] Selector de idioma (es, en) - [ ] API client + Zustand store - [ ] Tests ### Database - [ ] Actualizar auth.users (name, phone, avatar, language) - [ ] DELETE FROM auth.sessions WHERE user_id=X al cambiar password --- ## Estimación: 3 SP (6 horas) --- ## Definition of Done - [ ] Perfil propio editable - [ ] Cambio de contraseña funcionando - [ ] Revocación de tokens funcionando - [ ] Tests pasando - [ ] Code review aprobado --- ## Referencias - [RF-MGN-001-003](../../02-modelado/requerimientos-funcionales/mgn-001/RF-MGN-001-003-gestion-usuarios.md) - [ET-BACKEND-MGN-001-003](../../02-modelado/especificaciones-tecnicas/backend/mgn-001/ET-BACKEND-MGN-001-003-gestion-usuarios.md) - [ET-FRONTEND-MGN-001-003](../../02-modelado/especificaciones-tecnicas/frontend/mgn-001/ET-FRONTEND-MGN-001-003-gestion-usuarios.md)