From d8e3e04895614ceee4e43c32b5005d438020718b Mon Sep 17 00:00:00 2001 From: "Carlos R. L. Rodrigues" <37986729+carlos-r-l-rodrigues@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:26:44 -0300 Subject: [PATCH] feat(core-flows): order events (#9702) --- .../src/order/workflows/archive-orders.ts | 12 +++++++++ .../workflows/cancel-order-fulfillment.ts | 21 +++++++++++++--- .../src/order/workflows/cancel-order.ts | 14 ++++++++--- .../workflows/claim/confirm-claim-request.ts | 15 ++++++++++- .../src/order/workflows/complete-orders.ts | 15 ++++++++++- .../src/order/workflows/create-fulfillment.ts | 22 +++++++++++++--- .../exchange/confirm-exchange-request.ts | 15 ++++++++++- .../return/confirm-receive-return-request.ts | 12 +++++++-- .../return/confirm-return-request.ts | 14 ++++++++++- .../return/create-complete-return.ts | 25 ++++++++++++++++++- packages/core/utils/src/core-flows/events.ts | 10 ++++++++ 11 files changed, 159 insertions(+), 16 deletions(-) diff --git a/packages/core/core-flows/src/order/workflows/archive-orders.ts b/packages/core/core-flows/src/order/workflows/archive-orders.ts index 0f32f62ade..bb3ecf6c32 100644 --- a/packages/core/core-flows/src/order/workflows/archive-orders.ts +++ b/packages/core/core-flows/src/order/workflows/archive-orders.ts @@ -1,9 +1,12 @@ import { OrderDTO } from "@medusajs/framework/types" +import { OrderWorkflowEvents } from "@medusajs/framework/utils" import { WorkflowData, WorkflowResponse, createWorkflow, + transform, } from "@medusajs/framework/workflows-sdk" +import { emitEventStep } from "../../common/steps/emit-event" import { archiveOrdersStep } from "../steps" export type ArchiveOrdersWorkflowInput = { @@ -19,6 +22,15 @@ export const archiveOrderWorkflow = createWorkflow( ( input: WorkflowData ): WorkflowResponse => { + const eventData = transform({ input }, (data) => { + return data.input.orderIds.map((id) => ({ id })) + }) + + emitEventStep({ + eventName: OrderWorkflowEvents.ARCHIVED, + data: eventData, + }) + return new WorkflowResponse(archiveOrdersStep(input)) } ) diff --git a/packages/core/core-flows/src/order/workflows/cancel-order-fulfillment.ts b/packages/core/core-flows/src/order/workflows/cancel-order-fulfillment.ts index a75478206c..30905c1f58 100644 --- a/packages/core/core-flows/src/order/workflows/cancel-order-fulfillment.ts +++ b/packages/core/core-flows/src/order/workflows/cancel-order-fulfillment.ts @@ -5,7 +5,11 @@ import { OrderDTO, OrderWorkflow, } from "@medusajs/framework/types" -import { MedusaError, Modules } from "@medusajs/framework/utils" +import { + MedusaError, + Modules, + OrderWorkflowEvents, +} from "@medusajs/framework/utils" import { WorkflowData, WorkflowResponse, @@ -15,7 +19,7 @@ import { parallelize, transform, } from "@medusajs/framework/workflows-sdk" -import { useRemoteQueryStep } from "../../common" +import { emitEventStep, useRemoteQueryStep } from "../../common" import { cancelFulfillmentWorkflow } from "../../fulfillment" import { adjustInventoryLevelsStep } from "../../inventory" import { cancelOrderFulfillmentStep } from "../steps/cancel-fulfillment" @@ -153,9 +157,20 @@ export const cancelOrderFulfillmentWorkflow = createWorkflow( prepareInventoryUpdate ) + const eventData = transform({ order, fulfillment }, (data) => { + return { + order_id: data.order.id, + fulfillment_id: data.fulfillment.id, + } + }) + parallelize( cancelOrderFulfillmentStep(cancelOrderFulfillmentData), - adjustInventoryLevelsStep(inventoryAdjustment) + adjustInventoryLevelsStep(inventoryAdjustment), + emitEventStep({ + eventName: OrderWorkflowEvents.FULFILLMENT_CANCELED, + data: eventData, + }) ) // last step because there is no compensation for this step diff --git a/packages/core/core-flows/src/order/workflows/cancel-order.ts b/packages/core/core-flows/src/order/workflows/cancel-order.ts index 8d9312f013..8c43679e0a 100644 --- a/packages/core/core-flows/src/order/workflows/cancel-order.ts +++ b/packages/core/core-flows/src/order/workflows/cancel-order.ts @@ -4,7 +4,11 @@ import { OrderWorkflow, PaymentCollectionDTO, } from "@medusajs/framework/types" -import { MedusaError, deepFlatMap } from "@medusajs/framework/utils" +import { + MedusaError, + OrderWorkflowEvents, + deepFlatMap, +} from "@medusajs/framework/utils" import { WorkflowData, WorkflowResponse, @@ -14,7 +18,7 @@ import { parallelize, transform, } from "@medusajs/framework/workflows-sdk" -import { useRemoteQueryStep } from "../../common" +import { emitEventStep, useRemoteQueryStep } from "../../common" import { cancelPaymentStep } from "../../payment/steps" import { deleteReservationsByLineItemsStep } from "../../reservation/steps" import { cancelOrdersStep } from "../steps/cancel-orders" @@ -122,7 +126,11 @@ export const cancelOrderWorkflow = createWorkflow( parallelize( deleteReservationsByLineItemsStep(lineItemIds), cancelPaymentStep({ paymentIds }), - cancelOrdersStep({ orderIds: [order.id] }) + cancelOrdersStep({ orderIds: [order.id] }), + emitEventStep({ + eventName: OrderWorkflowEvents.CANCELED, + data: { id: order.id }, + }) ) const orderCanceled = createHook("orderCanceled", { diff --git a/packages/core/core-flows/src/order/workflows/claim/confirm-claim-request.ts b/packages/core/core-flows/src/order/workflows/claim/confirm-claim-request.ts index 4391ea64c3..7b7aa1e0a3 100644 --- a/packages/core/core-flows/src/order/workflows/claim/confirm-claim-request.ts +++ b/packages/core/core-flows/src/order/workflows/claim/confirm-claim-request.ts @@ -13,6 +13,7 @@ import { MedusaError, Modules, OrderChangeStatus, + OrderWorkflowEvents, ReturnStatus, } from "@medusajs/framework/utils" import { @@ -25,7 +26,11 @@ import { } from "@medusajs/framework/workflows-sdk" import { reserveInventoryStep } from "../../../cart/steps/reserve-inventory" import { prepareConfirmInventoryInput } from "../../../cart/utils/prepare-confirm-inventory-input" -import { createRemoteLinkStep, useRemoteQueryStep } from "../../../common" +import { + createRemoteLinkStep, + emitEventStep, + useRemoteQueryStep, +} from "../../../common" import { createReturnFulfillmentWorkflow } from "../../../fulfillment/workflows/create-return-fulfillment" import { previewOrderChangeStep, updateReturnsStep } from "../../steps" import { createOrderClaimItemsFromActionsStep } from "../../steps/claim/create-claim-items-from-actions" @@ -439,6 +444,14 @@ export const confirmClaimRequestWorkflow = createWorkflow( }, }) + emitEventStep({ + eventName: OrderWorkflowEvents.CLAIM_CREATED, + data: { + order_id: order.id, + claim_id: orderClaim.id, + }, + }) + return new WorkflowResponse(orderPreview) } ) diff --git a/packages/core/core-flows/src/order/workflows/complete-orders.ts b/packages/core/core-flows/src/order/workflows/complete-orders.ts index e22ba03ed3..ed835aaa92 100644 --- a/packages/core/core-flows/src/order/workflows/complete-orders.ts +++ b/packages/core/core-flows/src/order/workflows/complete-orders.ts @@ -1,11 +1,14 @@ +import { AdditionalData } from "@medusajs/framework/types" +import { OrderWorkflowEvents } from "@medusajs/framework/utils" import { WorkflowData, WorkflowResponse, createHook, createWorkflow, + transform, } from "@medusajs/framework/workflows-sdk" +import { emitEventStep } from "../../common/steps/emit-event" import { completeOrdersStep } from "../steps" -import { AdditionalData } from "@medusajs/framework/types" export type CompleteOrdersWorkflowInput = { orderIds: string[] @@ -19,6 +22,16 @@ export const completeOrderWorkflow = createWorkflow( completeOrderWorkflowId, (input: WorkflowData) => { const completedOrders = completeOrdersStep(input) + + const eventData = transform({ input }, (data) => { + return data.input.orderIds.map((id) => ({ id })) + }) + + emitEventStep({ + eventName: OrderWorkflowEvents.COMPLETED, + data: eventData, + }) + const ordersCompleted = createHook("ordersCompleted", { orders: completedOrders, additional_data: input.additional_data, diff --git a/packages/core/core-flows/src/order/workflows/create-fulfillment.ts b/packages/core/core-flows/src/order/workflows/create-fulfillment.ts index 2ec391e8a7..1a4697aed4 100644 --- a/packages/core/core-flows/src/order/workflows/create-fulfillment.ts +++ b/packages/core/core-flows/src/order/workflows/create-fulfillment.ts @@ -7,7 +7,12 @@ import { OrderWorkflow, ReservationItemDTO, } from "@medusajs/framework/types" -import { MathBN, MedusaError, Modules } from "@medusajs/framework/utils" +import { + MathBN, + MedusaError, + Modules, + OrderWorkflowEvents, +} from "@medusajs/framework/utils" import { WorkflowData, WorkflowResponse, @@ -17,7 +22,11 @@ import { parallelize, transform, } from "@medusajs/framework/workflows-sdk" -import { createRemoteLinkStep, useRemoteQueryStep } from "../../common" +import { + createRemoteLinkStep, + emitEventStep, + useRemoteQueryStep, +} from "../../common" import { createFulfillmentWorkflow } from "../../fulfillment" import { adjustInventoryLevelsStep } from "../../inventory" import { @@ -351,7 +360,14 @@ export const createOrderFulfillmentWorkflow = createWorkflow( registerOrderFulfillmentStep(registerOrderFulfillmentData), createRemoteLinkStep(link), updateReservationsStep(toUpdate), - deleteReservationsStep(toDelete) + deleteReservationsStep(toDelete), + emitEventStep({ + eventName: OrderWorkflowEvents.FULFILLMENT_CREATED, + data: { + order_id: input.order_id, + fulfillment_id: fulfillment.id, + }, + }) ) const fulfillmentCreated = createHook("fulfillmentCreated", { diff --git a/packages/core/core-flows/src/order/workflows/exchange/confirm-exchange-request.ts b/packages/core/core-flows/src/order/workflows/exchange/confirm-exchange-request.ts index adba4a3f8e..ff2279fa03 100644 --- a/packages/core/core-flows/src/order/workflows/exchange/confirm-exchange-request.ts +++ b/packages/core/core-flows/src/order/workflows/exchange/confirm-exchange-request.ts @@ -13,6 +13,7 @@ import { MedusaError, Modules, OrderChangeStatus, + OrderWorkflowEvents, ReturnStatus, } from "@medusajs/framework/utils" import { @@ -25,7 +26,11 @@ import { } from "@medusajs/framework/workflows-sdk" import { reserveInventoryStep } from "../../../cart/steps/reserve-inventory" import { prepareConfirmInventoryInput } from "../../../cart/utils/prepare-confirm-inventory-input" -import { createRemoteLinkStep, useRemoteQueryStep } from "../../../common" +import { + createRemoteLinkStep, + emitEventStep, + useRemoteQueryStep, +} from "../../../common" import { createReturnFulfillmentWorkflow } from "../../../fulfillment/workflows/create-return-fulfillment" import { previewOrderChangeStep, updateReturnsStep } from "../../steps" import { confirmOrderChanges } from "../../steps/confirm-order-changes" @@ -426,6 +431,14 @@ export const confirmExchangeRequestWorkflow = createWorkflow( }, }) + emitEventStep({ + eventName: OrderWorkflowEvents.EXCHANGE_CREATED, + data: { + order_id: order.id, + exchange_id: orderExchange.id, + }, + }) + return new WorkflowResponse(orderPreview) } ) diff --git a/packages/core/core-flows/src/order/workflows/return/confirm-receive-return-request.ts b/packages/core/core-flows/src/order/workflows/return/confirm-receive-return-request.ts index 3b3709bff7..64a1c94bcc 100644 --- a/packages/core/core-flows/src/order/workflows/return/confirm-receive-return-request.ts +++ b/packages/core/core-flows/src/order/workflows/return/confirm-receive-return-request.ts @@ -11,6 +11,7 @@ import { ChangeActionType, MathBN, OrderChangeStatus, + OrderWorkflowEvents, ReturnStatus, deepFlatMap, } from "@medusajs/framework/utils" @@ -21,7 +22,7 @@ import { parallelize, transform, } from "@medusajs/framework/workflows-sdk" -import { useRemoteQueryStep } from "../../../common" +import { emitEventStep, useRemoteQueryStep } from "../../../common" import { adjustInventoryLevelsStep } from "../../../inventory/steps" import { previewOrderChangeStep, @@ -299,7 +300,14 @@ export const confirmReturnReceiveWorkflow = createWorkflow( orderId: order.id, confirmed_by: input.confirmed_by, }), - adjustInventoryLevelsStep(inventoryAdjustment) + adjustInventoryLevelsStep(inventoryAdjustment), + emitEventStep({ + eventName: OrderWorkflowEvents.RETURN_RECEIVED, + data: { + order_id: order.id, + return_id: orderReturn.id, + }, + }) ) return new WorkflowResponse(previewOrderChangeStep(order.id)) diff --git a/packages/core/core-flows/src/order/workflows/return/confirm-return-request.ts b/packages/core/core-flows/src/order/workflows/return/confirm-return-request.ts index a0fa976746..3e0d476d77 100644 --- a/packages/core/core-flows/src/order/workflows/return/confirm-return-request.ts +++ b/packages/core/core-flows/src/order/workflows/return/confirm-return-request.ts @@ -11,6 +11,7 @@ import { MedusaError, Modules, OrderChangeStatus, + OrderWorkflowEvents, ReturnStatus, } from "@medusajs/framework/utils" import { @@ -21,7 +22,11 @@ import { transform, when, } from "@medusajs/framework/workflows-sdk" -import { createRemoteLinkStep, useRemoteQueryStep } from "../../../common" +import { + createRemoteLinkStep, + emitEventStep, + useRemoteQueryStep, +} from "../../../common" import { createReturnFulfillmentWorkflow } from "../../../fulfillment/workflows/create-return-fulfillment" import { previewOrderChangeStep, updateReturnsStep } from "../../steps" import { confirmOrderChanges } from "../../steps/confirm-order-changes" @@ -284,6 +289,13 @@ export const confirmReturnRequestWorkflow = createWorkflow( changes: [orderChange], orderId: order.id, confirmed_by: input.confirmed_by, + }), + emitEventStep({ + eventName: OrderWorkflowEvents.RETURN_REQUESTED, + data: { + order_id: order.id, + return_id: orderReturn.id, + }, }) ) diff --git a/packages/core/core-flows/src/order/workflows/return/create-complete-return.ts b/packages/core/core-flows/src/order/workflows/return/create-complete-return.ts index f916b67e76..ac6c0c4251 100644 --- a/packages/core/core-flows/src/order/workflows/return/create-complete-return.ts +++ b/packages/core/core-flows/src/order/workflows/return/create-complete-return.ts @@ -11,15 +11,21 @@ import { MathBN, MedusaError, Modules, + OrderWorkflowEvents, isDefined, } from "@medusajs/framework/utils" import { WorkflowData, createStep, createWorkflow, + parallelize, transform, } from "@medusajs/framework/workflows-sdk" -import { createRemoteLinkStep, useRemoteQueryStep } from "../../../common" +import { + createRemoteLinkStep, + emitEventStep, + useRemoteQueryStep, +} from "../../../common" import { createReturnFulfillmentWorkflow } from "../../../fulfillment" import { createCompleteReturnStep } from "../../steps/return/create-complete-return" import { receiveReturnStep } from "../../steps/return/receive-return" @@ -332,5 +338,22 @@ export const createAndCompleteReturnOrderWorkflow = createWorkflow( prepareReceiveItems ) receiveReturnStep(receiveItems) + + parallelize( + emitEventStep({ + eventName: OrderWorkflowEvents.RETURN_REQUESTED, + data: { + order_id: order.id, + return_id: returnCreated.id, + }, + }).config({ name: "emit-return-requested-event" }), + emitEventStep({ + eventName: OrderWorkflowEvents.RETURN_RECEIVED, + data: { + order_id: order.id, + return_id: returnCreated.id, + }, + }).config({ name: "emit-return-received-event" }) + ) } ) diff --git a/packages/core/utils/src/core-flows/events.ts b/packages/core/utils/src/core-flows/events.ts index ae9d614350..3276ae0e80 100644 --- a/packages/core/utils/src/core-flows/events.ts +++ b/packages/core/utils/src/core-flows/events.ts @@ -15,6 +15,16 @@ export const OrderWorkflowEvents = { PLACED: "order.placed", CANCELED: "order.canceled", COMPLETED: "order.completed", + ARCHIVED: "order.archived", + + FULFILLMENT_CREATED: "order.fulfillment_created", + FULFILLMENT_CANCELED: "order.fulfillment_canceled", + + RETURN_REQUESTED: "order.return_requested", + RETURN_RECEIVED: "order.return_received", + + CLAIM_CREATED: "order.claim_created", + EXCHANGE_CREATED: "order.exchange_created", } export const UserWorkflowEvents = {