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

88 lines
2.9 KiB
Markdown

# 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:
```text
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:
```text
products: 12
variants: 12
prices: 12
stock: 12
categories: 11
brands: 6
backoffice_users: admin@mdv.local / admin
```
Pruebas:
```text
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`.