From 202049f8aa3682df7e545b1c42ab0bdab1c52639 Mon Sep 17 00:00:00 2001 From: Adrien de Peretti Date: Thu, 21 Sep 2023 17:10:14 +0200 Subject: [PATCH] fix(medusa, workflows): Create product workflow with Isolated modules + module registration (#5081) * fix(medusa, workflows): Isolated modules * Create polite-kangaroos-rhyme.md * finalise * naming --- .changeset/polite-kangaroos-rhyme.md | 6 ++ .../routes/admin/products/create-product.ts | 40 +++++++-- .../src/api/routes/admin/products/index.ts | 89 +++++++++++++++++++ packages/medusa/src/loaders/index.ts | 10 ++- .../src/loaders/register-modules.ts | 1 + .../inventory/attach-inventory-items.ts | 2 +- 6 files changed, 141 insertions(+), 7 deletions(-) create mode 100644 .changeset/polite-kangaroos-rhyme.md diff --git a/.changeset/polite-kangaroos-rhyme.md b/.changeset/polite-kangaroos-rhyme.md new file mode 100644 index 0000000000..15780f5feb --- /dev/null +++ b/.changeset/polite-kangaroos-rhyme.md @@ -0,0 +1,6 @@ +--- +"@medusajs/medusa": patch +"@medusajs/workflows": patch +--- + +fix(medusa, workflows): Create product workflow with Isolated modules + module registration diff --git a/packages/medusa/src/api/routes/admin/products/create-product.ts b/packages/medusa/src/api/routes/admin/products/create-product.ts index 25917963c3..65b084388d 100644 --- a/packages/medusa/src/api/routes/admin/products/create-product.ts +++ b/packages/medusa/src/api/routes/admin/products/create-product.ts @@ -8,7 +8,11 @@ import { IsString, ValidateNested, } from "class-validator" -import { defaultAdminProductFields, defaultAdminProductRelations } from "." +import { + defaultAdminProductFields, + defaultAdminProductRelations, + defaultAdminProductRemoteQueryObject, +} from "." import { PricingService, ProductService, @@ -43,6 +47,7 @@ import { ProductStatus } from "../../../../models" import { Logger } from "../../../../types/global" import { validator } from "../../../../utils" import { FeatureFlagDecorators } from "../../../../utils/feature-flag-decorators" +import IsolateProductDomainFeatureFlag from "../../../../loaders/feature-flags/isolate-product-domain" /** * @oas [post] /admin/products @@ -259,16 +264,41 @@ export default async (req, res) => { }) } - const rawProduct = await productService.retrieve(product.id, { - select: defaultAdminProductFields, - relations: defaultAdminProductRelations, - }) + let rawProduct + if (featureFlagRouter.isFeatureEnabled(IsolateProductDomainFeatureFlag.key)) { + rawProduct = await getProductWithIsolatedProductModule(req, product.id) + } else { + rawProduct = await productService.retrieve(product.id, { + select: defaultAdminProductFields, + relations: defaultAdminProductRelations, + }) + } const [pricedProduct] = await pricingService.setProductPrices([rawProduct]) res.json({ product: pricedProduct }) } +async function getProductWithIsolatedProductModule(req, id) { + // TODO: Add support for fields/expands + const remoteQuery = req.scope.resolve("remoteQuery") + + const variables = { id } + + const query = { + product: { + __args: variables, + ...defaultAdminProductRemoteQueryObject, + }, + } + + const [product] = await remoteQuery(query) + + product.profile_id = product.profile?.id + + return product +} + class ProductVariantOptionReq { @IsString() value: string diff --git a/packages/medusa/src/api/routes/admin/products/index.ts b/packages/medusa/src/api/routes/admin/products/index.ts index 8b40526ab0..1b0f4d6700 100644 --- a/packages/medusa/src/api/routes/admin/products/index.ts +++ b/packages/medusa/src/api/routes/admin/products/index.ts @@ -138,6 +138,95 @@ export const defaultAdminProductFields: (keyof Product)[] = [ export const defaultAdminGetProductsVariantsFields = ["id", "product_id"] +/** + * This is temporary. + */ +export const defaultAdminProductRemoteQueryObject = { + fields: defaultAdminProductFields, + images: { + fields: ["id", "created_at", "updated_at", "deleted_at", "url", "metadata"], + }, + tags: { + fields: ["id", "created_at", "updated_at", "deleted_at", "value"], + }, + + type: { + fields: ["id", "created_at", "updated_at", "deleted_at", "value"], + }, + + collection: { + fields: ["title", "handle", "id", "created_at", "updated_at", "deleted_at"], + }, + + options: { + fields: [ + "id", + "created_at", + "updated_at", + "deleted_at", + "title", + "product_id", + "metadata", + ], + values: { + fields: [ + "id", + "created_at", + "updated_at", + "deleted_at", + "value", + "option_id", + "variant_id", + "metadata", + ], + }, + }, + + variants: { + fields: [ + "id", + "created_at", + "updated_at", + "deleted_at", + "title", + "product_id", + "sku", + "barcode", + "ean", + "upc", + "variant_rank", + "inventory_quantity", + "allow_backorder", + "manage_inventory", + "hs_code", + "origin_country", + "mid_code", + "material", + "weight", + "length", + "height", + "width", + "metadata", + ], + + options: { + fields: [ + "id", + "created_at", + "updated_at", + "deleted_at", + "value", + "option_id", + "variant_id", + "metadata", + ], + }, + }, + profile: { + fields: ["id", "created_at", "updated_at", "deleted_at", "name", "type"], + }, +} + /** * @schema AdminProductsDeleteOptionRes * type: object diff --git a/packages/medusa/src/loaders/index.ts b/packages/medusa/src/loaders/index.ts index 223a012271..e11d71cf23 100644 --- a/packages/medusa/src/loaders/index.ts +++ b/packages/medusa/src/loaders/index.ts @@ -230,7 +230,7 @@ export default async ({ if (featureFlagRouter.isFeatureEnabled(IsolateProductDomainFeatureFlag.key)) { mergeModulesConfig(configModule.modules ?? {}, modulesConfig) - const { query } = await MedusaApp({ + const { query, modules } = await MedusaApp({ modulesConfig, servicesConfig: joinerConfig, remoteFetchData: remoteQueryFetchData(container), @@ -241,6 +241,14 @@ export default async ({ }, }) + // Medusa app load all non legacy modules, so we need to register them in the container since they are into their own container + // We might decide to do it elsewhere but for now I think it is fine + for (const [serviceKey, moduleService] of Object.entries(modules)) { + container.register( + ModulesDefinition[serviceKey].registrationName, + asValue(moduleService) + ) + } container.register("remoteQuery", asValue(query)) } diff --git a/packages/modules-sdk/src/loaders/register-modules.ts b/packages/modules-sdk/src/loaders/register-modules.ts index a1ba16711b..f49ce3c8a1 100644 --- a/packages/modules-sdk/src/loaders/register-modules.ts +++ b/packages/modules-sdk/src/loaders/register-modules.ts @@ -16,6 +16,7 @@ import { MODULE_DEFINITIONS, ModulesDefinition } from "../definitions" * @param modules * @param isolatedModules Will be removed once the isolated flag is being removed */ +// TODO: Remove once we have all modules migrated + rename to something like getResolutions export const registerModules = ( modules?: Record< string, diff --git a/packages/workflows/src/handlers/inventory/attach-inventory-items.ts b/packages/workflows/src/handlers/inventory/attach-inventory-items.ts index b32ff30ef3..45894dbae3 100644 --- a/packages/workflows/src/handlers/inventory/attach-inventory-items.ts +++ b/packages/workflows/src/handlers/inventory/attach-inventory-items.ts @@ -17,7 +17,7 @@ export async function attachInventoryItems({ .resolve("productVariantInventoryService") .withTransaction(manager) - if (!data?.inventoryItems.length) { + if (!data?.inventoryItems?.length) { return }