Files
mercadodevida/work/artifacts/F-048/implementer.md
2026-08-19 07:17:14 +02:00

4.2 KiB

Implementer — F-048

Summary

Se reconciliaron los cambios locales aprobados y se corrigieron los bloqueos que impedían validarlos como un conjunto coherente.

Implemented

Migraciones

  • 024_product_channels_attributes.js usa MigrationBuilder/pgm.sql y conserva el constraint de canales.
  • 025_cms_footer_pages.js usa el contrato del runner.
  • 026_fuzzy_search.cjs dejó de crear un Pool y autoejecutarse durante import; ahora exporta up/down ordenados y reversibles.
  • 027_category_is_parent.js se valida dentro de la cadena normal.
  • 028_backoffice_users.js revierte roles editor como admin, compatible con el constraint histórico de identity.
  • migrations.itest.ts cubre fresh up, segundo up no-op, full down y nuevo up posterior.

Integridad HTTP y módulos

  • El serializer de Fastify conserva los DTO explícitos de handlers aunque los schemas OpenAPI sean amplios.
  • errorSchema documenta el envelope real y Fastify validation se normaliza a VALIDATION_ERROR.
  • El checker de boundaries permite imports a índices públicos de otros módulos y los 7 deep imports restantes se eliminaron mediante factories/exports públicos.
  • Se añadió índice público para admin-stats y factories públicas para cart/orders/inventory wiring.

Regresiones corregidas

  • Categorías: primero detecta ciclos y después valida que el padre sea contenedor; test nuevo para impedir hijos en categorías hoja.
  • Promociones: normaliza el código a mayúsculas antes del lookup (save10SAVE10).
  • Frontend: effects de carga diferidos donde ESLint React detectaba actualizaciones síncronas.
  • Respuestas con {id} dejaron de serializarse como {}, reparando setup y contratos de catálogo, usuarios, pedidos, shipping y carrito.

Security hardening

  • El endpoint /api/upload del admin exige una sesión backoffice validada contra /backoffice/auth/me.
  • Los uploads limitan tamaño, derivan la extensión del MIME permitido, validan magic bytes y usan UUID con escritura exclusiva.
  • La descarga dinámica bloquea traversal y añade X-Content-Type-Options: nosniff.

Toolchain

  • Backend lint limita alcance a src, scripts y migrations.
  • Admin Next 16 usa eslint . en lugar del comando eliminado next lint.
  • new_ticket.py emite reviewer, normaliza gates legacy y permite iniciar una única pending mediante --start sin editar el backlog manualmente.
  • Configuración ESLint CJS para migraciones/seed.
  • Uploads runtime y *.tsbuildinfo se ignoran; artefactos generados trackeados fueron restaurados antes del cierre.

Evidence

Backend

  • npm run lint: PASS.
  • npm run lint:boundaries: PASS — 237 files checked.
  • npm run typecheck: PASS.
  • npm run build: PASS.
  • npm test: PASS — 41 files/124 tests passed; 15 integration files skipped sin DB.
  • TEST_DATABASE_URL=... npm run test:integration: PASS — 15 files/56 tests passed.
  • Migration cycle: PASS — fresh up, no-op up, full down, reapply up.

Admin

  • npm run lint: PASS con 25 warnings legacy, 0 errores.
  • npm run typecheck: PASS.
  • npm run build: PASS — 24 rutas generadas.

Frontend

  • npm run lint: PASS con 9 warnings legacy, 0 errores.
  • npm run build: PASS — TypeScript y 29 rutas.

Storefront

  • npm run lint: PASS.
  • npm run typecheck: PASS.
  • npm run build: PASS — SSG/ISR generado.

Harness and security

  • ./scripts/verify.sh: PASS después de normalizar e iniciar F-048 mediante scripts/new_ticket.py.
  • npm audit --omit=dev --audit-level=high: 0 vulnerabilidades en backend, admin, frontend y storefront.
  • git diff --check: PASS.
  • Secret patterns scan: PASS; no claves privadas, AWS keys ni Stripe live keys nuevas.
  • Hallazgo del primer security pass (upload admin sin autenticación) remediado; lint/typecheck/build admin volvieron a pasar.

Known non-blocking warnings

  • Admin y frontend conservan warnings de unused imports, <img> y navegación legacy; no hay errores y build/typecheck pasan.
  • El frontend principal registra durante build que dos fetch no-store hacen la home dinámica; Next completa el build correctamente.
  • No hay remote origin; commit_feature.sh podrá crear commit local pero omitirá push.