Files
mercadodevida/work/artifacts/F-131/architect.md
2026-08-21 17:50:31 +02:00

2.6 KiB

F-131 — Buscador /products (admin) no filtra

Diagnóstico

Reproducción:

  1. Login en http://192.168.18.93:3004/
  2. Navegar a /products
  3. Escribir "almendra" en el buscador
  4. → La lista sigue mostrando los 13 productos (no filtra)

Investigación:

GET http://192.168.18.93:3000/catalog/products?q=almendra&limit=5
  → backend responde: total=1, items=1 ("Almendras Crudas Ecologicas")  ✅ correcto

GET http://192.168.18.93:3004/api/catalog/products?q=almendra&limit=5
  → backend responde: total=13, items=13 (todos)                          ❌ filtro perdido

El frontend y el backend funcionan bien aisladamente. El problema está en el proxy del admin.

Causa raíz

apps/admin/src/app/api/[...path]/route.ts (catch-all proxy que reenvía al backend) usa:

const path = req.nextUrl.pathname.replace('/api/', '');
const backendRes = await fetch(`${API}/${path}`, { ... });

Nunca añade req.nextUrl.search, por lo que cualquier query string (?q=…, ?limit=…, ?offset=…, etc.) se descarta antes de llegar al backend.

Esto afecta a TODOS los métodos (GET, POST, PATCH, PUT, DELETE) — todos usan req.nextUrl.pathname sin req.nextUrl.search.

Consecuencias visibles:

  • /products no filtra (no llega q)
  • /inventory no filtra (F-126, mismo síntoma)
  • Paginación rota si la API espera ?limit=&offset= (los totalPages se calculan con data.items.length en frontend, pero el limit real siempre cae al default del backend)
  • Cualquier filtro futuro basado en query params falla silenciosamente

Diseño

Extraer const search = req.nextUrl.search (ya viene con ? o vacío) y concatenarlo en las 5 funciones handler.

const path = req.nextUrl.pathname.replace('/api/', '');
const search = req.nextUrl.search;  // "" o "?q=…&limit=…"
const backendRes = await fetch(`${API}/${path}${search}`, { ... });

Aplicar a: GET, POST, PATCH, PUT, DELETE.

Riesgos

  • Bajo. Es un bug donde se omite información; el cambio es añadir lo que faltaba.
  • Riesgo residual: si alguna ruta backend asume un orden fijo de query params y se envía en otro orden, podría romper tests, pero nuestro backend usa URLSearchParams en server (orden-independiente).

Plan

  1. Editar apps/admin/src/app/api/[...path]/route.ts — añadir const search = req.nextUrl.search en cada handler y concatenarlo en la URL.
  2. cd apps/admin && npx tsc --noEmit.
  3. cd apps/admin && npm run build.
  4. Verificar con curl:
    • curl -b cookies /api/catalog/products?q=almendra → 1 item
    • curl -b cookies /api/catalog/products?q=almendra&limit=5 → 1 item, no 13
  5. Cerrar gates.