diff --git a/workloads/commerce-backend/src/subscribers/revalidate-storefront.ts b/workloads/commerce-backend/src/subscribers/revalidate-storefront.ts new file mode 100644 index 0000000..c700cc9 --- /dev/null +++ b/workloads/commerce-backend/src/subscribers/revalidate-storefront.ts @@ -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", + ], +}; diff --git a/workloads/ecommerce/app/api/revalidate/route.ts b/workloads/ecommerce/app/api/revalidate/route.ts new file mode 100644 index 0000000..4d3b65e --- /dev/null +++ b/workloads/ecommerce/app/api/revalidate/route.ts @@ -0,0 +1,13 @@ +import { revalidateTag } from "next/cache"; + +export async function POST(request: Request) { + const secret = request.headers.get("x-revalidate-secret"); + + if (!secret || secret !== process.env.REVALIDATE_SECRET) { + return Response.json({ message: "Invalid secret" }, { status: 401 }); + } + + revalidateTag("medusa-products"); + + return Response.json({ revalidated: true, tag: "medusa-products" }, { status: 200 }); +} diff --git a/workloads/ecommerce/commerce/secrets.template.yaml b/workloads/ecommerce/commerce/secrets.template.yaml index 52a8046..ba0789a 100644 --- a/workloads/ecommerce/commerce/secrets.template.yaml +++ b/workloads/ecommerce/commerce/secrets.template.yaml @@ -22,6 +22,11 @@ stringData: JWT_SECRET: CAMBIAR COOKIE_SECRET: CAMBIAR + + # Debe ser el MISMO valor que REVALIDATE_SECRET en el Secret + # commerce-storefront: el subscriber de Medusa lo envía como header + # x-revalidate-secret al invocar POST /api/revalidate en el storefront. + REVALIDATE_SECRET: CAMBIAR --- apiVersion: v1 kind: Secret @@ -30,3 +35,6 @@ metadata: type: Opaque stringData: MEDUSA_PUBLISHABLE_KEY: pk_CAMBIAR_DESPUES_DE_CREARLA_EN_MEDUSA + + # Mismo valor que REVALIDATE_SECRET en commerce-secrets. + REVALIDATE_SECRET: CAMBIAR