# 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)
