# F-132 — Frontend home DYNAMIC_SERVER_USAGE

## Diagnóstico

Build del frontend (Turbopack) emitía dos `DYNAMIC_SERVER_USAGE` para `/`:

```
Route / couldn't be rendered statically because it used revalidate: 0 fetch
http://192.168.18.93:3000/products/search?limit=8

Route / couldn't be rendered statically because it used no-store fetch
http://192.168.18.93:3000/categories/tree
```

Causa: `frontend/src/lib/api.ts` declaraba `cache: 'no-store'` en todas las funciones de fetching (`fetchCategories`, `fetchProducts`, etc.). Esto fuerza render dinámico en cualquier página que las llame, anulando el `export const revalidate = 3600` de `app/page.tsx`.

Adicionalmente, 4 warnings de Turbopack sobre filesystem access dinámico en `frontend/src/app/uploads/[...path]/route.ts` (`path.join(root, filename)` con `root` variable desde `UPLOAD_ROOTS`).

## Diseño

### `frontend/src/lib/api.ts`
- Quitar `cache: 'no-store'` de las funciones que se llaman desde **server components** (`fetchCategories`, `fetchProducts`, `fetchBrandBySlug`, `fetchPage`, `fetchBrands`, `fetchCategoryBySlug`, `fetchProductBySlug`, `fetchProductVariants`, `fetchVariantPrice`, `fetchStockAvailability`).
- Mantener `cache: 'no-store'` solo en `fetchSearchSuggestions` (llamada por componentes cliente / barra de búsqueda que necesitan datos frescos).

### Páginas server-rendered
Añadir `export const revalidate = 3600` a:
- `frontend/src/app/products/page.tsx`
- `frontend/src/app/products/[slug]/page.tsx`
- `frontend/src/app/categories/page.tsx`
- `frontend/src/app/categories/[slug]/page.tsx`
- `frontend/src/app/brands/page.tsx`
- `frontend/src/app/brands/[slug]/page.tsx`

### Búsqueda
- `frontend/src/app/search/page.tsx`: `export const dynamic = 'force-dynamic'` (searchParams dinámicos, no se cachea).

### Uploads route
- Añadir comentarios `/*turbopackIgnore: true*/` dentro de las llamadas `path.join(...)` que usan variables runtime (`root`, `original.root`, `cacheDir`) en `frontend/src/app/uploads/[...path]/route.ts`. La página ya es `force-dynamic` así que los warnings son puramente de análisis estático.

## Riesgos

- Bajo. Cambio de comportamiento: las páginas con datos pasarán a ISR (cache 1h). Si el operador crea un producto, no aparece en la web hasta 1h después.
- Mitigación: para invalidación inmediata el backend ya soporta `revalidatePath` desde admin (futuro). Por ahora se acepta 1h de stale.
- Búsqueda sigue siendo force-dynamic (datos frescos siempre).

## Plan

1. Editar `frontend/src/lib/api.ts` (quitar `cache: 'no-store'` de las 10 funciones server-side).
2. Añadir `revalidate = 3600` a las 6 páginas listadas.
3. Añadir `force-dynamic` a `/search`.
4. Añadir comentarios turbopackIgnore a uploads/route.ts.
5. `cd frontend && npx tsc --noEmit`.
6. `cd frontend && NEXT_PUBLIC_API_URL=… npm run build`.
7. Verificar: `Route /` ahora es `○ Static` con `Revalidate 1h`.
8. Verificar: 0 errores DYNAMIC_SERVER_USAGE, 0 warnings de filesystem.
9. Cerrar gates.