feat(F-048): completed feature
This commit is contained in:
77
work/artifacts/F-048/implementer.md
Normal file
77
work/artifacts/F-048/implementer.md
Normal file
@@ -0,0 +1,77 @@
|
||||
# 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 (`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/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.
|
||||
Reference in New Issue
Block a user