# Architect — CLUB-005

## Objetivo
Vincular socios anónimos a cuentas registradas de usuario, restaurar la tarjeta automáticamente al login y manejar fusión segura de membresías.

## Diseño

### 1. Restauración automática de tarjeta al login
El endpoint `GET /club/me` ya lo hace — comprueba `userId` primero, luego cae back a device token. No se necesita cambio.

### 2. Vincular miembro anónimo a cuenta registrada (`PATCH /club/me`)
- El frontend llama a este endpoint después de login/register cuando hay cookie `mdv_club`
- Requiere sesión (autenticado)
- Usa el device token de la cookie para encontrar el socio anónimo
- Actualiza `user_id` del socio anónimo al userId de la sesión
- Si el usuario ya tiene un socio vinculado → retorna `linked: false`, no sobreescribe

### 3. Fusión de membresías (`POST /club/merge`)
- Para cuando el usuario tiene un socio anónimo (device) Y un socio registrado (userId)
- El socio registrado es el primario (se conserva)
- El socio anónimo se marca como `merged`, su saldo se suma al primario
- Los dispositivos del anónimo se transfieren al primario
- Los recovery codes del anónimo expiran (no se transfieren)

### Seguridad
- `PATCH /club/me` requiere sesión — no se puede vincular sin estar autenticado
- `POST /club/merge` requiere sesión y solo usa el socio del usuario autenticado como primario
- La transacción de merge usa `FOR UPDATE` para evitar race conditions

### Endpoints nuevos
| Método | Ruta | Auth | Descripción |
|--------|------|------|-------------|
| PATCH | `/club/me` | sesión | Vincular miembro anónimo a cuenta |
| POST | `/club/merge` | sesión | Fusionar miembro anónimo en el registrado |
