88 lines
2.9 KiB
Markdown
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`.
|