From 1ba887f4c990e511fdf400ca81add6669d2d2200 Mon Sep 17 00:00:00 2001 From: "Carlos R. L. Rodrigues" <37986729+carlos-r-l-rodrigues@users.noreply.github.com> Date: Tue, 4 Jun 2024 11:23:53 -0300 Subject: [PATCH] chore: parallelize steps (#7605) --- .../workflows/add-shipping-method-to-cart.ts | 14 ++++++---- .../definition/cart/workflows/add-to-cart.ts | 10 ++++--- .../cart/workflows/complete-cart.ts | 18 ++++++------ .../definition/cart/workflows/create-carts.ts | 20 +++++++------ .../workflows/refresh-payment-collection.ts | 24 ++++++++-------- .../cart/workflows/update-cart-promotions.ts | 20 ++++++------- .../definition/cart/workflows/update-cart.ts | 23 +++++++-------- .../workflows/update-line-item-in-cart.ts | 9 ++++-- .../workflows/cancel-order-fulfillment.ts | 21 ++++++++------ .../src/order/workflows/cancel-order.ts | 9 ++++-- .../src/order/workflows/create-fulfillment.ts | 5 ++-- .../src/order/workflows/create-return.ts | 28 ++++++++++--------- .../src/order/workflows/create-shipment.ts | 12 ++++---- .../src/product/workflows/delete-products.ts | 23 ++++++++------- .../src/product/workflows/update-products.ts | 4 +-- .../add-or-remove-campaign-promotions.ts | 12 ++++++-- 16 files changed, 142 insertions(+), 110 deletions(-) diff --git a/packages/core/core-flows/src/definition/cart/workflows/add-shipping-method-to-cart.ts b/packages/core/core-flows/src/definition/cart/workflows/add-shipping-method-to-cart.ts index b5ef6dd0f1..6f9bd34dde 100644 --- a/packages/core/core-flows/src/definition/cart/workflows/add-shipping-method-to-cart.ts +++ b/packages/core/core-flows/src/definition/cart/workflows/add-shipping-method-to-cart.ts @@ -1,6 +1,7 @@ import { WorkflowData, createWorkflow, + parallelize, transform, } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../../common/steps/use-remote-query" @@ -78,10 +79,13 @@ export const addShippingMethodToWorkflow = createWorkflow( const shippingMethods = addShippingMethodToCartStep({ shipping_methods: shippingMethodInput, }) - refreshCartPromotionsStep({ id: input.cart_id }) - updateTaxLinesStep({ - cart_or_cart_id: input.cart_id, - shipping_methods: shippingMethods, - }) + + parallelize( + refreshCartPromotionsStep({ id: input.cart_id }), + updateTaxLinesStep({ + cart_or_cart_id: input.cart_id, + shipping_methods: shippingMethods, + }) + ) } ) diff --git a/packages/core/core-flows/src/definition/cart/workflows/add-to-cart.ts b/packages/core/core-flows/src/definition/cart/workflows/add-to-cart.ts index 4855d64bbb..d04e7b66d8 100644 --- a/packages/core/core-flows/src/definition/cart/workflows/add-to-cart.ts +++ b/packages/core/core-flows/src/definition/cart/workflows/add-to-cart.ts @@ -111,10 +111,12 @@ export const addToCartWorkflow = createWorkflow( list: false, }).config({ name: "refetch–cart" }) - refreshCartShippingMethodsStep({ cart }) - updateTaxLinesStep({ cart_or_cart_id: input.cart.id, items }) - refreshCartPromotionsStep({ id: input.cart.id }) - refreshPaymentCollectionForCartStep({ cart_id: input.cart.id }) + parallelize( + refreshCartShippingMethodsStep({ cart }), + updateTaxLinesStep({ cart_or_cart_id: input.cart.id, items }), + refreshCartPromotionsStep({ id: input.cart.id }), + refreshPaymentCollectionForCartStep({ cart_id: input.cart.id }) + ) return items } 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 f9453fc2c3..5ed2e74ec6 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 @@ -2,6 +2,7 @@ import { OrderDTO } from "@medusajs/types" import { WorkflowData, createWorkflow, + parallelize, transform, } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../../common" @@ -62,14 +63,15 @@ export const completeCartWorkflow = createWorkflow( }, }) - reserveInventoryStep(formatedInventoryItems) - - const finalCart = useRemoteQueryStep({ - entry_point: "cart", - fields: completeCartFields, - variables: { id: input.id }, - list: false, - }).config({ name: "final-cart" }) + const [, finalCart] = parallelize( + reserveInventoryStep(formatedInventoryItems), + useRemoteQueryStep({ + entry_point: "cart", + fields: completeCartFields, + variables: { id: input.id }, + list: false, + }).config({ name: "final-cart" }) + ) const order = createOrderFromCartStep({ cart: finalCart }) diff --git a/packages/core/core-flows/src/definition/cart/workflows/create-carts.ts b/packages/core/core-flows/src/definition/cart/workflows/create-carts.ts index 1802ba773b..90e128f1d1 100644 --- a/packages/core/core-flows/src/definition/cart/workflows/create-carts.ts +++ b/packages/core/core-flows/src/definition/cart/workflows/create-carts.ts @@ -1,4 +1,5 @@ import { CartDTO, CreateCartWorkflowInputDTO } from "@medusajs/types" +import { MedusaError } from "@medusajs/utils" import { WorkflowData, createWorkflow, @@ -20,7 +21,6 @@ import { productVariantsFields } from "../utils/fields" import { prepareLineItemData } from "../utils/prepare-line-item-data" import { confirmVariantInventoryWorkflow } from "./confirm-variant-inventory" import { refreshPaymentCollectionForCartStep } from "./refresh-payment-collection" -import { MedusaError } from "@medusajs/utils" // TODO: The createCartWorkflow are missing the following steps: // - Refresh/delete shipping methods (fulfillment module) @@ -140,14 +140,16 @@ export const createCartWorkflow = createWorkflow( const carts = createCartsStep([cartToCreate]) const cart = transform({ carts }, (data) => data.carts?.[0]) - refreshCartPromotionsStep({ - id: cart.id, - promo_codes: input.promo_codes, - }) - updateTaxLinesStep({ cart_or_cart_id: cart.id }) - refreshPaymentCollectionForCartStep({ - cart_id: cart.id, - }) + parallelize( + refreshCartPromotionsStep({ + id: cart.id, + promo_codes: input.promo_codes, + }), + updateTaxLinesStep({ cart_or_cart_id: cart.id }), + refreshPaymentCollectionForCartStep({ + cart_id: cart.id, + }) + ) return cart } diff --git a/packages/core/core-flows/src/definition/cart/workflows/refresh-payment-collection.ts b/packages/core/core-flows/src/definition/cart/workflows/refresh-payment-collection.ts index e20bdf740c..809b44b0c7 100644 --- a/packages/core/core-flows/src/definition/cart/workflows/refresh-payment-collection.ts +++ b/packages/core/core-flows/src/definition/cart/workflows/refresh-payment-collection.ts @@ -3,6 +3,7 @@ import { WorkflowData, createStep, createWorkflow, + parallelize, transform, } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../../common/steps/use-remote-query" @@ -55,16 +56,17 @@ export const refreshPaymentCollectionForCartWorkflow = createWorkflow( const cart = transform({ carts }, (data) => data.carts[0]) - deletePaymentSessionStep({ - payment_session_id: cart.payment_collection.payment_sessions?.[0].id, - }) - - updatePaymentCollectionStep({ - selector: { id: cart.payment_collection.id }, - update: { - amount: cart.total, - currency_code: cart.currency_code, - }, - }) + parallelize( + deletePaymentSessionStep({ + payment_session_id: cart.payment_collection.payment_sessions?.[0].id, + }), + updatePaymentCollectionStep({ + selector: { id: cart.payment_collection.id }, + update: { + amount: cart.total, + currency_code: cart.currency_code, + }, + }) + ) } ) diff --git a/packages/core/core-flows/src/definition/cart/workflows/update-cart-promotions.ts b/packages/core/core-flows/src/definition/cart/workflows/update-cart-promotions.ts index ebfa13ac43..713f7a21ea 100644 --- a/packages/core/core-flows/src/definition/cart/workflows/update-cart-promotions.ts +++ b/packages/core/core-flows/src/definition/cart/workflows/update-cart-promotions.ts @@ -60,18 +60,16 @@ export const updateCartPromotionsWorkflow = createWorkflow( removeLineItemAdjustmentsStep({ lineItemAdjustmentIdsToRemove }), removeShippingMethodAdjustmentsStep({ shippingMethodAdjustmentIdsToRemove, + }), + createLineItemAdjustmentsStep({ lineItemAdjustmentsToCreate }), + createShippingMethodAdjustmentsStep({ + shippingMethodAdjustmentsToCreate, + }), + updateCartPromotionsStep({ + id: input.cartId, + promo_codes: computedPromotionCodes, + action: PromotionActions.REPLACE, }) ) - - parallelize( - createLineItemAdjustmentsStep({ lineItemAdjustmentsToCreate }), - createShippingMethodAdjustmentsStep({ shippingMethodAdjustmentsToCreate }) - ) - - updateCartPromotionsStep({ - id: input.cartId, - promo_codes: computedPromotionCodes, - action: PromotionActions.REPLACE, - }) } ) diff --git a/packages/core/core-flows/src/definition/cart/workflows/update-cart.ts b/packages/core/core-flows/src/definition/cart/workflows/update-cart.ts index bcc438b7b2..c5eaf0ec61 100644 --- a/packages/core/core-flows/src/definition/cart/workflows/update-cart.ts +++ b/packages/core/core-flows/src/definition/cart/workflows/update-cart.ts @@ -80,16 +80,17 @@ export const updateCartWorkflow = createWorkflow( list: false, }).config({ name: "refetch–cart" }) - refreshCartShippingMethodsStep({ cart }) - updateTaxLinesStep({ cart_or_cart_id: carts[0].id }) - refreshCartPromotionsStep({ - id: input.id, - promo_codes: input.promo_codes, - action: PromotionActions.REPLACE, - }) - - refreshPaymentCollectionForCartStep({ - cart_id: input.id, - }) + parallelize( + refreshCartShippingMethodsStep({ cart }), + updateTaxLinesStep({ cart_or_cart_id: carts[0].id }), + refreshCartPromotionsStep({ + id: input.id, + promo_codes: input.promo_codes, + action: PromotionActions.REPLACE, + }), + refreshPaymentCollectionForCartStep({ + cart_id: input.id, + }) + ) } ) diff --git a/packages/core/core-flows/src/definition/cart/workflows/update-line-item-in-cart.ts b/packages/core/core-flows/src/definition/cart/workflows/update-line-item-in-cart.ts index dfc922e39a..826f9a7b54 100644 --- a/packages/core/core-flows/src/definition/cart/workflows/update-line-item-in-cart.ts +++ b/packages/core/core-flows/src/definition/cart/workflows/update-line-item-in-cart.ts @@ -2,6 +2,7 @@ import { UpdateLineItemInCartWorkflowInputDTO } from "@medusajs/types" import { WorkflowData, createWorkflow, + parallelize, transform, } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../../common/steps/use-remote-query" @@ -86,9 +87,11 @@ export const updateLineItemInCartWorkflow = createWorkflow( list: false, }).config({ name: "refetch–cart" }) - refreshCartShippingMethodsStep({ cart }) - refreshCartPromotionsStep({ id: input.cart.id }) - refreshPaymentCollectionForCartStep({ cart_id: input.cart.id }) + parallelize( + refreshCartShippingMethodsStep({ cart }), + refreshCartPromotionsStep({ id: input.cart.id }), + refreshPaymentCollectionForCartStep({ cart_id: input.cart.id }) + ) const updatedItem = transform({ result }, (data) => data.result?.[0]) 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 b9972d6305..d70ccada36 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,6 +5,7 @@ import { WorkflowData, createStep, createWorkflow, + parallelize, transform, } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../common" @@ -125,24 +126,26 @@ export const cancelOrderFulfillmentWorkflow = createWorkflow( return order.fulfillments.find((f) => f.id === input.fulfillment_id)! }) - cancelFulfillmentWorkflow.runAsStep({ - input: { - id: input.fulfillment_id, - }, - }) - const cancelOrderFulfillmentData = transform( { order, fulfillment }, prepareCancelOrderFulfillmentData ) - cancelOrderFulfillmentStep(cancelOrderFulfillmentData) - const { inventoryAdjustment } = transform( { order, fulfillment }, prepareInventoryUpdate ) - adjustInventoryLevelsStep(inventoryAdjustment) + parallelize( + cancelOrderFulfillmentStep(cancelOrderFulfillmentData), + adjustInventoryLevelsStep(inventoryAdjustment) + ) + + // last step because there is no compensation for this step + cancelFulfillmentWorkflow.runAsStep({ + input: { + id: input.fulfillment_id, + }, + }) } ) 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 f82c450efe..3ee16356ab 100644 --- a/packages/core/core-flows/src/order/workflows/cancel-order.ts +++ b/packages/core/core-flows/src/order/workflows/cancel-order.ts @@ -9,6 +9,7 @@ import { WorkflowData, createStep, createWorkflow, + parallelize, transform, } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../common" @@ -112,7 +113,6 @@ export const cancelOrderWorkflow = createWorkflow( const lineItemIds = transform({ order }, ({ order }) => { return order.items?.map((i) => i.id) }) - deleteReservationsByLineItemsStep(lineItemIds) const paymentIds = transform({ order }, ({ order }) => { return deepFlatMap( @@ -123,8 +123,11 @@ export const cancelOrderWorkflow = createWorkflow( } ) }) - cancelPaymentStep({ paymentIds }) - cancelOrdersStep({ orderIds: [order.id] }) + parallelize( + deleteReservationsByLineItemsStep(lineItemIds), + cancelPaymentStep({ paymentIds }), + cancelOrdersStep({ orderIds: [order.id] }) + ) } ) 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 d05375aaae..b5058a54eb 100644 --- a/packages/core/core-flows/src/order/workflows/create-fulfillment.ts +++ b/packages/core/core-flows/src/order/workflows/create-fulfillment.ts @@ -261,8 +261,6 @@ export const createOrderFulfillmentWorkflow = createWorkflow( prepareRegisterOrderFulfillmentData ) - registerOrderFulfillmentStep(registerOrderFulfillmentData) - const link = transform( { order_id: input.order_id, fulfillment }, (data) => { @@ -274,7 +272,6 @@ export const createOrderFulfillmentWorkflow = createWorkflow( ] } ) - createRemoteLinkStep(link) const { toDelete, toUpdate, inventoryAdjustment } = transform( { order, reservations, input }, @@ -282,6 +279,8 @@ export const createOrderFulfillmentWorkflow = createWorkflow( ) parallelize( + registerOrderFulfillmentStep(registerOrderFulfillmentData), + createRemoteLinkStep(link), updateReservationsStep(toUpdate), deleteReservationsStep(toDelete), adjustInventoryLevelsStep(inventoryAdjustment) diff --git a/packages/core/core-flows/src/order/workflows/create-return.ts b/packages/core/core-flows/src/order/workflows/create-return.ts index fc75fe272d..9d4b451ec0 100644 --- a/packages/core/core-flows/src/order/workflows/create-return.ts +++ b/packages/core/core-flows/src/order/workflows/create-return.ts @@ -19,6 +19,7 @@ import { WorkflowData, createStep, createWorkflow, + parallelize, transform, } from "@medusajs/workflows-sdk" import { createRemoteLinkStep, useRemoteQueryStep } from "../../common" @@ -295,18 +296,6 @@ export const createReturnOrderWorkflow = createWorkflow( prepareShippingMethodData ) - createReturnStep({ - order_id: input.order_id, - items: input.items, - shipping_method: shippingMethodData, - created_by: input.created_by, - }) - - updateOrderTaxLinesStep({ - order_id: input.order_id, - shipping_methods: [shippingMethodData as any], // The types does not seems correct in that step and expect too many things compared to the actual needs - }) - const fulfillmentData = transform( { order, input, returnShippingOption }, prepareFulfillmentData @@ -326,6 +315,19 @@ export const createReturnOrderWorkflow = createWorkflow( ] } ) - createRemoteLinkStep(link) + + parallelize( + createReturnStep({ + order_id: input.order_id, + items: input.items, + shipping_method: shippingMethodData, + created_by: input.created_by, + }), + updateOrderTaxLinesStep({ + order_id: input.order_id, + shipping_methods: [shippingMethodData as any], // The types does not seems correct in that step and expect too many things compared to the actual needs + }), + createRemoteLinkStep(link) + ) } ) diff --git a/packages/core/core-flows/src/order/workflows/create-shipment.ts b/packages/core/core-flows/src/order/workflows/create-shipment.ts index f3f1885b92..aa6ddb8402 100644 --- a/packages/core/core-flows/src/order/workflows/create-shipment.ts +++ b/packages/core/core-flows/src/order/workflows/create-shipment.ts @@ -4,6 +4,7 @@ import { WorkflowData, createStep, createWorkflow, + parallelize, transform, } from "@medusajs/workflows-sdk" import { useRemoteQueryStep } from "../../common" @@ -95,15 +96,16 @@ export const createOrderShipmentWorkflow = createWorkflow( } }) - createShipmentWorkflow.runAsStep({ - input: fulfillmentData, - }) - const shipmentData = transform( { order, input }, prepareRegisterShipmentData ) - registerOrderShipmentStep(shipmentData) + parallelize( + createShipmentWorkflow.runAsStep({ + input: fulfillmentData, + }), + registerOrderShipmentStep(shipmentData) + ) } ) diff --git a/packages/core/core-flows/src/product/workflows/delete-products.ts b/packages/core/core-flows/src/product/workflows/delete-products.ts index 5c70f6dacd..68318c4550 100644 --- a/packages/core/core-flows/src/product/workflows/delete-products.ts +++ b/packages/core/core-flows/src/product/workflows/delete-products.ts @@ -1,12 +1,13 @@ +import { Modules } from "@medusajs/modules-sdk" import { WorkflowData, createWorkflow, + parallelize, transform, } from "@medusajs/workflows-sdk" -import { Modules } from "@medusajs/modules-sdk" +import { removeRemoteLinkStep } from "../../common" import { deleteProductsStep } from "../steps/delete-products" import { getProductsStep } from "../steps/get-products" -import { removeRemoteLinkStep } from "../../common" type WorkflowInput = { ids: string[] } @@ -21,14 +22,16 @@ export const deleteProductsWorkflow = createWorkflow( .map((variant) => variant.id) }) - removeRemoteLinkStep({ - [Modules.PRODUCT]: { variant_id: variantsToBeDeleted }, - }).config({ name: "remove-variant-link-step" }) + const [, deletedProduct] = parallelize( + removeRemoteLinkStep({ + [Modules.PRODUCT]: { + variant_id: variantsToBeDeleted, + product_id: input.ids, + }, + }).config({ name: "remove-product-variant-link-step" }), + deleteProductsStep(input.ids) + ) - removeRemoteLinkStep({ - [Modules.PRODUCT]: { product_id: input.ids }, - }).config({ name: "remove-product-link-step" }) - - return deleteProductsStep(input.ids) + return deletedProduct } ) diff --git a/packages/core/core-flows/src/product/workflows/update-products.ts b/packages/core/core-flows/src/product/workflows/update-products.ts index 67ba29ebbe..830deff8b5 100644 --- a/packages/core/core-flows/src/product/workflows/update-products.ts +++ b/packages/core/core-flows/src/product/workflows/update-products.ts @@ -166,13 +166,13 @@ export const updateProductsWorkflow = createWorkflow( const toDeleteLinks = transform({ currentLinks }, prepareToDeleteLinks) - dismissRemoteLinkStep(toDeleteLinks) - const salesChannelLinks = transform( { input, updatedProducts }, prepareSalesChannelLinks ) + dismissRemoteLinkStep(toDeleteLinks) + createRemoteLinkStep(salesChannelLinks) return updatedProducts diff --git a/packages/core/core-flows/src/promotion/workflows/add-or-remove-campaign-promotions.ts b/packages/core/core-flows/src/promotion/workflows/add-or-remove-campaign-promotions.ts index adb34649c6..154fe48d98 100644 --- a/packages/core/core-flows/src/promotion/workflows/add-or-remove-campaign-promotions.ts +++ b/packages/core/core-flows/src/promotion/workflows/add-or-remove-campaign-promotions.ts @@ -1,5 +1,9 @@ import { LinkWorkflowInput } from "@medusajs/types" -import { WorkflowData, createWorkflow } from "@medusajs/workflows-sdk" +import { + WorkflowData, + createWorkflow, + parallelize, +} from "@medusajs/workflows-sdk" import { addCampaignPromotionsStep, removeCampaignPromotionsStep, @@ -10,7 +14,9 @@ export const addOrRemoveCampaignPromotionsWorkflowId = export const addOrRemoveCampaignPromotionsWorkflow = createWorkflow( addOrRemoveCampaignPromotionsWorkflowId, (input: WorkflowData): WorkflowData => { - addCampaignPromotionsStep(input) - removeCampaignPromotionsStep(input) + parallelize( + addCampaignPromotionsStep(input), + removeCampaignPromotionsStep(input) + ) } )