@medusajs/core-flows
Version:
Set of workflow definitions for Medusa
128 lines • 5.32 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.setRegionsPaymentProvidersStep = exports.setRegionsPaymentProvidersStepId = void 0;
const utils_1 = require("@medusajs/framework/utils");
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
async function validatePaymentProvidersExists(paymentService, paymentProviderIds) {
const paymentProviders = await paymentService.listPaymentProviders({
id: { $in: paymentProviderIds },
is_enabled: true,
});
const retrievedPaymentProviderIds = paymentProviders.map((p) => p.id);
const missingProviders = (0, utils_1.arrayDifference)(paymentProviderIds, retrievedPaymentProviderIds);
if (missingProviders.length) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Payment providers with ids ${missingProviders.join(", ")} not found or not enabled`);
}
}
async function getCurrentRegionPaymentProvidersLinks(regionIds, { remoteQuery }) {
const regionProviderLinks = (await remoteQuery({
service: utils_1.LINKS.RegionPaymentProvider,
variables: {
filters: { region_id: regionIds },
},
fields: ["region_id", "payment_provider_id"],
}));
return regionProviderLinks.map((region) => {
return {
[utils_1.Modules.REGION]: {
region_id: region.region_id,
},
[utils_1.Modules.PAYMENT]: {
payment_provider_id: region.payment_provider_id,
},
};
});
}
exports.setRegionsPaymentProvidersStepId = "add-region-payment-providers-step";
/**
* This step sets the payment providers available in regions.
*
* @example
* const data = setRegionsPaymentProvidersStep({
* input: [
* {
* id: "reg_123",
* payment_providers: ["pp_system", "pp_stripe_stripe"]
* }
* ]
* })
*/
exports.setRegionsPaymentProvidersStep = (0, workflows_sdk_1.createStep)(exports.setRegionsPaymentProvidersStepId, async (data, { container }) => {
const dataInputToProcess = data.input.filter((inputData) => {
return inputData.payment_providers?.length;
});
if (!dataInputToProcess.length) {
return new workflows_sdk_1.StepResponse(void 0);
}
const paymentService = container.resolve(utils_1.Modules.PAYMENT);
const remoteLink = container.resolve(utils_1.ContainerRegistrationKeys.LINK);
const remoteQuery = container.resolve(utils_1.ContainerRegistrationKeys.REMOTE_QUERY);
const allPaymentProviderIds = dataInputToProcess
.map((inputData) => {
return inputData.payment_providers;
})
.flat();
const uniquePaymentProviderIds = Array.from(new Set(allPaymentProviderIds));
await validatePaymentProvidersExists(paymentService, uniquePaymentProviderIds);
const regionIds = dataInputToProcess.map((inputData) => inputData.id);
const currentExistingLinks = await getCurrentRegionPaymentProvidersLinks(regionIds, { remoteQuery });
const linksToRemove = currentExistingLinks
.filter((existingLink) => {
return !dataInputToProcess.some((input) => {
return (input.id === existingLink[utils_1.Modules.REGION].region_id &&
input.payment_providers.includes(existingLink[utils_1.Modules.PAYMENT].payment_provider_id));
});
})
.map((link) => {
return {
[utils_1.Modules.REGION]: { region_id: link[utils_1.Modules.REGION].region_id },
[utils_1.Modules.PAYMENT]: {
payment_provider_id: link[utils_1.Modules.PAYMENT].payment_provider_id,
},
};
});
const linksToCreate = dataInputToProcess
.map((inputData) => {
return inputData.payment_providers.map((provider) => {
const alreadyExists = currentExistingLinks.some((link) => {
return (link[utils_1.Modules.REGION].region_id === inputData.id &&
link[utils_1.Modules.PAYMENT].payment_provider_id === provider);
});
if (alreadyExists) {
return;
}
return {
[utils_1.Modules.REGION]: { region_id: inputData.id },
[utils_1.Modules.PAYMENT]: { payment_provider_id: provider },
};
});
})
.flat()
.filter((d) => !!d);
const promises = [];
if (linksToRemove.length) {
promises.push(remoteLink.dismiss(linksToRemove));
}
if (linksToCreate.length) {
promises.push(remoteLink.create(linksToCreate));
}
await (0, utils_1.promiseAll)(promises);
return new workflows_sdk_1.StepResponse(void 0, {
linksToCreate: linksToRemove,
linksToRemove: linksToCreate,
});
}, async (rollbackData, { container }) => {
if (!rollbackData) {
return;
}
const remoteLink = container.resolve(utils_1.ContainerRegistrationKeys.LINK);
const promises = [];
if (rollbackData.linksToRemove.length) {
promises.push(remoteLink.dismiss(rollbackData.linksToRemove));
}
if (rollbackData.linksToCreate.length) {
promises.push(remoteLink.create(rollbackData.linksToCreate));
}
await (0, utils_1.promiseAll)(promises);
});
//# sourceMappingURL=set-regions-payment-providers.js.map
;