3.3 KiB
3.3 KiB
Implementer evidence — CLUB-001
Resumen
Implementé la Fase 1 — Core backend del nuevo módulo Club de Clientes.
Qué se creó
1) Nuevo módulo backend club
Archivos nuevos en project/src/modules/club/:
api/club.routes.tsapplication/club-service.tsdomain/club.tsdomain/errors.tsdomain/ports.tsinfrastructure/device-token.tsinfrastructure/member-code.tsinfrastructure/pg-club-repository.tsindex.tstests/token-and-code.test.tstests/boundary.test.ts
2) Migración core del Club
- Nueva migración:
project/migrations/066_club_core.js - Crea tablas:
club_membersclub_devicesclub_transactionsclub_recovery_codesclub_rewardsclub_campaigns
- Añade seeds en
store_settingspara:club_enabledclub_cashback_bpsclub_allow_anonymous_membersclub_allow_recovery_codesclub_minimum_redeem_cents
3) Endpoints backend de Fase 1
GET /club/configPOST /club/joinGET /club/meGET /club/movementsGET /admin/club/settingsPATCH /admin/club/settings
4) Comportamiento implementado
- Alta anónima de socio Club.
- Generación de
deviceTokenopaco. - Persistencia solo del
device_token_hash. - Reutilización del socio actual si el dispositivo ya tenía token válido.
memberCodecorto formatoMDV-XXXXXXXX.- Ledger
club_transactionscomo fuente de verdad. current_balance_centscomo cache transaccional.- Registro de transacciones idempotentes mediante
idempotencyKey. - Configuración Club reutilizando
store_settings.
5) Wiring en la app
- Registré el módulo en
project/src/app/build-app.ts.
Tests añadidos
project/src/modules/club/tests/token-and-code.test.tsproject/src/modules/club/tests/boundary.test.tsproject/src/app/tests/club.itest.ts
Fixes necesarios para poder ejecutar itest reales
Las itest reales del proyecto estaban bloqueadas por migraciones previas mal definidas con pgm.addColumn(...).
Corregí:
project/migrations/057_product_variant_weight_and_expiry.jsproject/migrations/058_identity_email_confirmation.js
Esto no cambia la intención funcional de esas migraciones; corrige únicamente su forma para que node-pg-migrate pueda aplicarlas.
Validación ejecutada
./scripts/verify.sh✅cd project && npm run typecheck✅cd project && npm run build✅cd project && npx vitest run src/modules/club/tests/token-and-code.test.ts src/modules/club/tests/boundary.test.ts✅cd project && TEST_DATABASE_URL=postgres://mdv:mdv_dev_only@localhost:5432/mercadodevida_test npx vitest run src/app/tests/club.itest.ts --no-file-parallelism✅git diff --check✅
Decisiones técnicas relevantes
- Reutilicé
store_settingspara configuración del Club en vez de crear otro subsistema. - El token de dispositivo sigue el patrón de sesiones existente: token opaco en cliente, hash SHA-256 en BD.
- El módulo ya queda preparado para fases posteriores (PWA, TPV, recovery, linking, admin UI) sin introducirlas todavía.
Deuda / siguiente paso
- Fase 2 debería construir la PWA
/club/*consumiendo estos endpoints y mostrando la tarjeta digital. npm run lint:boundariessigue fallando por violaciones preexistentes y ajenas en módulosposysecurity; no introducidas por CLUB-001.