fix(medusa, workflows): Create product workflow with Isolated modules + module registration (#5081)
* fix(medusa, workflows): Isolated modules * Create polite-kangaroos-rhyme.md * finalise * naming
This commit is contained in:
committed by
GitHub
parent
89735aa425
commit
202049f8aa
6
.changeset/polite-kangaroos-rhyme.md
Normal file
6
.changeset/polite-kangaroos-rhyme.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
"@medusajs/medusa": patch
|
||||||
|
"@medusajs/workflows": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix(medusa, workflows): Create product workflow with Isolated modules + module registration
|
||||||
@@ -8,7 +8,11 @@ import {
|
|||||||
IsString,
|
IsString,
|
||||||
ValidateNested,
|
ValidateNested,
|
||||||
} from "class-validator"
|
} from "class-validator"
|
||||||
import { defaultAdminProductFields, defaultAdminProductRelations } from "."
|
import {
|
||||||
|
defaultAdminProductFields,
|
||||||
|
defaultAdminProductRelations,
|
||||||
|
defaultAdminProductRemoteQueryObject,
|
||||||
|
} from "."
|
||||||
import {
|
import {
|
||||||
PricingService,
|
PricingService,
|
||||||
ProductService,
|
ProductService,
|
||||||
@@ -43,6 +47,7 @@ import { ProductStatus } from "../../../../models"
|
|||||||
import { Logger } from "../../../../types/global"
|
import { Logger } from "../../../../types/global"
|
||||||
import { validator } from "../../../../utils"
|
import { validator } from "../../../../utils"
|
||||||
import { FeatureFlagDecorators } from "../../../../utils/feature-flag-decorators"
|
import { FeatureFlagDecorators } from "../../../../utils/feature-flag-decorators"
|
||||||
|
import IsolateProductDomainFeatureFlag from "../../../../loaders/feature-flags/isolate-product-domain"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @oas [post] /admin/products
|
* @oas [post] /admin/products
|
||||||
@@ -259,16 +264,41 @@ export default async (req, res) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const rawProduct = await productService.retrieve(product.id, {
|
let rawProduct
|
||||||
select: defaultAdminProductFields,
|
if (featureFlagRouter.isFeatureEnabled(IsolateProductDomainFeatureFlag.key)) {
|
||||||
relations: defaultAdminProductRelations,
|
rawProduct = await getProductWithIsolatedProductModule(req, product.id)
|
||||||
})
|
} else {
|
||||||
|
rawProduct = await productService.retrieve(product.id, {
|
||||||
|
select: defaultAdminProductFields,
|
||||||
|
relations: defaultAdminProductRelations,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const [pricedProduct] = await pricingService.setProductPrices([rawProduct])
|
const [pricedProduct] = await pricingService.setProductPrices([rawProduct])
|
||||||
|
|
||||||
res.json({ product: pricedProduct })
|
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 {
|
class ProductVariantOptionReq {
|
||||||
@IsString()
|
@IsString()
|
||||||
value: string
|
value: string
|
||||||
|
|||||||
@@ -138,6 +138,95 @@ export const defaultAdminProductFields: (keyof Product)[] = [
|
|||||||
|
|
||||||
export const defaultAdminGetProductsVariantsFields = ["id", "product_id"]
|
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
|
* @schema AdminProductsDeleteOptionRes
|
||||||
* type: object
|
* type: object
|
||||||
|
|||||||
@@ -230,7 +230,7 @@ export default async ({
|
|||||||
if (featureFlagRouter.isFeatureEnabled(IsolateProductDomainFeatureFlag.key)) {
|
if (featureFlagRouter.isFeatureEnabled(IsolateProductDomainFeatureFlag.key)) {
|
||||||
mergeModulesConfig(configModule.modules ?? {}, modulesConfig)
|
mergeModulesConfig(configModule.modules ?? {}, modulesConfig)
|
||||||
|
|
||||||
const { query } = await MedusaApp({
|
const { query, modules } = await MedusaApp({
|
||||||
modulesConfig,
|
modulesConfig,
|
||||||
servicesConfig: joinerConfig,
|
servicesConfig: joinerConfig,
|
||||||
remoteFetchData: remoteQueryFetchData(container),
|
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))
|
container.register("remoteQuery", asValue(query))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import { MODULE_DEFINITIONS, ModulesDefinition } from "../definitions"
|
|||||||
* @param modules
|
* @param modules
|
||||||
* @param isolatedModules Will be removed once the isolated flag is being removed
|
* @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 = (
|
export const registerModules = (
|
||||||
modules?: Record<
|
modules?: Record<
|
||||||
string,
|
string,
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ export async function attachInventoryItems({
|
|||||||
.resolve("productVariantInventoryService")
|
.resolve("productVariantInventoryService")
|
||||||
.withTransaction(manager)
|
.withTransaction(manager)
|
||||||
|
|
||||||
if (!data?.inventoryItems.length) {
|
if (!data?.inventoryItems?.length) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user