Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2056e6c766 | ||
|
|
d6b84e4480 | ||
|
|
f8f540af6a | ||
|
|
51eadd98dc | ||
|
|
fbf0aec892 | ||
|
|
e3eca46e0e | ||
|
|
586313d6d7 | ||
|
|
77a15c26b1 | ||
|
|
8cd43a2584 |
No files matched your search
@@ -47,7 +47,10 @@ async function meilisearchProductTransformer(
|
|||||||
inventory_quantity?: number | null
|
inventory_quantity?: number | null
|
||||||
manage_inventory?: boolean | null
|
manage_inventory?: boolean | null
|
||||||
allow_backorder?: boolean | null
|
allow_backorder?: boolean | null
|
||||||
calculated_price?: { calculated_amount?: number | null } | null
|
prices?: Array<{
|
||||||
|
amount?: number | null
|
||||||
|
currency_code?: string | null
|
||||||
|
}> | null
|
||||||
}>
|
}>
|
||||||
| null
|
| null
|
||||||
| undefined
|
| undefined
|
||||||
@@ -63,6 +66,18 @@ async function meilisearchProductTransformer(
|
|||||||
variant.manage_inventory === false ||
|
variant.manage_inventory === false ||
|
||||||
(variant.inventory_quantity ?? 0) > 0
|
(variant.inventory_quantity ?? 0) > 0
|
||||||
|
|
||||||
|
// variants.calculated_price requiere currency_code/region_id en el
|
||||||
|
// contexto de pricing, que el workflow de sync interno del plugin no
|
||||||
|
// provee -- hace fallar TODO el job de indexado (confirmado en vivo:
|
||||||
|
// "Method calculatePrices requires currency_code in the pricing
|
||||||
|
// context"). variants.prices es la lista cruda de precios (sin
|
||||||
|
// resolver promociones/reglas), no necesita contexto -- alcanza para
|
||||||
|
// el filtro/orden por precio en la busqueda, que no necesita el
|
||||||
|
// precio final promocional.
|
||||||
|
const copPrice = variant?.prices?.find(
|
||||||
|
(price) => price.currency_code?.toLowerCase() === "cop",
|
||||||
|
)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: document.id,
|
id: document.id,
|
||||||
name: document.title || "Producto ARI Shopping",
|
name: document.title || "Producto ARI Shopping",
|
||||||
@@ -73,10 +88,7 @@ async function meilisearchProductTransformer(
|
|||||||
brand: stringMetadata(metadata, "brand") || "ARI Shopping",
|
brand: stringMetadata(metadata, "brand") || "ARI Shopping",
|
||||||
ageRange: stringMetadata(metadata, "ageRange") || "Todas",
|
ageRange: stringMetadata(metadata, "ageRange") || "Todas",
|
||||||
tags: (tags || []).map((tag) => tag.value).filter(Boolean),
|
tags: (tags || []).map((tag) => tag.value).filter(Boolean),
|
||||||
price:
|
price: typeof copPrice?.amount === "number" ? copPrice.amount : null,
|
||||||
typeof variant?.calculated_price?.calculated_amount === "number"
|
|
||||||
? variant.calculated_price.calculated_amount
|
|
||||||
: null,
|
|
||||||
available,
|
available,
|
||||||
isNew: booleanMetadata(metadata, "isNew"),
|
isNew: booleanMetadata(metadata, "isNew"),
|
||||||
featured: booleanMetadata(metadata, "featured"),
|
featured: booleanMetadata(metadata, "featured"),
|
||||||
@@ -184,7 +196,8 @@ module.exports = defineConfig({
|
|||||||
"variants.inventory_quantity",
|
"variants.inventory_quantity",
|
||||||
"variants.manage_inventory",
|
"variants.manage_inventory",
|
||||||
"variants.allow_backorder",
|
"variants.allow_backorder",
|
||||||
"variants.calculated_price.calculated_amount",
|
"variants.prices.amount",
|
||||||
|
"variants.prices.currency_code",
|
||||||
],
|
],
|
||||||
indexSettings: {
|
indexSettings: {
|
||||||
// Tabla de ADR 0006 §3: Buscable / Filtrable-faceta / Ordenable.
|
// Tabla de ADR 0006 §3: Buscable / Filtrable-faceta / Ordenable.
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
import type { MedusaRequest, MedusaResponse } from "@medusajs/framework";
|
import type { MedusaRequest, MedusaResponse } from "@medusajs/framework";
|
||||||
import { ContainerRegistrationKeys } from "@medusajs/framework/utils";
|
import {
|
||||||
|
ContainerRegistrationKeys,
|
||||||
|
QueryContext,
|
||||||
|
} from "@medusajs/framework/utils";
|
||||||
import {
|
import {
|
||||||
MEILISEARCH_MODULE,
|
MEILISEARCH_MODULE,
|
||||||
type MeiliSearchService,
|
type MeiliSearchService,
|
||||||
@@ -76,6 +79,13 @@ export async function GET(req: MedusaRequest, res: MedusaResponse) {
|
|||||||
const q = stringParam(req.query, "q") ?? "";
|
const q = stringParam(req.query, "q") ?? "";
|
||||||
const limit = numberParam(req.query, "limit") ?? 24;
|
const limit = numberParam(req.query, "limit") ?? 24;
|
||||||
const offset = numberParam(req.query, "offset") ?? 0;
|
const offset = numberParam(req.query, "offset") ?? 0;
|
||||||
|
// calculated_price exige region_id/currency_code en el contexto de
|
||||||
|
// pricing o query.graph tira "Method calculatePrices requires
|
||||||
|
// currency_code in the pricing context" (mismo error que ya rompio el
|
||||||
|
// job de sync -- ver medusa-config.ts). El storefront ya manda
|
||||||
|
// region_id contra /store/products (medusa.ts, regionId()); esta ruta
|
||||||
|
// espera el mismo query param.
|
||||||
|
const regionId = stringParam(req.query, "region_id");
|
||||||
|
|
||||||
const filterParts: string[] = [];
|
const filterParts: string[] = [];
|
||||||
for (const facet of ["category", "collection", "brand", "ageRange"]) {
|
for (const facet of ["category", "collection", "brand", "ageRange"]) {
|
||||||
@@ -139,10 +149,36 @@ export async function GET(req: MedusaRequest, res: MedusaResponse) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// calculatePrices exige currency_code en el contexto -- no alcanza con
|
||||||
|
// region_id solo (a diferencia de /store/products nativo, que lo
|
||||||
|
// resuelve el middleware setPricingContext; esta ruta no pasa por esa
|
||||||
|
// cadena). Resolvemos la moneda real de la region en vez de asumir COP
|
||||||
|
// fijo, por si el catalogo suma otra region/moneda mas adelante.
|
||||||
|
let currencyCode: string | undefined;
|
||||||
|
if (regionId) {
|
||||||
|
const { data: regions = [] } = await query.graph({
|
||||||
|
entity: "region",
|
||||||
|
fields: ["id", "currency_code"],
|
||||||
|
filters: { id: regionId },
|
||||||
|
});
|
||||||
|
currencyCode = regions[0]?.currency_code;
|
||||||
|
}
|
||||||
|
|
||||||
const { data: products = [] } = await query.graph({
|
const { data: products = [] } = await query.graph({
|
||||||
entity: "product",
|
entity: "product",
|
||||||
fields: PRODUCT_FIELDS,
|
fields: PRODUCT_FIELDS,
|
||||||
filters: { id: productIds },
|
filters: { id: productIds },
|
||||||
|
context:
|
||||||
|
regionId && currencyCode
|
||||||
|
? {
|
||||||
|
variants: {
|
||||||
|
calculated_price: QueryContext({
|
||||||
|
region_id: regionId,
|
||||||
|
currency_code: currencyCode,
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
: {},
|
||||||
});
|
});
|
||||||
|
|
||||||
// Preserva el ranking de relevancia de Meilisearch -- query.graph no
|
// Preserva el ranking de relevancia de Meilisearch -- query.graph no
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ spec:
|
|||||||
runAsNonRoot: false
|
runAsNonRoot: false
|
||||||
containers:
|
containers:
|
||||||
- name: app
|
- name: app
|
||||||
image: gitea.cruzcloud.net/devops/docs-portal:v1.0.162
|
image: gitea.cruzcloud.net/devops/docs-portal:v1.0.164
|
||||||
# El base saca TODAS las capabilities. Probado en vivo y
|
# El base saca TODAS las capabilities. Probado en vivo y
|
||||||
# revertido: con drop: ALL (aunque se agregue NET_BIND_SERVICE
|
# revertido: con drop: ALL (aunque se agregue NET_BIND_SERVICE
|
||||||
# de vuelta) el propio entrypoint de nginx:1.27-alpine falla al
|
# de vuelta) el propio entrypoint de nginx:1.27-alpine falla al
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ spec:
|
|||||||
memory: 64Mi
|
memory: 64Mi
|
||||||
|
|
||||||
- name: migrations
|
- name: migrations
|
||||||
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.127
|
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.166
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
command:
|
command:
|
||||||
- node
|
- node
|
||||||
@@ -86,7 +86,7 @@ spec:
|
|||||||
|
|
||||||
containers:
|
containers:
|
||||||
- name: app
|
- name: app
|
||||||
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.127
|
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.166
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
envFrom:
|
envFrom:
|
||||||
- configMapRef:
|
- configMapRef:
|
||||||
|
|||||||
Reference in new issue
Block a user