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.
104 lines
4.3 KiB
Markdown
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.
|