From f7fbc2f97cb3cda4692c3c60369045b996fec53a Mon Sep 17 00:00:00 2001 From: "Carlos R. L. Rodrigues" <37986729+carlos-r-l-rodrigues@users.noreply.github.com> Date: Wed, 16 Oct 2024 14:27:24 -0300 Subject: [PATCH] feat(core-flows): cart events (#9585) --- .../workflows/add-shipping-method-to-cart.ts | 7 ++- .../src/cart/workflows/add-to-cart.ts | 10 ++++- .../src/cart/workflows/create-carts.ts | 19 +++++--- .../src/cart/workflows/update-cart.ts | 43 ++++++++++++++++--- .../workflows/update-line-item-in-cart.ts | 15 +++++-- packages/core/utils/src/core-flows/events.ts | 7 +++ 6 files changed, 84 insertions(+), 17 deletions(-) diff --git a/packages/core/core-flows/src/cart/workflows/add-shipping-method-to-cart.ts b/packages/core/core-flows/src/cart/workflows/add-shipping-method-to-cart.ts index 5f7519bd73..314fd11892 100644 --- a/packages/core/core-flows/src/cart/workflows/add-shipping-method-to-cart.ts +++ b/packages/core/core-flows/src/cart/workflows/add-shipping-method-to-cart.ts @@ -1,10 +1,11 @@ -import { MedusaError } from "@medusajs/framework/utils" +import { CartWorkflowEvents, MedusaError } from "@medusajs/framework/utils" import { createWorkflow, parallelize, transform, WorkflowData, } from "@medusajs/framework/workflows-sdk" +import { emitEventStep } from "../../common/steps/emit-event" import { useRemoteQueryStep } from "../../common/steps/use-remote-query" import { addShippingMethodToCartStep, @@ -137,6 +138,10 @@ export const addShippingMethodToCartWorkflow = createWorkflow( }), addShippingMethodToCartStep({ shipping_methods: shippingMethodInput, + }), + emitEventStep({ + eventName: CartWorkflowEvents.UPDATED, + data: { id: input.cart_id }, }) ) diff --git a/packages/core/core-flows/src/cart/workflows/add-to-cart.ts b/packages/core/core-flows/src/cart/workflows/add-to-cart.ts index d0407723b9..cc4d058bf5 100644 --- a/packages/core/core-flows/src/cart/workflows/add-to-cart.ts +++ b/packages/core/core-flows/src/cart/workflows/add-to-cart.ts @@ -2,6 +2,7 @@ import { AddToCartWorkflowInputDTO, CreateLineItemForCartDTO, } from "@medusajs/framework/types" +import { CartWorkflowEvents } from "@medusajs/framework/utils" import { createWorkflow, parallelize, @@ -9,6 +10,7 @@ import { WorkflowData, WorkflowResponse, } from "@medusajs/framework/workflows-sdk" +import { emitEventStep } from "../../common/steps/emit-event" import { useRemoteQueryStep } from "../../common/steps/use-remote-query" import { createLineItemsStep, @@ -120,7 +122,13 @@ export const addToCartWorkflow = createWorkflow( list: false, }).config({ name: "refetch–cart" }) - refreshCartShippingMethodsStep({ cart }) + parallelize( + refreshCartShippingMethodsStep({ cart }), + emitEventStep({ + eventName: CartWorkflowEvents.UPDATED, + data: { id: input.cart.id }, + }) + ) updateTaxLinesWorkflow.runAsStep({ input: { diff --git a/packages/core/core-flows/src/cart/workflows/create-carts.ts b/packages/core/core-flows/src/cart/workflows/create-carts.ts index 3c3ba5c760..ddec635c2b 100644 --- a/packages/core/core-flows/src/cart/workflows/create-carts.ts +++ b/packages/core/core-flows/src/cart/workflows/create-carts.ts @@ -2,7 +2,7 @@ import { AdditionalData, CreateCartWorkflowInputDTO, } from "@medusajs/framework/types" -import { MedusaError } from "@medusajs/framework/utils" +import { CartWorkflowEvents, MedusaError } from "@medusajs/framework/utils" import { WorkflowData, WorkflowResponse, @@ -11,6 +11,7 @@ import { parallelize, transform, } from "@medusajs/framework/workflows-sdk" +import { emitEventStep } from "../../common/steps/emit-event" import { useRemoteQueryStep } from "../../common/steps/use-remote-query" import { createCartsStep, @@ -173,11 +174,17 @@ export const createCartWorkflow = createWorkflow( }, }) - refreshPaymentCollectionForCartWorkflow.runAsStep({ - input: { - cart_id: cart.id, - }, - }) + parallelize( + refreshPaymentCollectionForCartWorkflow.runAsStep({ + input: { + cart_id: cart.id, + }, + }), + emitEventStep({ + eventName: CartWorkflowEvents.CREATED, + data: { id: cart.id }, + }) + ) const cartCreated = createHook("cartCreated", { cart, diff --git a/packages/core/core-flows/src/cart/workflows/update-cart.ts b/packages/core/core-flows/src/cart/workflows/update-cart.ts index 009cac5769..5318d40408 100644 --- a/packages/core/core-flows/src/cart/workflows/update-cart.ts +++ b/packages/core/core-flows/src/cart/workflows/update-cart.ts @@ -2,7 +2,11 @@ import { AdditionalData, UpdateCartWorkflowInputDTO, } from "@medusajs/framework/types" -import { MedusaError } from "@medusajs/framework/utils" +import { + CartWorkflowEvents, + isDefined, + MedusaError, +} from "@medusajs/framework/utils" import { createHook, createWorkflow, @@ -12,7 +16,7 @@ import { WorkflowData, WorkflowResponse, } from "@medusajs/framework/workflows-sdk" -import { useRemoteQueryStep } from "../../common" +import { emitEventStep, useRemoteQueryStep } from "../../common" import { findOrCreateCustomerStep, findSalesChannelStep, @@ -113,15 +117,15 @@ export const updateCartWorkflow = createWorkflow( } if ( - updateCartData.customer_id !== undefined || - updateCartData.email !== undefined + isDefined(updateCartData.customer_id) || + isDefined(updateCartData.email) ) { data_.customer_id = data.customerData.customer?.id || null data_.email = data.input?.email ?? (data.customerData.customer?.email || null) } - if (updateCartData.sales_channel_id !== undefined) { + if (isDefined(updateCartData.sales_channel_id)) { data_.sales_channel_id = data.salesChannel?.id || null } @@ -129,7 +133,34 @@ export const updateCartWorkflow = createWorkflow( } ) - updateCartsStep([cartInput]) + when({ cartInput }, ({ cartInput }) => { + return isDefined(cartInput.customer_id) || isDefined(cartInput.email) + }).then(() => { + emitEventStep({ + eventName: CartWorkflowEvents.CUSTOMER_UPDATED, + data: { id: input.id }, + }).config({ name: "emit-customer-updated" }) + }) + + when({ input, cartToUpdate }, ({ input, cartToUpdate }) => { + return ( + isDefined(input.region_id) && + input.region_id !== cartToUpdate?.region?.id + ) + }).then(() => { + emitEventStep({ + eventName: CartWorkflowEvents.REGION_UPDATED, + data: { id: input.id }, + }).config({ name: "emit-region-updated" }) + }) + + parallelize( + updateCartsStep([cartInput]), + emitEventStep({ + eventName: CartWorkflowEvents.UPDATED, + data: { id: input.id }, + }) + ) const cart = refreshCartItemsWorkflow.runAsStep({ input: { cart_id: cartInput.id, promo_codes: input.promo_codes }, diff --git a/packages/core/core-flows/src/cart/workflows/update-line-item-in-cart.ts b/packages/core/core-flows/src/cart/workflows/update-line-item-in-cart.ts index be933855d2..edfe432033 100644 --- a/packages/core/core-flows/src/cart/workflows/update-line-item-in-cart.ts +++ b/packages/core/core-flows/src/cart/workflows/update-line-item-in-cart.ts @@ -1,10 +1,13 @@ import { UpdateLineItemInCartWorkflowInputDTO } from "@medusajs/framework/types" +import { CartWorkflowEvents } from "@medusajs/framework/utils" import { WorkflowData, WorkflowResponse, createWorkflow, + parallelize, transform, } from "@medusajs/framework/workflows-sdk" +import { emitEventStep } from "../../common/steps/emit-event" import { useRemoteQueryStep } from "../../common/steps/use-remote-query" import { updateLineItemsStepWithSelector } from "../../line-item/steps" import { refreshCartShippingMethodsStep } from "../steps" @@ -103,9 +106,15 @@ export const updateLineItemInCartWorkflow = createWorkflow( }, }) - refreshPaymentCollectionForCartWorkflow.runAsStep({ - input: { cart_id: input.cart.id }, - }) + parallelize( + refreshPaymentCollectionForCartWorkflow.runAsStep({ + input: { cart_id: input.cart.id }, + }), + emitEventStep({ + eventName: CartWorkflowEvents.UPDATED, + data: { id: input.cart.id }, + }) + ) const updatedItem = transform({ result }, (data) => data.result?.[0]) diff --git a/packages/core/utils/src/core-flows/events.ts b/packages/core/utils/src/core-flows/events.ts index 2fb3242a10..ae9d614350 100644 --- a/packages/core/utils/src/core-flows/events.ts +++ b/packages/core/utils/src/core-flows/events.ts @@ -1,3 +1,10 @@ +export const CartWorkflowEvents = { + CREATED: "cart.created", + UPDATED: "cart.updated", + CUSTOMER_UPDATED: "cart.customer_updated", + REGION_UPDATED: "cart.region_updated", +} + export const CustomerWorkflowEvents = { CREATED: "customer.created", UPDATED: "customer.updated",