feat(ecommerce): revalidar el storefront al instante tras editar precios
Antes el precio actualizado en Medusa tardaba hasta ~60s (o más, con
varias réplicas del frontend sin cache handler compartido) en verse en
el front, por el revalidate:60 del fetch a /store/products.
Ahora:
- Nueva ruta app/api/revalidate en el storefront que llama a
revalidateTag("medusa-products") al recibir un POST autenticado con
el header x-revalidate-secret.
- Nuevo subscriber en el backend Medusa (product.updated,
product-variant.updated/created/deleted) que llama a esa ruta usando
STOREFRONT_URL (ya existe en commerce-config) y un REVALIDATE_SECRET
compartido entre ambos servicios.
- secrets.template.yaml documenta la nueva clave REVALIDATE_SECRET en
commerce-secrets y commerce-storefront (mismo valor en ambos).
Requiere reaplicar commerce-secrets y commerce-storefront con el script
actualizado en el repo scripts (fix/revalidate-secret-scripts) para que
el REVALIDATE_SECRET exista en el cluster.
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
import type { SubscriberArgs, SubscriberConfig } from "@medusajs/framework";
|
||||
import { ContainerRegistrationKeys } from "@medusajs/framework/utils";
|
||||
|
||||
export default async function revalidateStorefrontHandler({
|
||||
container,
|
||||
}: SubscriberArgs) {
|
||||
const logger = container.resolve(ContainerRegistrationKeys.LOGGER);
|
||||
|
||||
const storefrontUrl = process.env.STOREFRONT_URL;
|
||||
const secret = process.env.REVALIDATE_SECRET;
|
||||
|
||||
if (!storefrontUrl || !secret) {
|
||||
logger.warn(
|
||||
"STOREFRONT_URL o REVALIDATE_SECRET no configurados; se omite la revalidación del storefront.",
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetch(`${storefrontUrl}/api/revalidate`, {
|
||||
method: "POST",
|
||||
headers: { "x-revalidate-secret": secret },
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
logger.warn(
|
||||
`Revalidación del storefront respondió HTTP ${response.status}.`,
|
||||
);
|
||||
}
|
||||
} catch (error) {
|
||||
logger.warn(
|
||||
`No se pudo revalidar el storefront: ${(error as Error).message}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export const config: SubscriberConfig = {
|
||||
event: [
|
||||
"product.updated",
|
||||
"product-variant.updated",
|
||||
"product-variant.created",
|
||||
"product-variant.deleted",
|
||||
],
|
||||
};
|
||||
Reference in New Issue
Block a user