@medusajs/medusa
Version:
Building blocks for digital commerce
172 lines • 6.83 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildBatchVariantInventoryData = exports.refetchBatchVariants = exports.refetchBatchProducts = exports.refetchVariant = exports.buildRules = exports.remapVariantResponse = exports.remapProductResponse = exports.remapKeysForVariant = exports.remapKeysForProduct = void 0;
const utils_1 = require("@medusajs/framework/utils");
const isPricing = (fieldName) => fieldName.startsWith("variants.prices") ||
fieldName.startsWith("*variants.prices") ||
fieldName.startsWith("prices") ||
fieldName.startsWith("*prices");
// The variant had prices before, but that is not part of the price_set money amounts. Do we remap the request and response or not?
const remapKeysForProduct = (selectFields) => {
const productFields = selectFields.filter((fieldName) => !isPricing(fieldName));
const pricingFields = selectFields
.filter((fieldName) => isPricing(fieldName))
.map((fieldName) => fieldName.replace("variants.prices.", "variants.price_set.prices."));
return [...productFields, ...pricingFields];
};
exports.remapKeysForProduct = remapKeysForProduct;
const remapKeysForVariant = (selectFields) => {
const variantFields = selectFields.filter((fieldName) => !isPricing(fieldName));
const pricingFields = selectFields
.filter((fieldName) => isPricing(fieldName))
.map((fieldName) => fieldName.replace("prices.", "price_set.prices."));
return [...variantFields, ...pricingFields];
};
exports.remapKeysForVariant = remapKeysForVariant;
const remapProductResponse = (product) => {
return {
...product,
variants: product.variants?.map(exports.remapVariantResponse),
// TODO: Remove any once all typings are cleaned up
};
};
exports.remapProductResponse = remapProductResponse;
const remapVariantResponse = (variant) => {
if (!variant) {
return variant;
}
const resp = {
...variant,
prices: variant.price_set?.prices?.map((price) => ({
id: price.id,
amount: price.amount,
currency_code: price.currency_code,
min_quantity: price.min_quantity,
max_quantity: price.max_quantity,
variant_id: variant.id,
created_at: price.created_at,
updated_at: price.updated_at,
rules: (0, exports.buildRules)(price),
})),
};
delete resp.price_set;
// TODO: Remove any once all typings are cleaned up
return resp;
};
exports.remapVariantResponse = remapVariantResponse;
const buildRules = (price) => {
const rules = {};
for (const priceRule of price.price_rules || []) {
const ruleAttribute = priceRule.attribute;
if (ruleAttribute) {
rules[ruleAttribute] = priceRule.value;
}
}
return rules;
};
exports.buildRules = buildRules;
const refetchVariant = async (variantId, scope, fields) => {
const remoteQuery = scope.resolve(utils_1.ContainerRegistrationKeys.REMOTE_QUERY);
const queryObject = (0, utils_1.remoteQueryObjectFromString)({
entryPoint: "product_variant",
variables: {
filters: { id: variantId },
},
fields: (0, exports.remapKeysForVariant)(fields ?? []),
});
const [variant] = await remoteQuery(queryObject);
return (0, exports.remapVariantResponse)(variant);
};
exports.refetchVariant = refetchVariant;
const refetchBatchProducts = async (batchResult, scope, fields) => {
const remoteQuery = scope.resolve(utils_1.ContainerRegistrationKeys.REMOTE_QUERY);
let created = Promise.resolve([]);
let updated = Promise.resolve([]);
if (batchResult.created.length) {
const createdQuery = (0, utils_1.remoteQueryObjectFromString)({
entryPoint: "product",
variables: {
filters: { id: batchResult.created.map((p) => p.id) },
},
fields: (0, exports.remapKeysForProduct)(fields ?? []),
});
created = remoteQuery(createdQuery);
}
if (batchResult.updated.length) {
const updatedQuery = (0, utils_1.remoteQueryObjectFromString)({
entryPoint: "product",
variables: {
filters: { id: batchResult.updated.map((p) => p.id) },
},
fields: (0, exports.remapKeysForProduct)(fields ?? []),
});
updated = remoteQuery(updatedQuery);
}
const [createdRes, updatedRes] = await (0, utils_1.promiseAll)([created, updated]);
return {
created: createdRes,
updated: updatedRes,
deleted: {
ids: batchResult.deleted,
object: "product",
deleted: true,
},
};
};
exports.refetchBatchProducts = refetchBatchProducts;
const refetchBatchVariants = async (batchResult, scope, fields) => {
const remoteQuery = scope.resolve(utils_1.ContainerRegistrationKeys.REMOTE_QUERY);
let created = Promise.resolve([]);
let updated = Promise.resolve([]);
if (batchResult.created.length) {
const createdQuery = (0, utils_1.remoteQueryObjectFromString)({
entryPoint: "variant",
variables: {
filters: { id: batchResult.created.map((v) => v.id) },
},
fields: (0, exports.remapKeysForVariant)(fields ?? []),
});
created = remoteQuery(createdQuery);
}
if (batchResult.updated.length) {
const updatedQuery = (0, utils_1.remoteQueryObjectFromString)({
entryPoint: "variant",
variables: {
filters: { id: batchResult.updated.map((v) => v.id) },
},
fields: (0, exports.remapKeysForVariant)(fields ?? []),
});
updated = remoteQuery(updatedQuery);
}
const [createdRes, updatedRes] = await (0, utils_1.promiseAll)([created, updated]);
return {
created: createdRes,
updated: updatedRes,
deleted: {
ids: batchResult.deleted,
object: "variant",
deleted: true,
},
};
};
exports.refetchBatchVariants = refetchBatchVariants;
const buildBatchVariantInventoryData = (inputs) => {
const results = [];
for (const input of inputs || []) {
const result = {
[utils_1.Modules.PRODUCT]: { variant_id: input.variant_id },
[utils_1.Modules.INVENTORY]: {
inventory_item_id: input.inventory_item_id,
},
};
if ("required_quantity" in input) {
result.data = {
required_quantity: input.required_quantity,
};
}
results.push(result);
}
return results;
};
exports.buildBatchVariantInventoryData = buildBatchVariantInventoryData;
//# sourceMappingURL=helpers.js.map
;