4.2 KiB
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.jsusaMigrationBuilder/pgm.sqly conserva el constraint de canales.025_cms_footer_pages.jsusa el contrato del runner.026_fuzzy_search.cjsdejó de crear unPooly autoejecutarse durante import; ahora exportaup/downordenados y reversibles.027_category_is_parent.jsse valida dentro de la cadena normal.028_backoffice_users.jsrevierte roleseditorcomoadmin, compatible con el constraint histórico de identity.migrations.itest.tscubre 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.
errorSchemadocumenta el envelope real y Fastify validation se normaliza aVALIDATION_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-statsy 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 (
save10→SAVE10). - 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/uploaddel 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,scriptsymigrations. - Admin Next 16 usa
eslint .en lugar del comando eliminadonext lint. new_ticket.pyemitereviewer, normaliza gates legacy y permite iniciar una única pending mediante--startsin editar el backlog manualmente.- Configuración ESLint CJS para migraciones/seed.
- Uploads runtime y
*.tsbuildinfose 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 mediantescripts/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-storehacen la home dinámica; Next completa el build correctamente. - No hay remote
origin;commit_feature.shpodrá crear commit local pero omitirá push.