Files
mercadodevida/work/artifacts/F-151/implementer.md
2026-08-21 22:14:29 +02:00

2.9 KiB

F-151 — Implementer evidence

Problema observado

Los servicios estaban levantados y respondían HTTP 200, pero la base activa estaba vacía:

  • catalog_products: 0
  • catalog_product_variants: 0
  • pricing_variant_prices: 0
  • inventory_stock: 0
  • categories_categories: 0
  • brands_brands: 0
  • backoffice_users: 0

Por eso:

  • frontend no mostraba productos;
  • admin no aceptaba credenciales porque no existía ningún usuario backoffice.

Además, al ejecutar node scripts/seed.cjs, fallaba desde POS-002:

there is no unique or exclusion constraint matching the ON CONFLICT specification

Causa: inventory_stock ya no es único por variant_id; ahora es único por (variant_id, store_id).

Tras crear usuario backoffice, había otro problema: login devolvía 200, pero la cookie backoffice_session se emitía con Secure en HTTP local, por lo que el navegador/curl no la reenviaba.

Cambios

project/scripts/seed.cjs

  • Limpia también inventory_movements para evitar movimientos obsoletos tras reseed.
  • Inserta stock con store_id = DEFAULT_STORE_ID.
  • Usa ON CONFLICT (variant_id, store_id).
  • Crea/actualiza un usuario backoffice admin:
    • email por defecto: admin@mdv.local
    • password por defecto en seed dev: Admin123456!
    • configurable con SEED_ADMIN_EMAIL y SEED_ADMIN_PASSWORD.
    • si NODE_ENV=production, exige SEED_ADMIN_PASSWORD explícito.

project/src/modules/backoffice/api/backoffice.routes.ts

  • Cookie backoffice_session ahora usa secure solo si la request es HTTPS o x-forwarded-proto=https.
  • En HTTP local/LAN la cookie se emite sin Secure, permitiendo que el admin mantenga sesión.

Acciones aplicadas al entorno

  • Ejecutado node scripts/seed.cjs sobre la DB activa.
  • Reiniciado solo backend para cargar el cambio de cookie.

Estado verificado

Counts actuales:

products: 12
variants: 12
prices: 12
stock: 12
categories: 11
brands: 6
backoffice_users: admin@mdv.local / admin

Pruebas:

GET  /health backend/admin/frontend/storefront       ✅
POST /backoffice/auth/login                          ✅ 200
Set-Cookie backoffice_session sin Secure en HTTP     ✅
GET  /backoffice/auth/me vía admin proxy             ✅
GET  /catalog/products?limit=2 vía admin proxy       ✅ productos
GET  /products/search?limit=1 público                ✅ productos
GET  frontend /products contiene productos           ✅
npm run build                                        ✅
npm test                                             ✅ 191 passed, 56 skipped
eslint/prettier archivos tocados                     ✅
./scripts/verify.sh                                  ✅
git diff --check                                     ✅

Nota: npm run lint global sigue fallando por errores preexistentes no tocados:

  • scripts/generate-thumbnails.mjs: unused import y empty block.
  • src/infrastructure/logging/log-broadcaster.ts: no-this-alias.