fix(ecommerce): detalle de producto en dynamic render, no SSG+ISR stale #8

Merged
devops merged 1 commits from fix/product-detail-static-mock-price into main 2026-08-13 07:02:12 +00:00
Owner

Resumen

  • app/product/[slug]/page.tsx pre-renderizaba (SSG) las 17 páginas de detalle en build time del Docker image, donde HEADLESS_PROVIDER/MEDUSA_* no existen — el snapshot quedaba congelado con el catálogo mock (price: null para todos los productos).
  • Con revalidate = 60 y sin cacheHandler compartido entre las 2 réplicas de frontend-deploy, cada pod revalidaba su propia caché ISR de forma independiente: un producto podía mostrar "Consultar precio" en un pod y el precio real en el otro, según cuál se hubiera "calentado" con tráfico real.
  • El listado (app/catalog/page.tsx) nunca tuvo el bug porque es dinámico por searchParams y siempre pega en vivo contra Medusa.
  • Verifiqué contra la API de Medusa en vivo (mismo MEDUSA_REGION_ID que usa el frontend) que el precio y la región de los productos reportados como fallando (ej. "Mochilas Disney colección Marvel") son correctos — no es un problema de datos ni de regiones duplicadas en Colombia.

Fix

Reemplaza generateStaticParams + revalidate = 60 por export const dynamic = "force-dynamic", dejando la ruta de detalle siempre en vivo contra Medusa, igual que el listado.

Test plan

  • Verificar en el pipeline de Gitea Actions que la imagen se reconstruye y frontend.yaml se promueve automáticamente al mergear a main.
  • Tras el rollout, visitar /product/mochilas-disney-coleccion-marvel varias veces (idealmente contra ambos pods) y confirmar precio real en vez de "Consultar precio".
  • Confirmar que el resto de productos (toy-story-5-rex, mochila-pequena-bob-esponja, etc.) siguen mostrando el precio correctamente.
## Resumen - `app/product/[slug]/page.tsx` pre-renderizaba (SSG) las 17 páginas de detalle en build time del Docker image, donde `HEADLESS_PROVIDER`/`MEDUSA_*` no existen — el snapshot quedaba congelado con el catálogo mock (`price: null` para todos los productos). - Con `revalidate = 60` y sin `cacheHandler` compartido entre las 2 réplicas de `frontend-deploy`, cada pod revalidaba su propia caché ISR de forma independiente: un producto podía mostrar `"Consultar precio"` en un pod y el precio real en el otro, según cuál se hubiera "calentado" con tráfico real. - El listado (`app/catalog/page.tsx`) nunca tuvo el bug porque es dinámico por `searchParams` y siempre pega en vivo contra Medusa. - Verifiqué contra la API de Medusa en vivo (mismo `MEDUSA_REGION_ID` que usa el frontend) que el precio y la región de los productos reportados como fallando (ej. "Mochilas Disney colección Marvel") son correctos — no es un problema de datos ni de regiones duplicadas en Colombia. ## Fix Reemplaza `generateStaticParams` + `revalidate = 60` por `export const dynamic = "force-dynamic"`, dejando la ruta de detalle siempre en vivo contra Medusa, igual que el listado. ## Test plan - [ ] Verificar en el pipeline de Gitea Actions que la imagen se reconstruye y `frontend.yaml` se promueve automáticamente al mergear a `main`. - [ ] Tras el rollout, visitar `/product/mochilas-disney-coleccion-marvel` varias veces (idealmente contra ambos pods) y confirmar precio real en vez de "Consultar precio". - [ ] Confirmar que el resto de productos (toy-story-5-rex, mochila-pequena-bob-esponja, etc.) siguen mostrando el precio correctamente.
devops added 1 commit 2026-08-13 07:00:43 +00:00
Product detail pages were generateStaticParams'd at Docker build time,
where MEDUSA_* env vars aren't set, so the static snapshot baked in the
mock catalog (price: null for all products). With revalidate=60 and no
shared ISR cache handler across the 2 frontend replicas, each pod healed
its own cache independently on next visit past staleness — so a product
could show "Consultar precio" on one pod and the real price on the other,
while the fully-dynamic catalog listing always hit Medusa fresh. Verified
against the live Medusa API that pricing/region data itself was correct
for the reported failing products.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01DXqBoNfYQNwFg65mbx2FWM
devops merged commit 584a42ea72 into main 2026-08-13 07:02:12 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: devops/apps-registry#8