UNPKG

@medusajs/core-flows

Version:

Set of workflow definitions for Medusa

149 lines 5.57 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.setShippingOptionsPricesStep = exports.setShippingOptionsPricesStepId = void 0; const utils_1 = require("@medusajs/framework/utils"); const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk"); async function getCurrentShippingOptionPrices(shippingOptionIds, { remoteQuery }) { const shippingOptionPrices = (await remoteQuery({ service: utils_1.LINKS.ShippingOptionPriceSet, variables: { filters: { shipping_option_id: shippingOptionIds }, }, fields: ["shipping_option_id", "price_set_id", "price_set.prices.*"], })); return shippingOptionPrices.map((shippingOption) => { const prices = shippingOption.price_set?.prices ?? []; const price_set_id = shippingOption.price_set_id; return { shipping_option_id: shippingOption.shipping_option_id, price_set_id, prices, }; }); } function buildPrices(prices, regionToCurrencyMap) { if (!prices) { return []; } const shippingOptionPrices = prices.map((price) => { const { rules = [] } = price; const additionalRules = {}; for (const rule of rules) { let existingPriceRules = additionalRules[rule.attribute]; if ((0, utils_1.isString)(existingPriceRules)) { continue; } existingPriceRules ||= []; existingPriceRules.push({ operator: rule.operator, value: rule.value, }); additionalRules[rule.attribute] = existingPriceRules; } if ("region_id" in price) { const currency_code = regionToCurrencyMap.get(price.region_id); const regionId = price.region_id; delete price.region_id; return { ...price, currency_code: currency_code, amount: price.amount, rules: { region_id: regionId, ...additionalRules, }, }; } if ("currency_code" in price) { return { ...price, amount: price.amount, rules: { ...additionalRules, }, }; } return price; }); return shippingOptionPrices; } exports.setShippingOptionsPricesStepId = "set-shipping-options-prices-step"; /** * This step sets the prices of one or more shipping options. * * @example * const data = setShippingOptionsPricesStep([ * { * id: "so_123", * prices: [ * { * amount: 1000, * currency_code: "usd", * } * ] * } * ]) */ exports.setShippingOptionsPricesStep = (0, workflows_sdk_1.createStep)(exports.setShippingOptionsPricesStepId, async (data, { container }) => { if (!data.length) { return; } const regionIds = data .map((input) => input.prices) .flat() .filter((price) => "region_id" in (price ?? {})) .map((price) => price.region_id); let regionToCurrencyMap = new Map(); if (regionIds.length) { const regionService = container.resolve(utils_1.Modules.REGION); const regions = await regionService.listRegions({ id: [...new Set(regionIds)], }, { select: ["id", "currency_code"], }); regionToCurrencyMap = new Map(regions.map((region) => [region.id, region.currency_code])); } const remoteQuery = container.resolve(utils_1.ContainerRegistrationKeys.REMOTE_QUERY); const currentShippingOptionPricesData = await getCurrentShippingOptionPrices(data.map((d) => d.id), { remoteQuery }); const shippingOptionPricesMap = new Map(currentShippingOptionPricesData.map((currentShippingOptionDataItem) => { const shippingOptionData = data.find((d) => d.id === currentShippingOptionDataItem.shipping_option_id); const pricesData = shippingOptionData?.prices?.map((priceData) => { return { ...priceData, price_set_id: currentShippingOptionDataItem.price_set_id, }; }); const buildPricesData = pricesData && buildPrices(pricesData, regionToCurrencyMap); return [ currentShippingOptionDataItem.shipping_option_id, { price_set_id: currentShippingOptionDataItem.price_set_id, prices: buildPricesData, }, ]; })); const pricingService = container.resolve(utils_1.Modules.PRICING); for (const data_ of data) { const shippingOptionData = shippingOptionPricesMap.get(data_.id); if (!(0, utils_1.isDefined)(shippingOptionData.prices)) { continue; } await pricingService.updatePriceSets(shippingOptionData.price_set_id, { prices: shippingOptionData.prices, }); } return new workflows_sdk_1.StepResponse(void 0, currentShippingOptionPricesData); }, async (rollbackData, { container }) => { if (!rollbackData?.length) { return; } const pricingService = container.resolve(utils_1.Modules.PRICING); for (const data_ of rollbackData) { const prices = data_.prices; if (!(0, utils_1.isDefined)(prices)) { continue; } await pricingService.updatePriceSets(data_.price_set_id, { prices }); } }); //# sourceMappingURL=set-shipping-options-prices.js.map