UNPKG

@devx-commerce/plugin-loyalty

Version:

A starter for Medusa plugins.

53 lines 4.39 kB
"use strict"; 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