35 lines
1.7 KiB
Markdown
35 lines
1.7 KiB
Markdown
# 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 |
|