From 3f661c917bbae7bdf5524f96cd3c628820fed9d8 Mon Sep 17 00:00:00 2001 From: Oli Juhl <59018053+olivermrbl@users.noreply.github.com> Date: Sun, 9 Jun 2024 12:31:28 +0200 Subject: [PATCH] feat: Fix subscribers loading + add order <> cart link (#7617) --- .../cart/workflows/complete-cart.ts | 24 ++++---- .../core/core-flows/src/order/steps/index.ts | 1 - .../steps/link-order-payment-collection.ts | 42 ------------- packages/core/utils/src/link/links.ts | 6 ++ .../api/store/carts/[id]/complete/route.ts | 2 +- .../src/loaders/helpers/subscribers/index.ts | 3 +- packages/medusa/src/loaders/index.ts | 25 +++----- .../link-modules/src/definitions/index.ts | 5 +- .../src/definitions/order-cart.ts | 61 +++++++++++++++++++ .../src/services/workflow-orchestrator.ts | 6 +- 10 files changed, 99 insertions(+), 76 deletions(-) delete mode 100644 packages/core/core-flows/src/order/steps/link-order-payment-collection.ts create mode 100644 packages/modules/link-modules/src/definitions/order-cart.ts 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 5ed2e74ec6..46a0369e92 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,12 @@ import { OrderDTO } from "@medusajs/types" +import { Modules } from "@medusajs/utils" import { WorkflowData, createWorkflow, parallelize, transform, } from "@medusajs/workflows-sdk" -import { useRemoteQueryStep } from "../../../common" -import { linkOrderAndPaymentCollectionsStep } from "../../../order/steps" +import { createRemoteLinkStep, useRemoteQueryStep } from "../../../common" import { authorizePaymentSessionStep } from "../../../payment/steps/authorize-payment-session" import { createOrderFromCartStep, validateCartPaymentsStep } from "../steps" import { reserveInventoryStep } from "../steps/reserve-inventory" @@ -75,16 +75,18 @@ export const completeCartWorkflow = createWorkflow( const order = createOrderFromCartStep({ cart: finalCart }) - const linkOrderPaymentCollection = transform({ order, cart }, (data) => ({ - links: [ - { - order_id: data.order.id, - payment_collection_id: data.cart.payment_collection.id, + createRemoteLinkStep([ + { + [Modules.ORDER]: { order_id: order.id }, + [Modules.CART]: { cart_id: finalCart.id }, + }, + { + [Modules.ORDER]: { order_id: order.id }, + [Modules.PAYMENT]: { + payment_collection_id: cart.payment_collection.id, }, - ], - })) - - linkOrderAndPaymentCollectionsStep(linkOrderPaymentCollection) + }, + ]) return order } diff --git a/packages/core/core-flows/src/order/steps/index.ts b/packages/core/core-flows/src/order/steps/index.ts index 3a86d0b78b..35a039dbe5 100644 --- a/packages/core/core-flows/src/order/steps/index.ts +++ b/packages/core/core-flows/src/order/steps/index.ts @@ -3,7 +3,6 @@ export * from "./cancel-orders" export * from "./complete-orders" export * from "./create-orders" export * from "./get-item-tax-lines" -export * from "./link-order-payment-collection" export * from "./register-fulfillment" export * from "./register-shipment" export * from "./set-tax-lines-for-items" diff --git a/packages/core/core-flows/src/order/steps/link-order-payment-collection.ts b/packages/core/core-flows/src/order/steps/link-order-payment-collection.ts deleted file mode 100644 index 88df681e77..0000000000 --- a/packages/core/core-flows/src/order/steps/link-order-payment-collection.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Modules } from "@medusajs/modules-sdk" -import { ContainerRegistrationKeys } from "@medusajs/utils" -import { StepResponse, createStep } from "@medusajs/workflows-sdk" - -type StepInput = { - links: { - order_id: string - payment_collection_id: string - }[] -} - -export const linkOrderAndPaymentCollectionsStepId = - "link-order-payment-collection" -export const linkOrderAndPaymentCollectionsStep = createStep( - linkOrderAndPaymentCollectionsStepId, - async (data: StepInput, { container }) => { - const remoteLink = container.resolve(ContainerRegistrationKeys.REMOTE_LINK) - - const links = data.links.map((d) => ({ - [Modules.ORDER]: { order_id: d.order_id }, - [Modules.PAYMENT]: { payment_collection_id: d.payment_collection_id }, - })) - - await remoteLink.create(links) - - return new StepResponse(void 0, data) - }, - async (data, { container }) => { - if (!data) { - return - } - - const remoteLink = container.resolve(ContainerRegistrationKeys.REMOTE_LINK) - - const links = data.links.map((d) => ({ - [Modules.ORDER]: { order_id: d.order_id }, - [Modules.PAYMENT]: { payment_collection_id: d.payment_collection_id }, - })) - - await remoteLink.dismiss(links) - } -) diff --git a/packages/core/utils/src/link/links.ts b/packages/core/utils/src/link/links.ts index 1e4d3cec66..76205e427c 100644 --- a/packages/core/utils/src/link/links.ts +++ b/packages/core/utils/src/link/links.ts @@ -56,6 +56,12 @@ export const LINKS = { Modules.PROMOTION, "promotion_id" ), + OrderCart: composeLinkName( + Modules.ORDER, + "order_id", + Modules.CART, + "cart_id" + ), OrderSalesChannel: composeLinkName( Modules.ORDER, "order_id", diff --git a/packages/medusa/src/api/store/carts/[id]/complete/route.ts b/packages/medusa/src/api/store/carts/[id]/complete/route.ts index 3604c56015..3728f1b3c0 100644 --- a/packages/medusa/src/api/store/carts/[id]/complete/route.ts +++ b/packages/medusa/src/api/store/carts/[id]/complete/route.ts @@ -1,11 +1,11 @@ import { completeCartWorkflow } from "@medusajs/core-flows" import { MedusaError } from "@medusajs/utils" import { MedusaRequest, MedusaResponse } from "../../../../../types/routing" +import { prepareRetrieveQuery } from "../../../../../utils/get-query-config" import { refetchOrder } from "../../../orders/helpers" import { refetchCart } from "../../helpers" import { defaultStoreCartFields } from "../../query-config" import { StoreCompleteCartType } from "../../validators" -import { prepareRetrieveQuery } from "../../../../../utils/get-query-config" export const POST = async ( req: MedusaRequest, diff --git a/packages/medusa/src/loaders/helpers/subscribers/index.ts b/packages/medusa/src/loaders/helpers/subscribers/index.ts index dea12a2b32..7035917aba 100644 --- a/packages/medusa/src/loaders/helpers/subscribers/index.ts +++ b/packages/medusa/src/loaders/helpers/subscribers/index.ts @@ -24,7 +24,7 @@ export class SubscriberLoader { protected rootDir_: string protected excludes: RegExp[] = [ /\.DS_Store/, - /(\.ts\.map|\.js\.map|\.d\.ts)/, + /(\.ts\.map|\.js\.map|\.d\.ts|\.md)/, /^_[^/\\]*(\.[^/\\]+)?$/, ] @@ -216,6 +216,7 @@ export class SubscriberLoader { await readdir(this.rootDir_) hasSubscriberDir = true } catch (err) { + logger.debug(`No subscriber directory found in ${this.rootDir_}`) hasSubscriberDir = false } diff --git a/packages/medusa/src/loaders/index.ts b/packages/medusa/src/loaders/index.ts index 571662b746..841cb43f22 100644 --- a/packages/medusa/src/loaders/index.ts +++ b/packages/medusa/src/loaders/index.ts @@ -1,10 +1,12 @@ import { createDefaultsWorkflow } from "@medusajs/core-flows" import { ConfigModule, MedusaContainer, PluginDetails } from "@medusajs/types" -import { ContainerRegistrationKeys, promiseAll } from "@medusajs/utils" +import { + ContainerRegistrationKeys, + createMedusaContainer, + promiseAll, +} from "@medusajs/utils" import { asValue } from "awilix" import { Express, NextFunction, Request, Response } from "express" -import glob from "glob" -import { createMedusaContainer } from "@medusajs/utils" import path from "path" import requestIp from "request-ip" import { v4 } from "uuid" @@ -15,11 +17,11 @@ import expressLoader from "./express" import featureFlagsLoader from "./feature-flags" import { registerWorkflows } from "./helpers/register-workflows" import { getResolvedPlugins } from "./helpers/resolve-plugins" +import { resolvePluginsLinks } from "./helpers/resolve-plugins-links" import { SubscriberLoader } from "./helpers/subscribers" import Logger from "./logger" import loadMedusaApp from "./medusa-app" import registerPgConnection from "./pg-connection" -import { resolvePluginsLinks } from "./helpers/resolve-plugins-links" type Options = { directory: string @@ -47,17 +49,10 @@ async function subscribersLoader( */ await Promise.all( plugins.map(async (pluginDetails) => { - const files = glob.sync( - `${pluginDetails.resolve}/subscribers/*.{ts,js,mjs,mts}`, - { - ignore: ["**/*.d.ts", "**/*.map"], - } - ) - return await Promise.all( - files.map( - async (file) => await new SubscriberLoader(file, container).load() - ) - ) + await new SubscriberLoader( + path.join(pluginDetails.resolve, "subscribers"), + container + ).load() }) ) } diff --git a/packages/modules/link-modules/src/definitions/index.ts b/packages/modules/link-modules/src/definitions/index.ts index 7e18ca07c3..8a4019d318 100644 --- a/packages/modules/link-modules/src/definitions/index.ts +++ b/packages/modules/link-modules/src/definitions/index.ts @@ -1,6 +1,8 @@ export * from "./cart-payment-collection" export * from "./cart-promotion" export * from "./fulfillment-set-location" +export * from "./order-cart" +export * from "./order-fulfillment" export * from "./order-payment-collection" export * from "./order-promotion" export * from "./product-sales-channel" @@ -8,8 +10,7 @@ export * from "./product-variant-inventory-item" export * from "./product-variant-price-set" export * from "./publishable-api-key-sales-channel" export * from "./readonly" -export * from "./order-fulfillment" export * from "./region-payment-provider" export * from "./sales-channel-location" export * from "./shipping-option-price-set" -export * from "./order-fulfillment" + diff --git a/packages/modules/link-modules/src/definitions/order-cart.ts b/packages/modules/link-modules/src/definitions/order-cart.ts new file mode 100644 index 0000000000..f48dce4380 --- /dev/null +++ b/packages/modules/link-modules/src/definitions/order-cart.ts @@ -0,0 +1,61 @@ +import { Modules } from "@medusajs/modules-sdk" +import { ModuleJoinerConfig } from "@medusajs/types" +import { LINKS } from "@medusajs/utils" + +export const OrderCart: ModuleJoinerConfig = { + serviceName: LINKS.OrderCart, + isLink: true, + databaseConfig: { + tableName: "order_cart", + idPrefix: "ordercart", + }, + alias: [ + { + name: ["order_cart", "order_carts"], + args: { + entity: "LinkOrderCart", + }, + }, + ], + primaryKeys: ["id", "order_id", "cart_id"], + relationships: [ + { + serviceName: Modules.ORDER, + primaryKey: "id", + foreignKey: "order_id", + alias: "order", + }, + { + serviceName: Modules.CART, + primaryKey: "id", + foreignKey: "cart_id", + alias: "cart", + }, + ], + extends: [ + { + serviceName: Modules.ORDER, + fieldAlias: { + cart: "cart_link.cart", + }, + relationship: { + serviceName: LINKS.OrderCart, + primaryKey: "order_id", + foreignKey: "id", + alias: "cart_link", + }, + }, + { + serviceName: Modules.CART, + fieldAlias: { + order: "order_link.order", + }, + relationship: { + serviceName: LINKS.OrderCart, + primaryKey: "cart_id", + foreignKey: "id", + alias: "order_link", + }, + }, + ], +} diff --git a/packages/modules/workflow-engine-inmemory/src/services/workflow-orchestrator.ts b/packages/modules/workflow-engine-inmemory/src/services/workflow-orchestrator.ts index 6ff48acaf0..1fc90daee5 100644 --- a/packages/modules/workflow-engine-inmemory/src/services/workflow-orchestrator.ts +++ b/packages/modules/workflow-engine-inmemory/src/services/workflow-orchestrator.ts @@ -5,12 +5,12 @@ import { TransactionStep, } from "@medusajs/orchestration" import { ContainerLike, Context, MedusaContainer } from "@medusajs/types" -import { InjectSharedContext, isString, MedusaContext } from "@medusajs/utils" +import { InjectSharedContext, MedusaContext, isString } from "@medusajs/utils" import { - type FlowRunOptions, MedusaWorkflow, - resolveValue, ReturnWorkflow, + resolveValue, + type FlowRunOptions, } from "@medusajs/workflows-sdk" import { ulid } from "ulid" import { InMemoryDistributedTransactionStorage } from "../utils"