From 73ca35860607a5bbeb1a7398d677311990bde538 Mon Sep 17 00:00:00 2001 From: Oli Juhl <59018053+olivermrbl@users.noreply.github.com> Date: Wed, 12 Jun 2024 12:05:13 +0200 Subject: [PATCH] feat: Introduce order.placed event (#7682) --- .../core-flows/src/common/steps/emit-event.ts | 38 +++++++++++-------- .../cart/workflows/complete-cart.ts | 10 ++++- packages/core/utils/src/order/events.ts | 5 +++ packages/core/utils/src/order/index.ts | 2 + 4 files changed, 38 insertions(+), 17 deletions(-) create mode 100644 packages/core/utils/src/order/events.ts diff --git a/packages/core/core-flows/src/common/steps/emit-event.ts b/packages/core/core-flows/src/common/steps/emit-event.ts index 40c70d7f52..659041b844 100644 --- a/packages/core/core-flows/src/common/steps/emit-event.ts +++ b/packages/core/core-flows/src/common/steps/emit-event.ts @@ -1,15 +1,14 @@ -import { composeMessage, ModuleRegistrationName } from "@medusajs/utils" -import { createStep, StepExecutionContext } from "@medusajs/workflows-sdk" +import { EventBusTypes, IEventBusModuleService } from "@medusajs/types" +import { ModuleRegistrationName } from "@medusajs/utils" +import { StepExecutionContext, createStep } from "@medusajs/workflows-sdk" type Input = { eventName: string - source: string - object: string - action?: string options?: Record - data: ( - context: StepExecutionContext - ) => Promise> | Record + metadata?: Record + data: + | ((context: StepExecutionContext) => Promise>) + | Record } export const emitEventStepId = "emit-event-step" @@ -22,18 +21,27 @@ export const emitEventStep = createStep( const { container } = context - const eventBus = container.resolve(ModuleRegistrationName.EVENT_BUS) + const eventBus: IEventBusModuleService = container.resolve( + ModuleRegistrationName.EVENT_BUS + ) const data_ = typeof input.data === "function" ? await input.data(context) : input.data - const message = composeMessage(input.eventName, { + + const metadata: EventBusTypes.MessageBody["metadata"] = { + ...input.metadata, + } + + if (context.eventGroupId) { + metadata.eventGroupId = context.eventGroupId + } + + const message = { + eventName: input.eventName, data: data_, - action: input.action ?? "", - object: input.object, - source: input.source, options: input.options, - context, - }) + metadata, + } await eventBus.emit(message) }, diff --git a/packages/core/core-flows/src/definition/cart/workflows/complete-cart.ts b/packages/core/core-flows/src/definition/cart/workflows/complete-cart.ts index 46a0369e92..8ea5302d7b 100644 --- a/packages/core/core-flows/src/definition/cart/workflows/complete-cart.ts +++ b/packages/core/core-flows/src/definition/cart/workflows/complete-cart.ts @@ -1,12 +1,16 @@ import { OrderDTO } from "@medusajs/types" -import { Modules } from "@medusajs/utils" +import { Modules, OrderEvents } from "@medusajs/utils" import { WorkflowData, createWorkflow, parallelize, transform, } from "@medusajs/workflows-sdk" -import { createRemoteLinkStep, useRemoteQueryStep } from "../../../common" +import { + createRemoteLinkStep, + emitEventStep, + useRemoteQueryStep, +} from "../../../common" import { authorizePaymentSessionStep } from "../../../payment/steps/authorize-payment-session" import { createOrderFromCartStep, validateCartPaymentsStep } from "../steps" import { reserveInventoryStep } from "../steps/reserve-inventory" @@ -88,6 +92,8 @@ export const completeCartWorkflow = createWorkflow( }, ]) + emitEventStep({ eventName: OrderEvents.placed, data: { id: order.id } }) + return order } ) diff --git a/packages/core/utils/src/order/events.ts b/packages/core/utils/src/order/events.ts new file mode 100644 index 0000000000..742b443f28 --- /dev/null +++ b/packages/core/utils/src/order/events.ts @@ -0,0 +1,5 @@ +export const OrderEvents = { + placed: "order.placed", + canceled: "order.canceled", + completed: "order.completed", +} diff --git a/packages/core/utils/src/order/index.ts b/packages/core/utils/src/order/index.ts index acdaf2e2da..5663d331ab 100644 --- a/packages/core/utils/src/order/index.ts +++ b/packages/core/utils/src/order/index.ts @@ -1 +1,3 @@ +export * from "./events" export * from "./status" +