From e8230214461b37c475afa6b5a412867ddbb5dcf4 Mon Sep 17 00:00:00 2001 From: Riqwan Thamir Date: Tue, 13 Aug 2024 14:50:17 +0200 Subject: [PATCH] feat(core-flows): introduce a generic create entities step (#8553) --- .../src/common/steps/create-entities.ts | 50 +++++++++++++++++++ .../steps/create-order-change-actions.ts | 37 -------------- .../core/core-flows/src/order/steps/index.ts | 1 - .../workflows/claim/claim-add-new-item.ts | 6 ++- .../src/order/workflows/claim/claim-item.ts | 6 ++- .../claim/claim-request-item-return.ts | 6 ++- .../claim/create-claim-shipping-method.ts | 6 ++- .../workflows/create-order-change-actions.ts | 12 ++++- .../create-exchange-shipping-method.ts | 12 +++-- .../exchange/exchange-add-new-item.ts | 6 ++- .../exchange/exchange-request-item-return.ts | 6 ++- .../return/create-return-shipping-method.ts | 13 +++-- .../return/dismiss-item-return-request.ts | 13 +++-- .../return/receive-item-return-request.ts | 13 +++-- .../workflows/return/request-item-return.ts | 13 +++-- 15 files changed, 132 insertions(+), 68 deletions(-) create mode 100644 packages/core/core-flows/src/common/steps/create-entities.ts delete mode 100644 packages/core/core-flows/src/order/steps/create-order-change-actions.ts diff --git a/packages/core/core-flows/src/common/steps/create-entities.ts b/packages/core/core-flows/src/common/steps/create-entities.ts new file mode 100644 index 0000000000..9a6ee20262 --- /dev/null +++ b/packages/core/core-flows/src/common/steps/create-entities.ts @@ -0,0 +1,50 @@ +import { StepResponse, createStep } from "@medusajs/workflows-sdk" + +export interface CreateEntitiesStepType { + moduleRegistrationName: string + invokeMethod: string + compensateMethod: string + entityIdentifier?: string + data: any[] +} + +export const createEntitiesStepId = "create-entities-step" +/** + * This step creates entities for any given module or resource + */ +export const createEntitiesStep = createStep( + createEntitiesStepId, + async (input: CreateEntitiesStepType, { container }) => { + const { + moduleRegistrationName, + invokeMethod, + compensateMethod, + entityIdentifier = "id", + data = [], + } = input + + const module = container.resolve(moduleRegistrationName) + const created: any[] = data.length ? await module[invokeMethod](data) : [] + + return new StepResponse(created, { + entityIdentifiers: created.map((c) => c[entityIdentifier]), + moduleRegistrationName, + compensateMethod, + }) + }, + async (compensateInput, { container }) => { + const { + entityIdentifiers = [], + moduleRegistrationName, + compensateMethod, + } = compensateInput! + + if (!entityIdentifiers?.length) { + return + } + + const module = container.resolve(moduleRegistrationName) + + await module[compensateMethod](entityIdentifiers) + } +) diff --git a/packages/core/core-flows/src/order/steps/create-order-change-actions.ts b/packages/core/core-flows/src/order/steps/create-order-change-actions.ts deleted file mode 100644 index fc342454b2..0000000000 --- a/packages/core/core-flows/src/order/steps/create-order-change-actions.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { - CreateOrderChangeActionDTO, - IOrderModuleService, -} from "@medusajs/types" -import { ModuleRegistrationName } from "@medusajs/utils" -import { StepResponse, createStep } from "@medusajs/workflows-sdk" - -export const createOrderChangeActionsStepId = "create-order-change-actions" -/** - * This step creates order change actions. - */ -export const createOrderChangeActionsStep = createStep( - createOrderChangeActionsStepId, - async (data: CreateOrderChangeActionDTO[], { container }) => { - const service = container.resolve( - ModuleRegistrationName.ORDER - ) - - const created = await service.addOrderAction(data) - - return new StepResponse( - created, - created.map((c) => c.id) - ) - }, - async (ids, { container }) => { - if (!ids?.length) { - return - } - - const service = container.resolve( - ModuleRegistrationName.ORDER - ) - - await service.deleteOrderChangeActions(ids) - } -) diff --git a/packages/core/core-flows/src/order/steps/index.ts b/packages/core/core-flows/src/order/steps/index.ts index 73387f2c98..24c98e6c57 100644 --- a/packages/core/core-flows/src/order/steps/index.ts +++ b/packages/core/core-flows/src/order/steps/index.ts @@ -10,7 +10,6 @@ export * from "./claim/delete-claims" export * from "./complete-orders" export * from "./create-line-items" export * from "./create-order-change" -export * from "./create-order-change-actions" export * from "./create-orders" export * from "./decline-order-change" export * from "./delete-line-items" diff --git a/packages/core/core-flows/src/order/workflows/claim/claim-add-new-item.ts b/packages/core/core-flows/src/order/workflows/claim/claim-add-new-item.ts index fd27ef4f57..b4419a231c 100644 --- a/packages/core/core-flows/src/order/workflows/claim/claim-add-new-item.ts +++ b/packages/core/core-flows/src/order/workflows/claim/claim-add-new-item.ts @@ -13,13 +13,13 @@ import { transform, } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../../common" -import { createOrderChangeActionsStep } from "../../steps/create-order-change-actions" import { previewOrderChangeStep } from "../../steps/preview-order-change" import { throwIfIsCancelled, throwIfOrderChangeIsNotActive, } from "../../utils/order-validation" import { addOrderLineItemsWorkflow } from "../add-line-items" +import { createOrderChangeActionsWorkflow } from "../create-order-change-actions" /** * This step validates that a new item can be added to the claim. @@ -114,7 +114,9 @@ export const orderClaimAddNewItemWorkflow = createWorkflow( } ) - createOrderChangeActionsStep(orderChangeActionInput) + createOrderChangeActionsWorkflow.runAsStep({ + input: orderChangeActionInput, + }) return new WorkflowResponse(previewOrderChangeStep(orderClaim.order_id)) } diff --git a/packages/core/core-flows/src/order/workflows/claim/claim-item.ts b/packages/core/core-flows/src/order/workflows/claim/claim-item.ts index 87065eaf3f..f409ba74b2 100644 --- a/packages/core/core-flows/src/order/workflows/claim/claim-item.ts +++ b/packages/core/core-flows/src/order/workflows/claim/claim-item.ts @@ -13,12 +13,12 @@ import { transform, } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../../common" -import { createOrderChangeActionsStep } from "../../steps/create-order-change-actions" import { previewOrderChangeStep } from "../../steps/preview-order-change" import { throwIfIsCancelled, throwIfOrderChangeIsNotActive, } from "../../utils/order-validation" +import { createOrderChangeActionsWorkflow } from "../create-order-change-actions" /** * This step validates that claim items can be added to a claim. @@ -105,7 +105,9 @@ export const orderClaimItemWorkflow = createWorkflow( } ) - createOrderChangeActionsStep(orderChangeActionInput) + createOrderChangeActionsWorkflow.runAsStep({ + input: orderChangeActionInput, + }) return new WorkflowResponse(previewOrderChangeStep(orderClaim.order_id)) } diff --git a/packages/core/core-flows/src/order/workflows/claim/claim-request-item-return.ts b/packages/core/core-flows/src/order/workflows/claim/claim-request-item-return.ts index 014ec41a90..64ff8ec34b 100644 --- a/packages/core/core-flows/src/order/workflows/claim/claim-request-item-return.ts +++ b/packages/core/core-flows/src/order/workflows/claim/claim-request-item-return.ts @@ -16,7 +16,6 @@ import { } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../../common" import { updateOrderClaimsStep } from "../../steps/claim/update-order-claims" -import { createOrderChangeActionsStep } from "../../steps/create-order-change-actions" import { previewOrderChangeStep } from "../../steps/preview-order-change" import { createReturnsStep } from "../../steps/return/create-returns" import { updateOrderChangesStep } from "../../steps/update-order-changes" @@ -25,6 +24,7 @@ import { throwIfItemsDoesNotExistsInOrder, throwIfOrderChangeIsNotActive, } from "../../utils/order-validation" +import { createOrderChangeActionsWorkflow } from "../create-order-change-actions" /** * This step validates that items can be requested to return as part of a claim. @@ -181,7 +181,9 @@ export const orderClaimRequestItemReturnWorkflow = createWorkflow( } ) - createOrderChangeActionsStep(orderChangeActionInput) + createOrderChangeActionsWorkflow.runAsStep({ + input: orderChangeActionInput, + }) return new WorkflowResponse(previewOrderChangeStep(orderClaim.order_id)) } diff --git a/packages/core/core-flows/src/order/workflows/claim/create-claim-shipping-method.ts b/packages/core/core-flows/src/order/workflows/claim/create-claim-shipping-method.ts index 2a2da7c6aa..ec25aff921 100644 --- a/packages/core/core-flows/src/order/workflows/claim/create-claim-shipping-method.ts +++ b/packages/core/core-flows/src/order/workflows/claim/create-claim-shipping-method.ts @@ -13,12 +13,12 @@ import { } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../../common" import { previewOrderChangeStep } from "../../steps" -import { createOrderChangeActionsStep } from "../../steps/create-order-change-actions" import { createOrderShippingMethods } from "../../steps/create-order-shipping-methods" import { throwIfIsCancelled, throwIfOrderChangeIsNotActive, } from "../../utils/order-validation" +import { createOrderChangeActionsWorkflow } from "../create-order-change-actions" /** * This step confirms that a shipping method can be created for a claim. @@ -168,7 +168,9 @@ export const createClaimShippingMethodWorkflow = createWorkflow( } ) - createOrderChangeActionsStep([orderChangeActionInput]) + createOrderChangeActionsWorkflow.runAsStep({ + input: [orderChangeActionInput], + }) return new WorkflowResponse(previewOrderChangeStep(order.id)) } diff --git a/packages/core/core-flows/src/order/workflows/create-order-change-actions.ts b/packages/core/core-flows/src/order/workflows/create-order-change-actions.ts index 06991d5180..7e9516cb2c 100644 --- a/packages/core/core-flows/src/order/workflows/create-order-change-actions.ts +++ b/packages/core/core-flows/src/order/workflows/create-order-change-actions.ts @@ -2,12 +2,13 @@ import { CreateOrderChangeActionDTO, OrderChangeActionDTO, } from "@medusajs/types" +import { ModuleRegistrationName } from "@medusajs/utils" import { WorkflowData, WorkflowResponse, createWorkflow, } from "@medusajs/workflows-sdk" -import { createOrderChangeActionsStep } from "../steps" +import { createEntitiesStep } from "../../common/steps/create-entities" export const createOrderChangeActionsWorkflowId = "create-order-change-actions" /** @@ -18,6 +19,13 @@ export const createOrderChangeActionsWorkflow = createWorkflow( ( input: WorkflowData ): WorkflowResponse => { - return new WorkflowResponse(createOrderChangeActionsStep(input)) + const orderChangeActions = createEntitiesStep({ + moduleRegistrationName: ModuleRegistrationName.ORDER, + invokeMethod: "addOrderAction", + compensateMethod: "deleteOrderChangeActions", + data: input, + }) + + return new WorkflowResponse(orderChangeActions) } ) diff --git a/packages/core/core-flows/src/order/workflows/exchange/create-exchange-shipping-method.ts b/packages/core/core-flows/src/order/workflows/exchange/create-exchange-shipping-method.ts index fea6e30957..3974bbd0da 100644 --- a/packages/core/core-flows/src/order/workflows/exchange/create-exchange-shipping-method.ts +++ b/packages/core/core-flows/src/order/workflows/exchange/create-exchange-shipping-method.ts @@ -13,12 +13,12 @@ import { } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../../common" import { previewOrderChangeStep } from "../../steps" -import { createOrderChangeActionsStep } from "../../steps/create-order-change-actions" import { createOrderShippingMethods } from "../../steps/create-order-shipping-methods" import { throwIfIsCancelled, throwIfOrderChangeIsNotActive, } from "../../utils/order-validation" +import { createOrderChangeActionsWorkflow } from "../create-order-change-actions" /** * This step validates that a shipping method can be created for an exchange. @@ -98,7 +98,11 @@ export const createExchangeShippingMethodWorkflow = createWorkflow( list: false, }).config({ name: "order-change-query" }) - createExchangeShippingMethodValidationStep({ order, orderExchange, orderChange }) + createExchangeShippingMethodValidationStep({ + order, + orderExchange, + orderChange, + }) const shippingMethodInput = transform( { @@ -168,7 +172,9 @@ export const createExchangeShippingMethodWorkflow = createWorkflow( } ) - createOrderChangeActionsStep([orderChangeActionInput]) + createOrderChangeActionsWorkflow.runAsStep({ + input: [orderChangeActionInput], + }) return new WorkflowResponse(previewOrderChangeStep(order.id)) } diff --git a/packages/core/core-flows/src/order/workflows/exchange/exchange-add-new-item.ts b/packages/core/core-flows/src/order/workflows/exchange/exchange-add-new-item.ts index ea9df232d2..a329e7181b 100644 --- a/packages/core/core-flows/src/order/workflows/exchange/exchange-add-new-item.ts +++ b/packages/core/core-flows/src/order/workflows/exchange/exchange-add-new-item.ts @@ -13,13 +13,13 @@ import { transform, } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../../common" -import { createOrderChangeActionsStep } from "../../steps/create-order-change-actions" import { previewOrderChangeStep } from "../../steps/preview-order-change" import { throwIfIsCancelled, throwIfOrderChangeIsNotActive, } from "../../utils/order-validation" import { addOrderLineItemsWorkflow } from "../add-line-items" +import { createOrderChangeActionsWorkflow } from "../create-order-change-actions" /** * This step validates that new items can be added to an exchange. @@ -114,7 +114,9 @@ export const orderExchangeAddNewItemWorkflow = createWorkflow( } ) - createOrderChangeActionsStep(orderChangeActionInput) + createOrderChangeActionsWorkflow.runAsStep({ + input: orderChangeActionInput, + }) return new WorkflowResponse(previewOrderChangeStep(orderExchange.order_id)) } diff --git a/packages/core/core-flows/src/order/workflows/exchange/exchange-request-item-return.ts b/packages/core/core-flows/src/order/workflows/exchange/exchange-request-item-return.ts index 4fb9eb2680..1d8e3447cd 100644 --- a/packages/core/core-flows/src/order/workflows/exchange/exchange-request-item-return.ts +++ b/packages/core/core-flows/src/order/workflows/exchange/exchange-request-item-return.ts @@ -15,7 +15,6 @@ import { when, } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../../common" -import { createOrderChangeActionsStep } from "../../steps/create-order-change-actions" import { updateOrderExchangesStep } from "../../steps/exchange/update-order-exchanges" import { previewOrderChangeStep } from "../../steps/preview-order-change" import { createReturnsStep } from "../../steps/return/create-returns" @@ -24,6 +23,7 @@ import { throwIfItemsDoesNotExistsInOrder, throwIfOrderChangeIsNotActive, } from "../../utils/order-validation" +import { createOrderChangeActionsWorkflow } from "../create-order-change-actions" /** * This step validates that items can be returned as part of an exchange. @@ -171,7 +171,9 @@ export const orderExchangeRequestItemReturnWorkflow = createWorkflow( } ) - createOrderChangeActionsStep(orderChangeActionInput) + createOrderChangeActionsWorkflow.runAsStep({ + input: orderChangeActionInput, + }) return new WorkflowResponse(previewOrderChangeStep(orderExchange.order_id)) } diff --git a/packages/core/core-flows/src/order/workflows/return/create-return-shipping-method.ts b/packages/core/core-flows/src/order/workflows/return/create-return-shipping-method.ts index c3697783f1..656ead0fab 100644 --- a/packages/core/core-flows/src/order/workflows/return/create-return-shipping-method.ts +++ b/packages/core/core-flows/src/order/workflows/return/create-return-shipping-method.ts @@ -6,7 +6,6 @@ import { } from "@medusajs/types" import { ChangeActionType, OrderChangeStatus } from "@medusajs/utils" import { - WorkflowData, WorkflowResponse, createStep, createWorkflow, @@ -14,12 +13,12 @@ import { } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../../common" import { previewOrderChangeStep } from "../../steps" -import { createOrderChangeActionsStep } from "../../steps/create-order-change-actions" import { createOrderShippingMethods } from "../../steps/create-order-shipping-methods" import { throwIfIsCancelled, throwIfOrderChangeIsNotActive, } from "../../utils/order-validation" +import { createOrderChangeActionsWorkflow } from "../create-order-change-actions" /** * This step validates that a shipping method can be created for a return. @@ -100,7 +99,11 @@ export const createReturnShippingMethodWorkflow = createWorkflow( list: false, }).config({ name: "order-change-query" }) - createReturnShippingMethodValidationStep({ order, orderReturn, orderChange }) + createReturnShippingMethodValidationStep({ + order, + orderReturn, + orderChange, + }) const shippingMethodInput = transform( { @@ -172,7 +175,9 @@ export const createReturnShippingMethodWorkflow = createWorkflow( } ) - createOrderChangeActionsStep([orderChangeActionInput]) + createOrderChangeActionsWorkflow.runAsStep({ + input: [orderChangeActionInput], + }) return new WorkflowResponse(previewOrderChangeStep(order.id)) } diff --git a/packages/core/core-flows/src/order/workflows/return/dismiss-item-return-request.ts b/packages/core/core-flows/src/order/workflows/return/dismiss-item-return-request.ts index 7b109e0bbe..bedb96dc14 100644 --- a/packages/core/core-flows/src/order/workflows/return/dismiss-item-return-request.ts +++ b/packages/core/core-flows/src/order/workflows/return/dismiss-item-return-request.ts @@ -14,12 +14,12 @@ import { } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../../common" import { previewOrderChangeStep } from "../../steps" -import { createOrderChangeActionsStep } from "../../steps/create-order-change-actions" import { throwIfIsCancelled, throwIfItemsDoesNotExistsInReturn, throwIfOrderChangeIsNotActive, } from "../../utils/order-validation" +import { createOrderChangeActionsWorkflow } from "../create-order-change-actions" /** * This step validates that a return request can have its items dismissed. @@ -85,7 +85,12 @@ export const dismissItemReturnRequestWorkflow = createWorkflow( list: false, }).config({ name: "order-change-query" }) - dismissItemReturnRequestValidationStep({ order, items: input.items, orderReturn, orderChange }) + dismissItemReturnRequestValidationStep({ + order, + items: input.items, + orderReturn, + orderChange, + }) const orderChangeActionInput = transform( { order, orderChange, orderReturn, items: input.items }, @@ -107,7 +112,9 @@ export const dismissItemReturnRequestWorkflow = createWorkflow( } ) - createOrderChangeActionsStep(orderChangeActionInput) + createOrderChangeActionsWorkflow.runAsStep({ + input: orderChangeActionInput, + }) return new WorkflowResponse(previewOrderChangeStep(order.id)) } diff --git a/packages/core/core-flows/src/order/workflows/return/receive-item-return-request.ts b/packages/core/core-flows/src/order/workflows/return/receive-item-return-request.ts index 22d6fb8945..5e41c110f9 100644 --- a/packages/core/core-flows/src/order/workflows/return/receive-item-return-request.ts +++ b/packages/core/core-flows/src/order/workflows/return/receive-item-return-request.ts @@ -14,12 +14,12 @@ import { } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../../common" import { previewOrderChangeStep } from "../../steps" -import { createOrderChangeActionsStep } from "../../steps/create-order-change-actions" import { throwIfIsCancelled, throwIfItemsDoesNotExistsInReturn, throwIfOrderChangeIsNotActive, } from "../../utils/order-validation" +import { createOrderChangeActionsWorkflow } from "../create-order-change-actions" /** * This step validates that a return's items can be marked as received. @@ -85,7 +85,12 @@ export const receiveItemReturnRequestWorkflow = createWorkflow( list: false, }).config({ name: "order-change-query" }) - receiveItemReturnRequestValidationStep({ order, items: input.items, orderReturn, orderChange }) + receiveItemReturnRequestValidationStep({ + order, + items: input.items, + orderReturn, + orderChange, + }) const orderChangeActionInput = transform( { order, orderChange, orderReturn, items: input.items }, @@ -107,7 +112,9 @@ export const receiveItemReturnRequestWorkflow = createWorkflow( } ) - createOrderChangeActionsStep(orderChangeActionInput) + createOrderChangeActionsWorkflow.runAsStep({ + input: orderChangeActionInput, + }) return new WorkflowResponse(previewOrderChangeStep(order.id)) } diff --git a/packages/core/core-flows/src/order/workflows/return/request-item-return.ts b/packages/core/core-flows/src/order/workflows/return/request-item-return.ts index 0bcbf07e7d..f63a6d88f6 100644 --- a/packages/core/core-flows/src/order/workflows/return/request-item-return.ts +++ b/packages/core/core-flows/src/order/workflows/return/request-item-return.ts @@ -14,13 +14,13 @@ import { } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../../common" import { previewOrderChangeStep } from "../../steps" -import { createOrderChangeActionsStep } from "../../steps/create-order-change-actions" import { throwIfIsCancelled, throwIfItemsDoesNotExistsInOrder, throwIfOrderChangeIsNotActive, } from "../../utils/order-validation" import { validateReturnReasons } from "../../utils/validate-return-reason" +import { createOrderChangeActionsWorkflow } from "../create-order-change-actions" /** * This step validates that itens can be added to a return. @@ -91,7 +91,12 @@ export const requestItemReturnWorkflow = createWorkflow( list: false, }).config({ name: "order-change-query" }) - requestItemReturnValidationStep({ order, items: input.items, orderReturn, orderChange }) + requestItemReturnValidationStep({ + order, + items: input.items, + orderReturn, + orderChange, + }) const orderChangeActionInput = transform( { order, orderChange, orderReturn, items: input.items }, @@ -115,7 +120,9 @@ export const requestItemReturnWorkflow = createWorkflow( } ) - createOrderChangeActionsStep(orderChangeActionInput) + createOrderChangeActionsWorkflow.runAsStep({ + input: orderChangeActionInput, + }) return new WorkflowResponse(previewOrderChangeStep(order.id)) }