feat(product, pricing, utils): Transaction issues and reference issues (#5533)

* feat(product, pricing, utils): Transaction issues and reference issues

* fixes decorators

* cleanup

* fix product module upsert

* fix missing active manager

* increase timeout

* revert package.json

* WIP

* try another node version based on findings with memory issues with jest introduced after 16.11 but fixed in 21

* re add bail

* fix variant options

* chore: bulk create pricing

* chore: workflow bulk

* Create big-chefs-dream.md

* fix missing update for upserty

* Add integration tests for product options upsert

* rm unnecessary return

* fix product prices workflow issue

* cleanup

* fix flag

* fix model

---------

Co-authored-by: Carlos R. L. Rodrigues <37986729+carlos-r-l-rodrigues@users.noreply.github.com>
Co-authored-by: Carlos R. L. Rodrigues <rodrigolr@gmail.com>
Co-authored-by: Riqwan Thamir <rmthamir@gmail.com>
This commit is contained in:
Adrien de Peretti
2023-11-06 12:24:29 +01:00
committed by GitHub
parent 57c3a24ad3
commit f88d75b0a7
47 changed files with 624 additions and 475 deletions

View File

@@ -2,6 +2,7 @@ import { ProductTypes, WorkflowTypes } from "@medusajs/types"
import { MedusaError } from "@medusajs/utils"
import { WorkflowArguments } from "../../helper"
import { ModuleRegistrationName } from "@medusajs/modules-sdk"
type ProductHandle = string
type VariantIndexAndPrices = {
@@ -37,6 +38,8 @@ export async function updateProductsVariantsPrices({
products.map((p) => [p.handle!, p])
)
const regionIds = new Set()
for (const mapData of productsHandleVariantsIndexPricesMap.entries()) {
const [handle, variantData] = mapData
@@ -55,9 +58,10 @@ export async function updateProductsVariantsPrices({
prices: item.prices,
})
variantPricesMap.set(variant.id, [])
const prices: any[] = []
variantPricesMap.set(variant.id, prices)
item.prices.forEach(async (price) => {
item.prices.forEach((price) => {
const obj = {
amount: price.amount,
currency_code: price.currency_code,
@@ -65,38 +69,59 @@ export async function updateProductsVariantsPrices({
}
if (price.region_id) {
const region = await regionService.retrieve(price.region_id)
obj.currency_code = region.currency_code
obj.rules = {
region_id: price.region_id,
}
regionIds.add(price.region_id)
;(obj as any).region_id = price.region_id
}
const variantPrices = variantPricesMap.get(variant.id)
variantPrices?.push(obj)
prices.push(obj)
})
})
}
if (featureFlagRouter.isFeatureEnabled("isolate_pricing_domain")) {
const remoteLink = container.resolve("remoteLink")
const pricingModuleService = container.resolve("pricingModuleService")
if (regionIds.size) {
const regions = await regionService.list({
id: [...regionIds],
})
const regionMap = new Map<string, any>(regions.map((r) => [r.id, r]))
for (let { variantId } of variantIdsPricesData) {
const priceSet = await pricingModuleService.create({
rules: [{ rule_attribute: "region_id" }],
prices: variantPricesMap.get(variantId),
})
for (const [, prices] of variantPricesMap.entries()) {
prices.forEach((price) => {
if (price.region_id) {
const region = regionMap.get(price.region_id)
price.currency_code = region?.currency_code
price.rules = {
region_id: price.region_id,
}
await remoteLink.create({
productService: {
variant_id: variantId,
},
pricingService: {
price_set_id: priceSet.id,
},
delete price.region_id
}
})
}
}
if (featureFlagRouter.isFeatureEnabled("isolate_pricing_domain")) {
const remoteLink = container.resolve("remoteLink")
const pricingModuleService = container.resolve(
ModuleRegistrationName.PRICING
)
const priceSetsToCreate = variantIdsPricesData.map(({ variantId }) => ({
rules: [{ rule_attribute: "region_id" }],
prices: variantPricesMap.get(variantId),
}))
const priceSets = await pricingModuleService.create(priceSetsToCreate)
const links = priceSets.map((priceSet, index) => ({
productService: {
variant_id: variantIdsPricesData[index].variantId,
},
pricingService: {
price_set_id: priceSet.id,
},
}))
await remoteLink.create(links)
} else {
await productVariantServiceTx.updateVariantPrices(variantIdsPricesData)
}