Files
devops fb5cf8bc98 feat(docs-portal): pipeline GitOps y manifiestos K8s para el portal MkDocs
Agrega lo que faltaba para desplegar workloads/docs-portal/ (ya existente
sin commitear): deployment/service/ingress + kustomization siguiendo el
patrón de workloads/nginx, Applications de workload y gobernanza
separadas, y el workflow de Gitea Actions (build+push a Gitea Registry,
bump de versión en el manifiesto) siguiendo el mismo patrón que
build.yaml/build-medusa.yaml.
2026-08-13 21:08:04 -05:00

104 lines
4.3 KiB
Markdown

# Incidente: precios `null` en detalle de producto (Medusa Store API sin `region_id`) (2026-08)
!!! info "Origen"
Migrado desde `apps-registry/docs/playbooks/incidente-medusa-precios-region-id-2026-08.md`.
Contenido técnico preservado sin cambios de fondo — solo formato adaptado a MkDocs Material.
| | |
|---|---|
| **Ventana del incidente** | 2026-08-12, resuelto el mismo día (commit `60072cf`) |
| **Servicio afectado** | `medusa-svc` (Store API), consumido por el frontend Next.js de ARI Shopping |
| **Impacto** | En el listado de productos (`/catalog`) los precios se mostraban correctamente, pero en la página de detalle de producto individual varios artículos mostraban "Consultar precio" en vez del monto real |
## Hipótesis inicial descartada: regiones COP duplicadas
La primera hipótesis fue que existían regiones "Colombia (COP)"
duplicadas en Medusa, causando ambigüedad al resolver el precio. Se
descartó con evidencia directa en Postgres, consultando la tabla
`region` **incluyendo soft-deletes**:
```sql
SELECT id, name, currency_code, created_at, updated_at, deleted_at FROM region ORDER BY created_at;
id | name | currency_code | created_at | updated_at | deleted_at
----------------------------------+----------+---------------+----------------------------+----------------------------+------------
reg_01KZT86WPAH7A7ZZRDSX3350V2 | Colombia | cop | 2026-08-12 05:48:03.151+00 | 2026-08-12 05:48:03.151+00 |
(1 row)
```
Una sola fila, creada una sola vez, nunca actualizada, nunca borrada.
**No había ni hubo nunca una región duplicada** — la hipótesis de
deduplicación quedó descartada con esta consulta.
## Causa raíz real
El backend de Medusa **no tenía ninguna región configurada**. El
frontend pedía precios al Store API (`/store/products`) usando el
parámetro `currency_code=cop`, pero el validador
`StoreGetProductsParams` de Medusa v2 (`.strict()`) **no acepta ese
campo** — devolvía `400 Unrecognized fields: 'currency_code'` en cada
carga de `/catalog`.
Se probó también `country_code`, que tampoco funcionó — Medusa
respondía:
```text
Missing required pricing context to calculate prices - region_id
```
!!! danger "Nota de arquitectura"
**Medusa v2 requiere explícitamente un `region_id` válido** para
poder calcular precios (`calculated_price`) vía Store API; ni
`currency_code` ni `country_code` son parámetros válidos para ese
fin.
## Fix aplicado
Commit `60072cf` — *"fix: usar region_id en vez de currency_code para
precios de Medusa"* (PR #5, mergeado en `04dc6bd`):
1. Se creó la región "Colombia" (moneda COP) vía Admin API — no
existía ninguna región configurada previamente.
2. Se modificó el frontend para pedir precios usando `region_id`
explícito en vez de `currency_code`, vía una nueva variable de
entorno `MEDUSA_REGION_ID`:
```diff
# workloads/ecommerce/frontend.yaml
- name: MEDUSA_BACKEND_URL
value: http://medusa-svc:9000
+ - name: MEDUSA_REGION_ID
+ value: reg_01KZT86WPAH7A7ZZRDSX3350V2
```
```diff
# workloads/ecommerce/lib/headless/providers/medusa.ts
const params = new URLSearchParams({
limit: String(limit),
- currency_code: "cop",
+ // El validador de /store/products no acepta currency_code (400
+ // "Unrecognized fields"); el precio calculado solo se resuelve con
+ // region_id.
+ region_id: regionId(),
```
No hubo migración de precios entre regiones — no existían datos
previos que migrar; la región se creó de cero como parte de este mismo
fix. `MEDUSA_REGION_ID` no ha cambiado desde el commit original
(verificado con `git log -p --follow` sobre `frontend.yaml`), y sigue
apuntando a la única región que existe en la base.
## Lecciones aprendidas
**Verificar la causa raíz contra el estado real de la base de datos
antes de asumir la primera hipótesis**, aun cuando esa hipótesis
coincida con la intuición inicial de quien reporta el bug ("puede que
haya algo duplicado"). La consulta a `region` incluyendo `deleted_at`
tomó segundos y evitó documentar una causa raíz incorrecta en este
mismo playbook.
**Nota de arquitectura:** Medusa v2 Store API (`StoreGetProductsParams`)
requiere `region_id` explícito para resolver precios calculados.
`currency_code` y `country_code` no son parámetros válidos para ese
fin.