@devx-commerce/plugin-loyalty
Version:
A starter for Medusa plugins.
53 lines • 4.39 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.refreshLoyaltyWorkflow = void 0;
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
const core_flows_1 = require("@medusajs/medusa/core-flows");
const query_config_1 = require("../../api/store/carts/query-config");
const locking_1 = require("../locking");
const apply_loyalty_on_cart_1 = require("./apply-loyalty-on-cart");
const remove_loyalty_from_cart_1 = require("./remove-loyalty-from-cart");
const validate_loyalty_exist_1 = require("./steps/validate-loyalty-exist");
exports.refreshLoyaltyWorkflow = (0, workflows_sdk_1.createWorkflow)("refresh-loyalty", (input) => {
// `acquireLockStep` takes SECONDS, not milliseconds. The previous values
// (30000 / 120000) were read as seconds, so the acquire retry loop ran for
// ~347 days instead of 30s and the lock TTL was ~3.8 years instead of 2min —
// a crashed holder would never release its key.
//
// The TTL is the safety valve for a crashed holder, but it is ALSO a
// correctness hazard: if this workflow outlives its own TTL, Redis drops the
// key while the workflow is still running and the next request acquires
// cleanly — two concurrent applies on one cart, which is what attaches two
// loyalty promotions and orphans one.
//
// 120s sits well above the real runtime (UAT measured median ~1s, max ~10.3s
// on slower-than-prod hardware) while still freeing a crashed holder's key
// in two minutes. Do not lower it without re-measuring.
(0, locking_1.acquireLockStep)({
key: input.cart_id,
timeout: 30,
ttl: 120,
});
const { data: carts } = (0, core_flows_1.useQueryGraphStep)({
entity: "cart",
fields: query_config_1.cartFields,
filters: { id: input.cart_id },
options: { throwIfKeyNotFound: true },
});
const loyaltyAppliedToCart = (0, validate_loyalty_exist_1.validateLoyaltyExistStep)({
cart: carts[0],
});
remove_loyalty_from_cart_1.removeLoyaltyFromCartWorkflow.runAsStep({
input: { cart_id: input.cart_id },
});
(0, workflows_sdk_1.when)({ loyaltyAppliedToCart }, (result) => result.loyaltyAppliedToCart).then(() => {
apply_loyalty_on_cart_1.applyLoyaltyOnCartWorkflow.runAsStep({
input: { cart_id: input.cart_id },
});
});
(0, locking_1.releaseLockStep)({
key: input.cart_id,
});
return new workflows_sdk_1.WorkflowResponse({});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmcmVzaC1sb3lhbHR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9jYXJ0L3JlZnJlc2gtbG95YWx0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFJMkM7QUFDM0MsNERBQWdFO0FBRWhFLHFFQUFnRTtBQUNoRSx3Q0FBOEQ7QUFDOUQsbUVBQXFFO0FBQ3JFLHlFQUEyRTtBQUMzRSwyRUFBMEU7QUFFN0QsUUFBQSxzQkFBc0IsR0FBRyxJQUFBLDhCQUFjLEVBQ2xELGlCQUFpQixFQUNqQixDQUFDLEtBQTBCLEVBQUUsRUFBRTtJQUM3Qix5RUFBeUU7SUFDekUsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUM3RSxnREFBZ0Q7SUFDaEQsRUFBRTtJQUNGLHFFQUFxRTtJQUNyRSw2RUFBNkU7SUFDN0Usd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSxzQ0FBc0M7SUFDdEMsRUFBRTtJQUNGLDZFQUE2RTtJQUM3RSwyRUFBMkU7SUFDM0Usd0RBQXdEO0lBQ3hELElBQUEseUJBQWUsRUFBQztRQUNkLEdBQUcsRUFBRSxLQUFLLENBQUMsT0FBTztRQUNsQixPQUFPLEVBQUUsRUFBRTtRQUNYLEdBQUcsRUFBRSxHQUFHO0tBQ1QsQ0FBQyxDQUFDO0lBRUgsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFBLDhCQUFpQixFQUFDO1FBQ3hDLE1BQU0sRUFBRSxNQUFNO1FBQ2QsTUFBTSxFQUFFLHlCQUFVO1FBQ2xCLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFO1FBQzlCLE9BQU8sRUFBRSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRTtLQUN0QyxDQUFDLENBQUM7SUFFSCxNQUFNLG9CQUFvQixHQUFHLElBQUEsaURBQXdCLEVBQUM7UUFDcEQsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7S0FDZixDQUFDLENBQUM7SUFFSCx3REFBNkIsQ0FBQyxTQUFTLENBQUM7UUFDdEMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUU7S0FDbEMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxvQkFBSSxFQUNGLEVBQUUsb0JBQW9CLEVBQUUsRUFDeEIsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FDeEMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ1Ysa0RBQTBCLENBQUMsU0FBUyxDQUFDO1lBQ25DLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFO1NBQ2xDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSx5QkFBZSxFQUFDO1FBQ2QsR0FBRyxFQUFFLEtBQUssQ0FBQyxPQUFPO0tBQ25CLENBQUMsQ0FBQztJQUVILE9BQU8sSUFBSSxnQ0FBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQyxDQUFDLENBQ0YsQ0FBQyJ9