# US-MGN002-003: Cambio de Password

## Identificacion

| Campo | Valor |
|-------|-------|
| **ID** | US-MGN002-003 |
| **Modulo** | MGN-002 Users |
| **Sprint** | Sprint 2 |
| **Prioridad** | P0 - Critica |
| **Story Points** | 3 |
| **Estado** | Ready |
| **Autor** | System |
| **Fecha** | 2025-12-05 |

---

## Historia de Usuario

**Como** usuario autenticado del sistema
**Quiero** poder cambiar mi contraseña
**Para** mantener mi cuenta segura y cumplir con politicas de rotacion

---

## Criterios de Aceptacion

### Escenario 1: Cambio exitoso

```gherkin
Given un usuario autenticado
When proporciona password actual correcto "OldPass123!"
  And nuevo password "NewPass456!" cumple requisitos
Then el sistema actualiza el password
  And guarda hash en password_history
  And envia email de notificacion
  And responde con status 200
```

### Escenario 2: Password actual incorrecto

```gherkin
Given un usuario autenticado
When proporciona password actual incorrecto
Then el sistema responde con status 400
  And el mensaje es "Password actual incorrecto"
```

### Escenario 3: Nuevo password no cumple requisitos

```gherkin
Given un usuario autenticado
When el nuevo password es "abc123"
Then el sistema responde con status 400
  And lista los requisitos no cumplidos:
    | Debe tener al menos 8 caracteres |
    | Debe incluir una mayuscula       |
    | Debe incluir caracter especial   |
```

### Escenario 4: Password reutilizado

```gherkin
Given un usuario que uso "MiPass123!" hace 2 meses
When intenta cambiar a "MiPass123!"
Then el sistema responde con status 400
  And el mensaje es "No puedes usar un password que hayas usado anteriormente"
```

### Escenario 5: Cerrar otras sesiones

```gherkin
Given un usuario con 3 sesiones activas
When cambia password con logoutOtherSessions=true
Then el sistema actualiza el password
  And invalida las otras 2 sesiones
  And la sesion actual permanece activa
  And responde con sessionsInvalidated: 2
```

---

## Mockup / Wireframe

```
+------------------------------------------------------------------+
|  [Logo]   Cambiar Contraseña                                      |
+------------------------------------------------------------------+
|                                                                   |
|   ┌─────────────────────────────────────────────────────────┐    |
|   │ CAMBIAR CONTRASEÑA                                       │    |
|   ├─────────────────────────────────────────────────────────┤    |
|   │                                                          │    |
|   │ Contraseña actual                                        │    |
|   │ [•••••••••••••••••••                        ] 👁         │    |
|   │                                                          │    |
|   │ Nueva contraseña                                         │    |
|   │ [•••••••••••••••••••                        ] 👁         │    |
|   │ [████████████░░░░░░░░] Fuerte                            │    |
|   │                                                          │    |
|   │ ✓ Minimo 8 caracteres                                   │    |
|   │ ✓ Al menos una mayuscula                                │    |
|   │ ✓ Al menos una minuscula                                │    |
|   │ ✗ Al menos un numero                                    │    |
|   │ ✗ Al menos un caracter especial                         │    |
|   │                                                          │    |
|   │ Confirmar nueva contraseña                               │    |
|   │ [•••••••••••••••••••                        ] 👁         │    |
|   │                                                          │    |
|   │ ☐ Cerrar sesion en otros dispositivos                   │    |
|   │                                                          │    |
|   │ [  Cancelar  ]           [ Cambiar Contraseña ]         │    |
|   └─────────────────────────────────────────────────────────┘    |
|                                                                   |
+------------------------------------------------------------------+
```

---

## Notas Tecnicas

### API Endpoint

```typescript
POST /api/v1/users/me/password
{
  "currentPassword": "OldPass123!",
  "newPassword": "NewPass456!",
  "confirmPassword": "NewPass456!",
  "logoutOtherSessions": true
}

// Response 200
{
  "message": "Password actualizado exitosamente",
  "sessionsInvalidated": 2
}

// Response 400 - Password incorrecto
{
  "statusCode": 400,
  "message": "Password actual incorrecto"
}

// Response 400 - No cumple politica
{
  "statusCode": 400,
  "message": "El password no cumple los requisitos",
  "errors": [
    "Debe incluir al menos una mayuscula",
    "Debe incluir al menos un caracter especial"
  ]
}
```

### Politica de Password

```
- Minimo 8 caracteres
- Maximo 128 caracteres
- Al menos 1 mayuscula
- Al menos 1 minuscula
- Al menos 1 numero
- Al menos 1 caracter especial (!@#$%^&*)
- No puede contener el email
- No puede ser igual a los ultimos 5
```

---

## Definicion de Done

- [ ] Endpoint POST /api/v1/users/me/password
- [ ] Validacion de password actual
- [ ] Validacion de politica de complejidad
- [ ] Verificacion contra historial (5 anteriores)
- [ ] Opcion de cerrar otras sesiones
- [ ] Email de notificacion enviado
- [ ] Frontend: ChangePasswordForm
- [ ] Frontend: PasswordStrengthIndicator
- [ ] Tests unitarios
- [ ] Code review aprobado

---

## Estimacion

| Tarea | Horas |
|-------|-------|
| Backend: Endpoint | 2h |
| Backend: Validaciones | 2h |
| Backend: Tests | 1h |
| Frontend: Form + indicator | 3h |
| Frontend: Tests | 1h |
| **Total** | **9h** |

---

## Historial

| Version | Fecha | Autor | Cambios |
|---------|-------|-------|---------|
| 1.0 | 2025-12-05 | System | Creacion inicial |
