@hartl-services/medusa-base 4.0.0 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/free-shipping/free-shipping-settings.js +38 -0
- package/.medusa/server/src/free-shipping/plugin-features.js +45 -0
- package/.medusa/server/src/jobs/free-shipping-promotion-sync.js +22 -0
- package/.medusa/server/src/modules/free-shipping/index.js +13 -0
- package/.medusa/server/src/modules/free-shipping/migrations/Migration20260911114515.js +16 -0
- package/.medusa/server/src/modules/free-shipping/migrations/Migration20260928201511.js +19 -0
- package/.medusa/server/src/modules/free-shipping/migrations/Migration20260928211756.js +110 -0
- package/.medusa/server/src/modules/free-shipping/service.js +17 -0
- package/.medusa/server/src/shop-config/build-shop-config.js +5 -9
- package/.medusa/server/src/subscribers/free-shipping-plugin-features-updated.js +25 -0
- package/.medusa/server/src/subscribers/free-shipping-plugin-settings-updated.js +26 -0
- package/.medusa/server/src/workflows/free-shipping/sync-free-shipping-promotions.js +143 -0
- package/.medusa/server/src/workflows/hooks/set-free-shipping-promotion-context.js +86 -0
- package/README.md +712 -530
- package/dist/shop-config/build-shop-config.d.ts +2 -2
- package/dist/shop-config/build-shop-config.js +4 -8
- package/package.json +4 -4
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveFreeShippingSettings = resolveFreeShippingSettings;
|
|
4
|
+
const public_1 = require("../public");
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const plugin_features_1 = require("./plugin-features");
|
|
7
|
+
const invalidSetting = (key) => new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Die Versandkosten-Einstellung "${key}" hat keinen gültigen Wert.`);
|
|
8
|
+
/**
|
|
9
|
+
* Reads the four settings through `getPluginSettings` (stored in the Admin >
|
|
10
|
+
* declared default). The base validates every stored value against the
|
|
11
|
+
* descriptor and every setting has a default, so a missing or mistyped value
|
|
12
|
+
* means a broken base and is thrown, never replaced by a guess. Read failures
|
|
13
|
+
* propagate.
|
|
14
|
+
*/
|
|
15
|
+
async function resolveFreeShippingSettings(container) {
|
|
16
|
+
const { values } = await (0, public_1.getPluginSettings)(container, plugin_features_1.freeShippingPluginFeatures);
|
|
17
|
+
const readNumber = (key) => {
|
|
18
|
+
const value = values[key];
|
|
19
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
|
|
20
|
+
throw invalidSetting(key);
|
|
21
|
+
}
|
|
22
|
+
return value;
|
|
23
|
+
};
|
|
24
|
+
const readBoolean = (key) => {
|
|
25
|
+
const value = values[key];
|
|
26
|
+
if (typeof value !== "boolean") {
|
|
27
|
+
throw invalidSetting(key);
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
default_threshold: readNumber("default_threshold"),
|
|
33
|
+
affiliate_threshold: readNumber("affiliate_threshold"),
|
|
34
|
+
affiliate_applies_to_account_holders: readBoolean("affiliate_applies_to_account_holders"),
|
|
35
|
+
affiliate_applies_to_referred_customers: readBoolean("affiliate_applies_to_referred_customers"),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlZS1zaGlwcGluZy1zZXR0aW5ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mcmVlLXNoaXBwaW5nL2ZyZWUtc2hpcHBpbmctc2V0dGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEyQkEsa0VBdUNDO0FBbEVELHNDQUE2QztBQUU3QyxxREFBdUQ7QUFFdkQsdURBQThEO0FBVTlELE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBVyxFQUFlLEVBQUUsQ0FDbEQsSUFBSSxtQkFBVyxDQUNiLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyxrQ0FBa0MsR0FBRyw2QkFBNkIsQ0FDbkUsQ0FBQTtBQUVIOzs7Ozs7R0FNRztBQUNJLEtBQUssVUFBVSwyQkFBMkIsQ0FDL0MsU0FBMEI7SUFFMUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSwwQkFBaUIsRUFDeEMsU0FBUyxFQUNULDRDQUEwQixDQUMzQixDQUFBO0lBRUQsTUFBTSxVQUFVLEdBQUcsQ0FDakIsR0FBZ0QsRUFDeEMsRUFBRTtRQUNWLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUN6QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RFLE1BQU0sY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzNCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUMsQ0FBQTtJQUNELE1BQU0sV0FBVyxHQUFHLENBQ2xCLEdBRTZDLEVBQ3BDLEVBQUU7UUFDWCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDekIsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQixNQUFNLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMzQixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDLENBQUE7SUFFRCxPQUFPO1FBQ0wsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLG1CQUFtQixDQUFDO1FBQ2xELG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQztRQUN0RCxvQ0FBb0MsRUFBRSxXQUFXLENBQy9DLHNDQUFzQyxDQUN2QztRQUNELHVDQUF1QyxFQUFFLFdBQVcsQ0FDbEQseUNBQXlDLENBQzFDO0tBQ0YsQ0FBQTtBQUNILENBQUMifQ==
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.freeShippingPluginFeatures = void 0;
|
|
4
|
+
const public_1 = require("../public");
|
|
5
|
+
exports.freeShippingPluginFeatures = (0, public_1.definePluginFeatures)({
|
|
6
|
+
plugin_key: "free_shipping",
|
|
7
|
+
label: "Versandkostenfrei",
|
|
8
|
+
description: "Schaltet die beiden automatischen Versandkosten-Aktionen aktiv bzw. inaktiv. Die Schwellenwerte bleiben auch ausgeschaltet bearbeitbar; der Aktionskontext im Warenkorb läuft weiter.",
|
|
9
|
+
summary: "Die beiden automatischen Versandkosten-Aktionen mit ihren Schwellenwerten.",
|
|
10
|
+
icon: "TruckFast",
|
|
11
|
+
disable_hint: "Aus: beide Aktionen sind inaktiv. Die Schwellenwerte bleiben bearbeitbar.",
|
|
12
|
+
disable_confirm: "Die beiden automatischen Versandkosten-Aktionen werden dann inaktiv. Die Schwellenwerte bleiben auch ausgeschaltet bearbeitbar, und der Aktionskontext im Warenkorb läuft weiter.",
|
|
13
|
+
features: [],
|
|
14
|
+
settings: [
|
|
15
|
+
{
|
|
16
|
+
key: "default_threshold",
|
|
17
|
+
label: "Kostenlose Lieferung ab (€)",
|
|
18
|
+
width: "half",
|
|
19
|
+
type: "number",
|
|
20
|
+
min: 0,
|
|
21
|
+
default: 50,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
key: "affiliate_threshold",
|
|
25
|
+
label: "Für Affiliates ab (€)",
|
|
26
|
+
width: "half",
|
|
27
|
+
type: "number",
|
|
28
|
+
min: 0,
|
|
29
|
+
default: 100,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
key: "affiliate_applies_to_account_holders",
|
|
33
|
+
label: "Gilt, wenn der Kunde selbst Affiliate ist",
|
|
34
|
+
type: "boolean",
|
|
35
|
+
default: true,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
key: "affiliate_applies_to_referred_customers",
|
|
39
|
+
label: "Gilt, wenn der Warenkorb über einen Affiliate-Link oder -Code zugeordnet wurde",
|
|
40
|
+
type: "boolean",
|
|
41
|
+
default: false,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWZlYXR1cmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ZyZWUtc2hpcHBpbmcvcGx1Z2luLWZlYXR1cmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNDQUFnRDtBQUVuQyxRQUFBLDBCQUEwQixHQUFHLElBQUEsNkJBQW9CLEVBQUM7SUFDN0QsVUFBVSxFQUFFLGVBQWU7SUFDM0IsS0FBSyxFQUFFLG1CQUFtQjtJQUMxQixXQUFXLEVBQ1QsdUxBQXVMO0lBQ3pMLE9BQU8sRUFDTCw0RUFBNEU7SUFDOUUsSUFBSSxFQUFFLFdBQVc7SUFDakIsWUFBWSxFQUNWLDJFQUEyRTtJQUM3RSxlQUFlLEVBQ2IsbUxBQW1MO0lBQ3JMLFFBQVEsRUFBRSxFQUFFO0lBQ1osUUFBUSxFQUFFO1FBQ1I7WUFDRSxHQUFHLEVBQUUsbUJBQW1CO1lBQ3hCLEtBQUssRUFBRSw2QkFBNkI7WUFDcEMsS0FBSyxFQUFFLE1BQU07WUFDYixJQUFJLEVBQUUsUUFBUTtZQUNkLEdBQUcsRUFBRSxDQUFDO1lBQ04sT0FBTyxFQUFFLEVBQUU7U0FDWjtRQUNEO1lBQ0UsR0FBRyxFQUFFLHFCQUFxQjtZQUMxQixLQUFLLEVBQUUsdUJBQXVCO1lBQzlCLEtBQUssRUFBRSxNQUFNO1lBQ2IsSUFBSSxFQUFFLFFBQVE7WUFDZCxHQUFHLEVBQUUsQ0FBQztZQUNOLE9BQU8sRUFBRSxHQUFHO1NBQ2I7UUFDRDtZQUNFLEdBQUcsRUFBRSxzQ0FBc0M7WUFDM0MsS0FBSyxFQUFFLDJDQUEyQztZQUNsRCxJQUFJLEVBQUUsU0FBUztZQUNmLE9BQU8sRUFBRSxJQUFJO1NBQ2Q7UUFDRDtZQUNFLEdBQUcsRUFBRSx5Q0FBeUM7WUFDOUMsS0FBSyxFQUNILGdGQUFnRjtZQUNsRixJQUFJLEVBQUUsU0FBUztZQUNmLE9BQU8sRUFBRSxLQUFLO1NBQ2Y7S0FDRjtDQUNGLENBQUMsQ0FBQSJ9
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = freeShippingPromotionSyncJob;
|
|
5
|
+
const sync_free_shipping_promotions_1 = require("../workflows/free-shipping/sync-free-shipping-promotions");
|
|
6
|
+
/**
|
|
7
|
+
* Keeps the two automatic promotions in line with the plugin's settings and
|
|
8
|
+
* the `free_shipping` plugin toggle, also after a deploy/migration or when a
|
|
9
|
+
* change event was lost. Deliberately not gated by the toggle: while the
|
|
10
|
+
* plugin is off, this run is what deactivates the promotions. The sync
|
|
11
|
+
* writes only differences, so a run against in-sync promotions is
|
|
12
|
+
* read-only. A failure is logged by Medusa's job runner and retried on the
|
|
13
|
+
* next run.
|
|
14
|
+
*/
|
|
15
|
+
async function freeShippingPromotionSyncJob(container) {
|
|
16
|
+
await (0, sync_free_shipping_promotions_1.syncFreeShippingPromotions)(container);
|
|
17
|
+
}
|
|
18
|
+
exports.config = {
|
|
19
|
+
name: "free-shipping-promotion-sync",
|
|
20
|
+
schedule: "*/15 * * * *",
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlZS1zaGlwcGluZy1wcm9tb3Rpb24tc3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9qb2JzL2ZyZWUtc2hpcHBpbmctcHJvbW90aW9uLXN5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBYUEsK0NBSUM7QUFmRCw0R0FBcUc7QUFFckc7Ozs7Ozs7O0dBUUc7QUFDWSxLQUFLLFVBQVUsNEJBQTRCLENBQ3hELFNBQTBCO0lBRTFCLE1BQU0sSUFBQSwwREFBMEIsRUFBQyxTQUFTLENBQUMsQ0FBQTtBQUM3QyxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQUc7SUFDcEIsSUFBSSxFQUFFLDhCQUE4QjtJQUNwQyxRQUFRLEVBQUUsY0FBYztDQUN6QixDQUFBIn0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.FREE_SHIPPING_MODULE = void 0;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const service_1 = __importDefault(require("./service"));
|
|
9
|
+
exports.FREE_SHIPPING_MODULE = "free_shipping";
|
|
10
|
+
exports.default = (0, utils_1.Module)(exports.FREE_SHIPPING_MODULE, {
|
|
11
|
+
service: service_1.default,
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9mcmVlLXNoaXBwaW5nL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFEQUFrRDtBQUVsRCx3REFBaUQ7QUFFcEMsUUFBQSxvQkFBb0IsR0FBRyxlQUFlLENBQUE7QUFFbkQsa0JBQWUsSUFBQSxjQUFNLEVBQUMsNEJBQW9CLEVBQUU7SUFDMUMsT0FBTyxFQUFFLGlCQUF5QjtDQUNuQyxDQUFDLENBQUEifQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20260911114515 = void 0;
|
|
4
|
+
const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
|
|
5
|
+
class Migration20260911114515 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql(`create table if not exists "free_shipping_settings" ("id" text not null, "scope" text not null default 'global', "enabled" boolean not null default true, "default_threshold" real not null default 50, "affiliate_threshold" real not null default 100, "affiliate_applies_to_account_holders" boolean not null default true, "affiliate_applies_to_referred_customers" boolean not null default false, "policy_version" integer not null default 1, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "free_shipping_settings_pkey" primary key ("id"));`);
|
|
8
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_free_shipping_settings_deleted_at" ON "free_shipping_settings" ("deleted_at") WHERE deleted_at IS NULL;`);
|
|
9
|
+
this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_free_shipping_settings_global" ON "free_shipping_settings" ("scope") WHERE deleted_at IS NULL;`);
|
|
10
|
+
}
|
|
11
|
+
async down() {
|
|
12
|
+
this.addSql(`drop table if exists "free_shipping_settings" cascade;`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.Migration20260911114515 = Migration20260911114515;
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA5MTExMTQ1MTUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9mcmVlLXNoaXBwaW5nL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNjA5MTExMTQ1MTUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQXFFO0FBRXJFLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFFM0MsS0FBSyxDQUFDLEVBQUU7UUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLHNuQkFBc25CLENBQUMsQ0FBQztRQUNwb0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyx5SUFBeUksQ0FBQyxDQUFDO1FBQ3ZKLElBQUksQ0FBQyxNQUFNLENBQUMsdUlBQXVJLENBQUMsQ0FBQztJQUN2SixDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7Q0FFRjtBQVpELDBEQVlDIn0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20260928201511 = void 0;
|
|
4
|
+
const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
|
|
5
|
+
/**
|
|
6
|
+
* Used to drop `free_shipping_settings.enabled`. It no longer does:
|
|
7
|
+
* Migration20260928211756 carries `enabled = false` over into the base
|
|
8
|
+
* plugin's toggle before it drops the whole table, so the column must
|
|
9
|
+
* survive until then. Kept (as a no-op) because databases that already ran
|
|
10
|
+
* it have it recorded.
|
|
11
|
+
*/
|
|
12
|
+
class Migration20260928201511 extends migrations_1.Migration {
|
|
13
|
+
async up() { }
|
|
14
|
+
async down() {
|
|
15
|
+
this.addSql(`alter table if exists "free_shipping_settings" add column if not exists "enabled" boolean not null default true;`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.Migration20260928201511 = Migration20260928201511;
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA5MjgyMDE1MTEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9mcmVlLXNoaXBwaW5nL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNjA5MjgyMDE1MTEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQXFFO0FBRXJFOzs7Ozs7R0FNRztBQUNILE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFFM0MsS0FBSyxDQUFDLEVBQUUsS0FBbUIsQ0FBQztJQUU1QixLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLGtIQUFrSCxDQUFDLENBQUM7SUFDbEksQ0FBQztDQUVGO0FBUkQsMERBUUMifQ==
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20260928211756 = void 0;
|
|
4
|
+
const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
|
|
5
|
+
/**
|
|
6
|
+
* Carries the stored free-shipping settings over into the base plugin
|
|
7
|
+
* (`plugin_setting_state` / `plugin_feature_state`, plugin key
|
|
8
|
+
* `free_shipping`) and drops the plugin's own table. Written by hand:
|
|
9
|
+
* `medusa plugin:db:generate` skips a module without models.
|
|
10
|
+
*
|
|
11
|
+
* - Thresholds and both affiliate rules of the old row become the stored
|
|
12
|
+
* `free_shipping` settings, unless the base already holds a row for it
|
|
13
|
+
* (settings saved in the Admin win).
|
|
14
|
+
* - An old `enabled = false` becomes a stored plugin toggle `enabled = false`
|
|
15
|
+
* (again only when the base holds no toggle row yet). The `enabled` column
|
|
16
|
+
* exists in 0.1.0 databases; Migration20260928201511 no longer drops it.
|
|
17
|
+
* - Without the base tables (base plugin not migrated yet) nothing is carried
|
|
18
|
+
* over: a NOTICE is raised, the defaults (50 / 100 / on / off) apply, and
|
|
19
|
+
* the table is dropped anyway.
|
|
20
|
+
*
|
|
21
|
+
* No `?` in the SQL: the migration runner treats it as a binding. Not
|
|
22
|
+
* exported: Medusa's migrator instantiates the file's first export.
|
|
23
|
+
*/
|
|
24
|
+
const CARRY_OVER_FREE_SHIPPING_SETTINGS_SQL = `
|
|
25
|
+
DO $migration$
|
|
26
|
+
DECLARE
|
|
27
|
+
old_row record;
|
|
28
|
+
found_rows integer;
|
|
29
|
+
has_enabled boolean;
|
|
30
|
+
BEGIN
|
|
31
|
+
IF to_regclass('free_shipping_settings') IS NULL THEN
|
|
32
|
+
RETURN;
|
|
33
|
+
END IF;
|
|
34
|
+
|
|
35
|
+
SELECT EXISTS (
|
|
36
|
+
SELECT 1 FROM information_schema.columns
|
|
37
|
+
WHERE table_schema = current_schema()
|
|
38
|
+
AND table_name = 'free_shipping_settings'
|
|
39
|
+
AND column_name = 'enabled'
|
|
40
|
+
) INTO has_enabled;
|
|
41
|
+
|
|
42
|
+
EXECUTE format(
|
|
43
|
+
'SELECT default_threshold, affiliate_threshold, '
|
|
44
|
+
|| 'affiliate_applies_to_account_holders, '
|
|
45
|
+
|| 'affiliate_applies_to_referred_customers, %s AS enabled '
|
|
46
|
+
|| 'FROM free_shipping_settings WHERE deleted_at IS NULL '
|
|
47
|
+
|| 'ORDER BY (scope = %L) DESC, created_at ASC LIMIT 1',
|
|
48
|
+
CASE WHEN has_enabled THEN 'enabled' ELSE 'true' END,
|
|
49
|
+
'global'
|
|
50
|
+
) INTO old_row;
|
|
51
|
+
GET DIAGNOSTICS found_rows = ROW_COUNT;
|
|
52
|
+
IF found_rows = 0 THEN
|
|
53
|
+
RETURN;
|
|
54
|
+
END IF;
|
|
55
|
+
|
|
56
|
+
IF to_regclass('plugin_setting_state') IS NULL THEN
|
|
57
|
+
RAISE NOTICE 'free_shipping_settings: plugin_setting_state is missing (base plugin not migrated); the stored thresholds are not carried over.';
|
|
58
|
+
ELSE
|
|
59
|
+
INSERT INTO plugin_setting_state (id, plugin_key, "values", version)
|
|
60
|
+
SELECT
|
|
61
|
+
'plgset_' || substr(md5(random()::text || clock_timestamp()::text), 1, 26),
|
|
62
|
+
'free_shipping',
|
|
63
|
+
jsonb_build_object(
|
|
64
|
+
'default_threshold', old_row.default_threshold::numeric,
|
|
65
|
+
'affiliate_threshold', old_row.affiliate_threshold::numeric,
|
|
66
|
+
'affiliate_applies_to_account_holders', old_row.affiliate_applies_to_account_holders,
|
|
67
|
+
'affiliate_applies_to_referred_customers', old_row.affiliate_applies_to_referred_customers
|
|
68
|
+
),
|
|
69
|
+
1
|
|
70
|
+
WHERE NOT EXISTS (
|
|
71
|
+
SELECT 1 FROM plugin_setting_state
|
|
72
|
+
WHERE plugin_key = 'free_shipping' AND deleted_at IS NULL
|
|
73
|
+
);
|
|
74
|
+
END IF;
|
|
75
|
+
|
|
76
|
+
IF old_row.enabled IS FALSE THEN
|
|
77
|
+
IF to_regclass('plugin_feature_state') IS NULL THEN
|
|
78
|
+
RAISE NOTICE 'free_shipping_settings: plugin_feature_state is missing (base plugin not migrated); enabled = false is not carried over.';
|
|
79
|
+
ELSE
|
|
80
|
+
INSERT INTO plugin_feature_state (id, plugin_key, enabled, features, version)
|
|
81
|
+
SELECT
|
|
82
|
+
'plgfeat_' || substr(md5(random()::text || clock_timestamp()::text), 1, 26),
|
|
83
|
+
'free_shipping',
|
|
84
|
+
false,
|
|
85
|
+
'{}'::jsonb,
|
|
86
|
+
1
|
|
87
|
+
WHERE NOT EXISTS (
|
|
88
|
+
SELECT 1 FROM plugin_feature_state
|
|
89
|
+
WHERE plugin_key = 'free_shipping' AND deleted_at IS NULL
|
|
90
|
+
);
|
|
91
|
+
END IF;
|
|
92
|
+
END IF;
|
|
93
|
+
END
|
|
94
|
+
$migration$;
|
|
95
|
+
`;
|
|
96
|
+
class Migration20260928211756 extends migrations_1.Migration {
|
|
97
|
+
async up() {
|
|
98
|
+
this.addSql(CARRY_OVER_FREE_SHIPPING_SETTINGS_SQL);
|
|
99
|
+
this.addSql(`drop table if exists "free_shipping_settings" cascade;`);
|
|
100
|
+
}
|
|
101
|
+
async down() {
|
|
102
|
+
// Recreates the 0.1.0 shape (with `enabled`, which
|
|
103
|
+
// Migration20260928201511 no longer drops). Values are not restored.
|
|
104
|
+
this.addSql(`create table if not exists "free_shipping_settings" ("id" text not null, "scope" text not null default 'global', "enabled" boolean not null default true, "default_threshold" real not null default 50, "affiliate_threshold" real not null default 100, "affiliate_applies_to_account_holders" boolean not null default true, "affiliate_applies_to_referred_customers" boolean not null default false, "policy_version" integer not null default 1, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "free_shipping_settings_pkey" primary key ("id"));`);
|
|
105
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_free_shipping_settings_deleted_at" ON "free_shipping_settings" ("deleted_at") WHERE deleted_at IS NULL;`);
|
|
106
|
+
this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_free_shipping_settings_global" ON "free_shipping_settings" ("scope") WHERE deleted_at IS NULL;`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.Migration20260928211756 = Migration20260928211756;
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA5MjgyMTE3NTYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9mcmVlLXNoaXBwaW5nL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNjA5MjgyMTE3NTYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQXFFO0FBRXJFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLHFDQUFxQyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXVFN0MsQ0FBQztBQUVGLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFFM0MsS0FBSyxDQUFDLEVBQUU7UUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixtREFBbUQ7UUFDbkQscUVBQXFFO1FBQ3JFLElBQUksQ0FBQyxNQUFNLENBQUMsc25CQUFzbkIsQ0FBQyxDQUFDO1FBQ3BvQixJQUFJLENBQUMsTUFBTSxDQUFDLHlJQUF5SSxDQUFDLENBQUM7UUFDdkosSUFBSSxDQUFDLE1BQU0sQ0FBQyx1SUFBdUksQ0FBQyxDQUFDO0lBQ3ZKLENBQUM7Q0FFRjtBQWZELDBEQWVDIn0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const plugin_features_1 = require("../../free-shipping/plugin-features");
|
|
4
|
+
/**
|
|
5
|
+
* Holds no data: the thresholds are settings of the base plugin (see
|
|
6
|
+
* `utils/free-shipping-settings.ts`). The module exists so that the base
|
|
7
|
+
* discovers the descriptor under the module key `free_shipping` and so that
|
|
8
|
+
* the migrations that dropped the former settings table keep running.
|
|
9
|
+
*/
|
|
10
|
+
class FreeShippingModuleService {
|
|
11
|
+
constructor() {
|
|
12
|
+
/** Discovered by @hartl-services/medusa-base for the toggle and settings. */
|
|
13
|
+
this.pluginFeatures = plugin_features_1.freeShippingPluginFeatures;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.default = FreeShippingModuleService;
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2ZyZWUtc2hpcHBpbmcvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlFQUFnRjtBQUVoRjs7Ozs7R0FLRztBQUNILE1BQU0seUJBQXlCO0lBQS9CO1FBQ0UsNkVBQTZFO1FBQ3BFLG1CQUFjLEdBQUcsNENBQTBCLENBQUE7SUFDdEQsQ0FBQztDQUFBO0FBRUQsa0JBQWUseUJBQXlCLENBQUEifQ==
|
|
@@ -14,8 +14,8 @@ const options_1 = require("./options");
|
|
|
14
14
|
* Builds the plain `medusa-config.ts` input of a shop: Medusa core
|
|
15
15
|
* settings, the Redis event bus, the mail provider (set up in the Admin), S3 file storage, tax and
|
|
16
16
|
* Stripe payment providers, and the Hartl Services plugins (the base plugin
|
|
17
|
-
* with its E-Mail, Documents, Steuer-Compliance and file
|
|
18
|
-
*
|
|
17
|
+
* with its E-Mail, Documents, Steuer-Compliance, Versandkostenfrei and file
|
|
18
|
+
* storage modules plus three feature plugins). Deployment
|
|
19
19
|
* values are read and validated from `environment`; a missing or invalid one
|
|
20
20
|
* fails with its name.
|
|
21
21
|
*/
|
|
@@ -162,8 +162,8 @@ function buildShopConfig(options, environment = process.env) {
|
|
|
162
162
|
const plugins = [
|
|
163
163
|
{
|
|
164
164
|
// Always first: owns the plugin feature toggles the other plugins gate
|
|
165
|
-
// on, and carries E-Mail, Documents, Steuer-Compliance
|
|
166
|
-
// gateway.
|
|
165
|
+
// on, and carries E-Mail, Documents, Steuer-Compliance, Versandkostenfrei
|
|
166
|
+
// and the /files gateway.
|
|
167
167
|
resolve: "@hartl-services/medusa-base",
|
|
168
168
|
options: {
|
|
169
169
|
email: {
|
|
@@ -210,10 +210,6 @@ function buildShopConfig(options, environment = process.env) {
|
|
|
210
210
|
files: { gateway: s3CacheStorage.gateway },
|
|
211
211
|
},
|
|
212
212
|
},
|
|
213
|
-
{
|
|
214
|
-
resolve: "@hartl-services/medusa-free-shipping",
|
|
215
|
-
options: {},
|
|
216
|
-
},
|
|
217
213
|
{
|
|
218
214
|
resolve: "@hartl-services/medusa-batch-management",
|
|
219
215
|
options: {},
|
|
@@ -300,4 +296,4 @@ function buildShopConfig(options, environment = process.env) {
|
|
|
300
296
|
function defineShopConfig(options, environment = process.env) {
|
|
301
297
|
return (0, utils_1.defineConfig)(buildShopConfig(options, environment));
|
|
302
298
|
}
|
|
303
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtc2hvcC1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2hvcC1jb25maWcvYnVpbGQtc2hvcC1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF5RUEsMENBZ1ZDO0FBR0QsNENBS0M7QUFqYUQsdURBQW9EO0FBQ3BELDBGQUFpRztBQUNqRyxxREFBMkU7QUFFM0UsNkNBaUIwQjtBQUMxQixvR0FBc0Y7QUFDdEYsNEZBQXFGO0FBQ3JGLDJEQUFtRTtBQUVuRSx1Q0FHbUI7QUFtQ25COzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixPQUEwQixFQUMxQixjQUFpQyxPQUFPLENBQUMsR0FBRztJQUU1QyxJQUFBLGlDQUF1QixFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRWpDLElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUNsQyxJQUFBLGVBQU8sRUFBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxhQUFhLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxrQkFBa0IsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzlFLE1BQU0sYUFBYSxHQUFHLElBQUEsb0NBQTJCLEVBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXRFLE1BQU0sR0FBRyxHQUFHLElBQUEsMkJBQWtCLEVBQzVCLFdBQVcsRUFDWDtRQUNFLGNBQWM7UUFDZCxZQUFZO1FBQ1osWUFBWTtRQUNaLFdBQVc7UUFDWCxZQUFZO1FBQ1osZUFBZTtRQUNmLG9CQUFvQjtRQUNwQixnQkFBZ0I7UUFDaEIsZ0JBQWdCO1FBQ2hCLHVCQUF1QjtRQUN2Qix5QkFBeUI7UUFDekIseUJBQXlCO1FBQ3pCLHlCQUF5QjtLQUMxQixFQUNE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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = freeShippingPluginFeaturesUpdatedSubscriber;
|
|
5
|
+
const public_1 = require("../public");
|
|
6
|
+
const plugin_features_1 = require("@hartl-services/medusa-contracts/events/plugin-features");
|
|
7
|
+
const plugin_features_2 = require("../free-shipping/plugin-features");
|
|
8
|
+
const sync_free_shipping_promotions_1 = require("../workflows/free-shipping/sync-free-shipping-promotions");
|
|
9
|
+
/**
|
|
10
|
+
* Switching the `free_shipping` plugin toggle in the Admin (de)activates the
|
|
11
|
+
* two automatic promotions right away instead of on the next 15-minute
|
|
12
|
+
* `free-shipping-promotion-sync` run. The sync reads the toggle itself, so a
|
|
13
|
+
* late or repeated event still converges on the current value.
|
|
14
|
+
*/
|
|
15
|
+
async function freeShippingPluginFeaturesUpdatedSubscriber({ event, container, }) {
|
|
16
|
+
const payload = plugin_features_1.PluginFeaturesUpdatedEventSchema.parse(event.data);
|
|
17
|
+
if (!(0, public_1.isOwnPluginEvent)(payload, plugin_features_2.freeShippingPluginFeatures.plugin_key)) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
await (0, sync_free_shipping_promotions_1.syncFreeShippingPromotions)(container);
|
|
21
|
+
}
|
|
22
|
+
exports.config = {
|
|
23
|
+
event: plugin_features_1.PLUGIN_FEATURES_UPDATED_EVENT,
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlZS1zaGlwcGluZy1wbHVnaW4tZmVhdHVyZXMtdXBkYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9mcmVlLXNoaXBwaW5nLXBsdWdpbi1mZWF0dXJlcy11cGRhdGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW9CQSw4REFVQztBQTFCRCxzQ0FBNEM7QUFDNUMsNkZBSWdFO0FBRWhFLHNFQUE2RTtBQUM3RSw0R0FBcUc7QUFFckc7Ozs7O0dBS0c7QUFDWSxLQUFLLFVBQVUsMkNBQTJDLENBQUMsRUFDeEUsS0FBSyxFQUNMLFNBQVMsR0FDa0M7SUFDM0MsTUFBTSxPQUFPLEdBQUcsa0RBQWdDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNsRSxJQUFJLENBQUMsSUFBQSx5QkFBZ0IsRUFBQyxPQUFPLEVBQUUsNENBQTBCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN0RSxPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sSUFBQSwwREFBMEIsRUFBQyxTQUFTLENBQUMsQ0FBQTtBQUM3QyxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRSwrQ0FBNkI7Q0FDckMsQ0FBQSJ9
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = freeShippingPluginSettingsUpdatedSubscriber;
|
|
5
|
+
const public_1 = require("../public");
|
|
6
|
+
const plugin_features_1 = require("@hartl-services/medusa-contracts/events/plugin-features");
|
|
7
|
+
const plugin_features_2 = require("../free-shipping/plugin-features");
|
|
8
|
+
const sync_free_shipping_promotions_1 = require("../workflows/free-shipping/sync-free-shipping-promotions");
|
|
9
|
+
/**
|
|
10
|
+
* Saving the `free_shipping` settings in the Admin moves the thresholds of
|
|
11
|
+
* the two automatic promotions right away instead of on the next 15-minute
|
|
12
|
+
* `free-shipping-promotion-sync` run. The event carries no values; the sync
|
|
13
|
+
* reads the current settings itself, so a late or repeated event still
|
|
14
|
+
* converges on the saved values.
|
|
15
|
+
*/
|
|
16
|
+
async function freeShippingPluginSettingsUpdatedSubscriber({ event, container, }) {
|
|
17
|
+
const payload = plugin_features_1.PluginSettingsUpdatedEventSchema.parse(event.data);
|
|
18
|
+
if (!(0, public_1.isOwnPluginEvent)(payload, plugin_features_2.freeShippingPluginFeatures.plugin_key)) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
await (0, sync_free_shipping_promotions_1.syncFreeShippingPromotions)(container);
|
|
22
|
+
}
|
|
23
|
+
exports.config = {
|
|
24
|
+
event: plugin_features_1.PLUGIN_SETTINGS_UPDATED_EVENT,
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlZS1zaGlwcGluZy1wbHVnaW4tc2V0dGluZ3MtdXBkYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9mcmVlLXNoaXBwaW5nLXBsdWdpbi1zZXR0aW5ncy11cGRhdGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXFCQSw4REFVQztBQTNCRCxzQ0FBNEM7QUFDNUMsNkZBSWdFO0FBRWhFLHNFQUE2RTtBQUM3RSw0R0FBcUc7QUFFckc7Ozs7OztHQU1HO0FBQ1ksS0FBSyxVQUFVLDJDQUEyQyxDQUFDLEVBQ3hFLEtBQUssRUFDTCxTQUFTLEdBQ2tDO0lBQzNDLE1BQU0sT0FBTyxHQUFHLGtEQUFnQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDbEUsSUFBSSxDQUFDLElBQUEseUJBQWdCLEVBQUMsT0FBTyxFQUFFLDRDQUEwQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDdEUsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLElBQUEsMERBQTBCLEVBQUMsU0FBUyxDQUFDLENBQUE7QUFDN0MsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFxQjtJQUN0QyxLQUFLLEVBQUUsK0NBQTZCO0NBQ3JDLENBQUEifQ==
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.syncFreeShippingPromotions = exports.FREE_SHIPPING_PROMOTION_SYNC_LOCK_KEY = exports.AFFILIATE_FREE_SHIPPING_PROMOTION_CODE = exports.STANDARD_FREE_SHIPPING_PROMOTION_CODE = exports.AFFILIATE_QUALIFICATION_ATTRIBUTE = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
6
|
+
const public_1 = require("../../public");
|
|
7
|
+
const plugin_features_1 = require("../../free-shipping/plugin-features");
|
|
8
|
+
const free_shipping_settings_1 = require("../../free-shipping/free-shipping-settings");
|
|
9
|
+
/**
|
|
10
|
+
* Context attribute the `set-free-shipping-promotion-context` hook injects
|
|
11
|
+
* into every cart-promotion computation. Both promotions below key off it so
|
|
12
|
+
* a cart between the two thresholds can't get free shipping through the
|
|
13
|
+
* standard promotion just because it also satisfies `item_total >= X`.
|
|
14
|
+
*/
|
|
15
|
+
exports.AFFILIATE_QUALIFICATION_ATTRIBUTE = "qualifies_for_affiliate_shipping_threshold";
|
|
16
|
+
exports.STANDARD_FREE_SHIPPING_PROMOTION_CODE = "AUTO-FREE-SHIPPING-STANDARD";
|
|
17
|
+
exports.AFFILIATE_FREE_SHIPPING_PROMOTION_CODE = "AUTO-FREE-SHIPPING-AFFILIATE";
|
|
18
|
+
/** Serializes every sync run (job and both subscribers) across processes. */
|
|
19
|
+
exports.FREE_SHIPPING_PROMOTION_SYNC_LOCK_KEY = "free-shipping-promotion-sync";
|
|
20
|
+
/** Seconds to wait for the lock; the in-memory provider also expires it then. */
|
|
21
|
+
const SYNC_LOCK_TIMEOUT_SECONDS = 60;
|
|
22
|
+
const buildRules = (threshold, qualifiesValue) => [
|
|
23
|
+
{ attribute: "item_total", operator: "gte", values: [String(threshold)] },
|
|
24
|
+
{
|
|
25
|
+
attribute: exports.AFFILIATE_QUALIFICATION_ATTRIBUTE,
|
|
26
|
+
operator: "eq",
|
|
27
|
+
values: [qualifiesValue],
|
|
28
|
+
},
|
|
29
|
+
];
|
|
30
|
+
const ruleKey = (rule) => JSON.stringify([rule.attribute, rule.operator, [...rule.values].sort()]);
|
|
31
|
+
const ensurePromotion = async (container, promotionService, code, status, threshold, qualifiesValue) => {
|
|
32
|
+
const rules = buildRules(threshold, qualifiesValue);
|
|
33
|
+
const existing = await promotionService.listPromotions({ code: [code] }, { relations: ["rules"] });
|
|
34
|
+
if (!existing[0]) {
|
|
35
|
+
try {
|
|
36
|
+
await (0, core_flows_1.createPromotionsWorkflow)(container).run({
|
|
37
|
+
input: {
|
|
38
|
+
promotionsData: [
|
|
39
|
+
{
|
|
40
|
+
code,
|
|
41
|
+
type: "standard",
|
|
42
|
+
status,
|
|
43
|
+
is_automatic: true,
|
|
44
|
+
application_method: {
|
|
45
|
+
type: "percentage",
|
|
46
|
+
value: 100,
|
|
47
|
+
target_type: "shipping_methods",
|
|
48
|
+
allocation: "across",
|
|
49
|
+
},
|
|
50
|
+
rules,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
// Concurrent boot across server/worker processes can race on the
|
|
59
|
+
// unique promotion code. Whoever loses the race falls through to the
|
|
60
|
+
// update path below, which is idempotent either way.
|
|
61
|
+
const createdByAnotherProcess = await promotionService.listPromotions({ code: [code] }, { relations: ["rules"] });
|
|
62
|
+
if (!createdByAnotherProcess[0]) {
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const current = (await promotionService.listPromotions({ code: [code] }, { relations: ["application_method", "rules", "rules.values"] }))[0];
|
|
68
|
+
if (!current) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const desiredKeys = new Set(rules.map(ruleKey));
|
|
72
|
+
const currentRules = (current.rules ?? []).map((rule) => ({
|
|
73
|
+
id: rule.id,
|
|
74
|
+
key: ruleKey({
|
|
75
|
+
attribute: rule.attribute,
|
|
76
|
+
operator: rule.operator,
|
|
77
|
+
values: (rule.values ?? []).map(({ value }) => String(value)),
|
|
78
|
+
}),
|
|
79
|
+
}));
|
|
80
|
+
const currentKeys = new Set(currentRules.map(({ key }) => key));
|
|
81
|
+
const rulesToCreate = rules.filter((rule) => !currentKeys.has(ruleKey(rule)));
|
|
82
|
+
const ruleIdsToDelete = currentRules
|
|
83
|
+
.filter(({ key }) => !desiredKeys.has(key))
|
|
84
|
+
.map(({ id }) => id);
|
|
85
|
+
// Create before delete: meanwhile the old and new rules apply together,
|
|
86
|
+
// which can only narrow which carts qualify. Deleting first would briefly
|
|
87
|
+
// leave an automatic promotion without rules - free shipping for every cart.
|
|
88
|
+
if (rulesToCreate.length) {
|
|
89
|
+
await (0, core_flows_1.batchPromotionRulesWorkflow)(container).run({
|
|
90
|
+
input: { id: current.id, rule_type: utils_1.RuleType.RULES, create: rulesToCreate },
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (ruleIdsToDelete.length) {
|
|
94
|
+
await (0, core_flows_1.batchPromotionRulesWorkflow)(container).run({
|
|
95
|
+
input: {
|
|
96
|
+
id: current.id,
|
|
97
|
+
rule_type: utils_1.RuleType.RULES,
|
|
98
|
+
delete: ruleIdsToDelete,
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (current.status !== status ||
|
|
103
|
+
Number(current.application_method?.value) !== 100) {
|
|
104
|
+
await (0, core_flows_1.updatePromotionsWorkflow)(container).run({
|
|
105
|
+
input: {
|
|
106
|
+
promotionsData: [
|
|
107
|
+
{
|
|
108
|
+
id: current.id,
|
|
109
|
+
status,
|
|
110
|
+
application_method: { value: 100 },
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Keeps the two automatic free-shipping promotions in sync with the plugin's
|
|
119
|
+
* settings (thresholds) and the base plugin toggle `free_shipping` (status:
|
|
120
|
+
* active while the plugin is on, inactive while it is off). Called by the
|
|
121
|
+
* `free-shipping-promotion-sync` job and by the `plugin-features-updated`
|
|
122
|
+
* and `plugin-settings-updated` subscribers.
|
|
123
|
+
*
|
|
124
|
+
* The whole run (toggle and settings read, both reconciliations) holds one
|
|
125
|
+
* Locking-module lock. Unlocked runs could interleave their rule diffs, e.g.
|
|
126
|
+
* one run deleting the threshold rule another run just created, and leave an
|
|
127
|
+
* automatic promotion without its `item_total` rule. Reading inside the lock
|
|
128
|
+
* also means the last run always writes the latest values. A read failure
|
|
129
|
+
* propagates; nothing is written then.
|
|
130
|
+
*/
|
|
131
|
+
const syncFreeShippingPromotions = async (container) => {
|
|
132
|
+
const locking = container.resolve(utils_1.Modules.LOCKING);
|
|
133
|
+
await locking.execute(exports.FREE_SHIPPING_PROMOTION_SYNC_LOCK_KEY, async () => {
|
|
134
|
+
const promotionService = container.resolve(utils_1.Modules.PROMOTION);
|
|
135
|
+
const enabled = await (0, public_1.isPluginFeatureEnabled)(container, plugin_features_1.freeShippingPluginFeatures);
|
|
136
|
+
const settings = await (0, free_shipping_settings_1.resolveFreeShippingSettings)(container);
|
|
137
|
+
const status = enabled ? "active" : "inactive";
|
|
138
|
+
await ensurePromotion(container, promotionService, exports.STANDARD_FREE_SHIPPING_PROMOTION_CODE, status, settings.default_threshold, "false");
|
|
139
|
+
await ensurePromotion(container, promotionService, exports.AFFILIATE_FREE_SHIPPING_PROMOTION_CODE, status, settings.affiliate_threshold, "true");
|
|
140
|
+
}, { timeout: SYNC_LOCK_TIMEOUT_SECONDS });
|
|
141
|
+
};
|
|
142
|
+
exports.syncFreeShippingPromotions = syncFreeShippingPromotions;
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1mcmVlLXNoaXBwaW5nLXByb21vdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2ZyZWUtc2hpcHBpbmcvc3luYy1mcmVlLXNoaXBwaW5nLXByb21vdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EscURBQTZEO0FBQzdELDREQUlvQztBQUVwQyx5Q0FBcUQ7QUFFckQseUVBQWdGO0FBQ2hGLHVGQUF3RjtBQUV4Rjs7Ozs7R0FLRztBQUNVLFFBQUEsaUNBQWlDLEdBQzVDLDRDQUE0QyxDQUFBO0FBRWpDLFFBQUEscUNBQXFDLEdBQ2hELDZCQUE2QixDQUFBO0FBQ2xCLFFBQUEsc0NBQXNDLEdBQ2pELDhCQUE4QixDQUFBO0FBRWhDLDZFQUE2RTtBQUNoRSxRQUFBLHFDQUFxQyxHQUNoRCw4QkFBOEIsQ0FBQTtBQUNoQyxpRkFBaUY7QUFDakYsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLENBQUE7QUFRcEMsTUFBTSxVQUFVLEdBQUcsQ0FDakIsU0FBaUIsRUFDakIsY0FBZ0MsRUFDcEIsRUFBRSxDQUFDO0lBQ2YsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUU7SUFDekU7UUFDRSxTQUFTLEVBQUUseUNBQWlDO1FBQzVDLFFBQVEsRUFBRSxJQUFJO1FBQ2QsTUFBTSxFQUFFLENBQUMsY0FBYyxDQUFDO0tBQ3pCO0NBQ0YsQ0FBQTtBQUVELE1BQU0sT0FBTyxHQUFHLENBQUMsSUFJaEIsRUFBVSxFQUFFLENBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUUxRSxNQUFN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
|