@medusajs/loyalty-plugin 0.0.3 → 0.0.5
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/medusa-config.js +33 -0
- package/.medusa/server/src/admin/index.js +30822 -21723
- package/.medusa/server/src/admin/index.mjs +30828 -21729
- package/.medusa/server/src/api/admin/gift-cards/validators.js +3 -3
- package/.medusa/server/src/modules/loyalty/migrations/Migration20250326095923.js +16 -0
- package/.medusa/server/src/modules/loyalty/models/gift-card.js +2 -2
- package/.medusa/server/src/subscribers/create-gift-card.js +9 -46
- package/.medusa/server/src/types/modules.js +1 -2
- package/.medusa/server/src/utils/gift-card.js +32 -0
- package/.medusa/server/src/workflows/carts/workflows/add-gift-card-to-cart.js +17 -4
- package/.medusa/server/src/workflows/carts/workflows/remove-gift-cart-from-cart.js +12 -4
- package/.medusa/server/src/workflows/gift-cards/steps/create-gift-cards.js +8 -1
- package/.medusa/server/src/workflows/gift-cards/workflows/redeem-gift-card.js +24 -9
- package/.medusa/server/src/workflows/hooks/after-order-credit-lines-created.js +2 -1
- package/.medusa/server/src/workflows/orders/workflows/refund-credit-lines.js +6 -3
- package/.medusa/server/src/workflows/store-credit/workflows/create-store-credit-accounts.js +3 -2
- package/package.json +8 -11
- package/.medusa/server/src/providers/index.js +0 -12
- package/.medusa/server/src/providers/store-credit-payment/index.js +0 -12
- package/.medusa/server/src/providers/store-credit-payment/service.js +0 -181
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@medusajs/loyalty-plugin",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"description": "Medusa Plugin: Loyalty - Gift Cards",
|
|
5
5
|
"author": "Medusa (https://medusajs.com)",
|
|
6
6
|
"license": "MIT",
|
|
@@ -9,11 +9,8 @@
|
|
|
9
9
|
],
|
|
10
10
|
"exports": {
|
|
11
11
|
"./package.json": "./package.json",
|
|
12
|
-
"./payment-provider": "./.medusa/server/providers/store-credit-payment/index.js",
|
|
13
12
|
"./modules/loyalty/*": "./.medusa/server/src/modules/loyalty/index.js",
|
|
14
13
|
"./.medusa/server/src/modules/loyalty": "./.medusa/server/src/modules/loyalty/index.js",
|
|
15
|
-
"./.medusa/server/src/providers/store-credit-payment/index.js": "./.medusa/server/src/providers/store-credit-payment/index.js",
|
|
16
|
-
"./store-credit-payment": "./.medusa/server/src/providers/store-credit-payment/index.js",
|
|
17
14
|
"./.medusa/server/src/modules/store-credit": "./.medusa/server/src/modules/store-credit/index.js",
|
|
18
15
|
"./.medusa/server/src/*": "./.medusa/server/src/**/*.js",
|
|
19
16
|
"./admin": {
|
|
@@ -38,13 +35,13 @@
|
|
|
38
35
|
"test": "NODE_OPTIONS=--experimental-vm-modules jest --silent=false --runInBand --forceExit"
|
|
39
36
|
},
|
|
40
37
|
"devDependencies": {
|
|
41
|
-
"@medusajs/admin-sdk": "2.6.2-snapshot-
|
|
42
|
-
"@medusajs/cli": "2.6.2-snapshot-
|
|
43
|
-
"@medusajs/framework": "2.6.2-snapshot-
|
|
44
|
-
"@medusajs/icons": "2.6.2-snapshot-
|
|
45
|
-
"@medusajs/js-sdk": "2.6.2-snapshot-
|
|
46
|
-
"@medusajs/medusa": "2.6.2-snapshot-
|
|
47
|
-
"@medusajs/test-utils": "2.6.2-snapshot-
|
|
38
|
+
"@medusajs/admin-sdk": "2.6.2-snapshot-20250327134922",
|
|
39
|
+
"@medusajs/cli": "2.6.2-snapshot-20250327134922",
|
|
40
|
+
"@medusajs/framework": "2.6.2-snapshot-20250327134922",
|
|
41
|
+
"@medusajs/icons": "2.6.2-snapshot-20250327134922",
|
|
42
|
+
"@medusajs/js-sdk": "2.6.2-snapshot-20250327134922",
|
|
43
|
+
"@medusajs/medusa": "2.6.2-snapshot-20250327134922",
|
|
44
|
+
"@medusajs/test-utils": "2.6.2-snapshot-20250327134922",
|
|
48
45
|
"@medusajs/ui": "latest",
|
|
49
46
|
"@mikro-orm/cli": "6.4.3",
|
|
50
47
|
"@mikro-orm/core": "6.4.3",
|
|
@@ -1,12 +0,0 @@
|
|
|
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
|
-
const service_1 = __importDefault(require("./store-credit-payment/service"));
|
|
7
|
-
exports.default = {
|
|
8
|
-
storeCreditPayment: {
|
|
9
|
-
service: service_1.default,
|
|
10
|
-
},
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkVBQStFO0FBRS9FLGtCQUFlO0lBQ2Isa0JBQWtCLEVBQUU7UUFDbEIsT0FBTyxFQUFFLGlCQUFpQztLQUMzQztDQUNGLENBQUMifQ==
|
|
@@ -1,12 +0,0 @@
|
|
|
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
|
-
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
-
const types_1 = require("../../types");
|
|
8
|
-
const service_1 = __importDefault(require("./service"));
|
|
9
|
-
exports.default = (0, utils_1.ModuleProvider)(types_1.PluginModule.STORE_CREDIT_PAYMENT_PROVIDER, {
|
|
10
|
-
services: [service_1.default],
|
|
11
|
-
});
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3N0b3JlLWNyZWRpdC1wYXltZW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscURBQTJEO0FBQzNELHVDQUEyQztBQUMzQyx3REFBMEQ7QUFFMUQsa0JBQWUsSUFBQSxzQkFBYyxFQUFDLG9CQUFZLENBQUMsNkJBQTZCLEVBQUU7SUFDeEUsUUFBUSxFQUFFLENBQUMsaUJBQWlDLENBQUM7Q0FDOUMsQ0FBQyxDQUFDIn0=
|
|
@@ -1,181 +0,0 @@
|
|
|
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
|
-
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
-
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
-
class StoreCreditPaymentProvider extends utils_1.AbstractPaymentProvider {
|
|
9
|
-
constructor(container, options) {
|
|
10
|
-
super(container, options);
|
|
11
|
-
this.logger_ = container.logger;
|
|
12
|
-
this.options_ = options;
|
|
13
|
-
this.storeCreditService_ = container.store_credit;
|
|
14
|
-
}
|
|
15
|
-
async initiatePayment({ currency_code, amount, data, context, }) {
|
|
16
|
-
const customerId = context?.customer?.id;
|
|
17
|
-
const transactionGroupId = data?.transaction_group_id;
|
|
18
|
-
if (!customerId) {
|
|
19
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Customer ID is required");
|
|
20
|
-
}
|
|
21
|
-
const [storeCredit] = await this.storeCreditService_.listStoreCreditAccounts({
|
|
22
|
-
customer_id: customerId,
|
|
23
|
-
currency_code,
|
|
24
|
-
});
|
|
25
|
-
if (!storeCredit) {
|
|
26
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Store credit account not found");
|
|
27
|
-
}
|
|
28
|
-
const { balance } = await this.storeCreditService_.retrieveAccountStats({
|
|
29
|
-
account_id: storeCredit.id,
|
|
30
|
-
transaction_group_id: transactionGroupId,
|
|
31
|
-
});
|
|
32
|
-
if (utils_1.MathBN.convert(balance).lt(utils_1.MathBN.convert(amount))) {
|
|
33
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Insufficient store credit");
|
|
34
|
-
}
|
|
35
|
-
const transactions = await this.storeCreditService_.debitAccounts([
|
|
36
|
-
{
|
|
37
|
-
account_id: storeCredit.id,
|
|
38
|
-
amount: utils_1.MathBN.convert(amount),
|
|
39
|
-
transaction_group_id: transactionGroupId,
|
|
40
|
-
reference: "cart",
|
|
41
|
-
reference_id: data?.cart_id ?? "test",
|
|
42
|
-
},
|
|
43
|
-
]);
|
|
44
|
-
return {
|
|
45
|
-
id: storeCredit.id,
|
|
46
|
-
data: {
|
|
47
|
-
transaction_ids: transactions.map((t) => t.id),
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
async authorizePayment(input) {
|
|
52
|
-
return { data: input.data, status: utils_1.PaymentSessionStatus.CAPTURED };
|
|
53
|
-
}
|
|
54
|
-
async capturePayment(input) {
|
|
55
|
-
const transactionIds = (input.data?.transaction_ids || []);
|
|
56
|
-
if (!(0, utils_1.isPresent)(transactionIds)) {
|
|
57
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Transaction IDs are required to capture payment");
|
|
58
|
-
}
|
|
59
|
-
const transactions = await this.storeCreditService_.listAccountTransactions({ id: transactionIds });
|
|
60
|
-
if (transactions.length !== transactionIds.length) {
|
|
61
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid transaction IDs");
|
|
62
|
-
}
|
|
63
|
-
return {
|
|
64
|
-
data: {
|
|
65
|
-
transaction_ids: transactionIds,
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
async refundPayment(input) {
|
|
70
|
-
const { data, context, amount } = input;
|
|
71
|
-
const customerId = context?.customer?.id;
|
|
72
|
-
const currencyCode = data?.currency;
|
|
73
|
-
let transactionGroupId = data?.transaction_group_id;
|
|
74
|
-
if (!customerId) {
|
|
75
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Customer ID is required");
|
|
76
|
-
}
|
|
77
|
-
const [storeCredit] = await this.storeCreditService_.listStoreCreditAccounts({
|
|
78
|
-
customer_id: customerId,
|
|
79
|
-
currency_code: currencyCode,
|
|
80
|
-
});
|
|
81
|
-
if (!storeCredit) {
|
|
82
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Store credit account not found");
|
|
83
|
-
}
|
|
84
|
-
const { balance } = await this.storeCreditService_.retrieveAccountStats({
|
|
85
|
-
account_id: storeCredit.id,
|
|
86
|
-
transaction_group_id: transactionGroupId,
|
|
87
|
-
});
|
|
88
|
-
if (utils_1.MathBN.convert(balance).lt(utils_1.MathBN.convert(amount))) {
|
|
89
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Insufficient store credit");
|
|
90
|
-
}
|
|
91
|
-
if (!transactionGroupId) {
|
|
92
|
-
const transactionGroup = await this.storeCreditService_.createTransactionGroups({
|
|
93
|
-
account_id: storeCredit.id,
|
|
94
|
-
code: crypto_1.default.randomBytes(64).toString("base64url"),
|
|
95
|
-
metadata: {
|
|
96
|
-
cart_id: data?.cart_id,
|
|
97
|
-
},
|
|
98
|
-
});
|
|
99
|
-
transactionGroupId = transactionGroup.id;
|
|
100
|
-
}
|
|
101
|
-
const transactions = await this.storeCreditService_.creditAccounts([
|
|
102
|
-
{
|
|
103
|
-
account_id: storeCredit.id,
|
|
104
|
-
amount: utils_1.MathBN.convert(amount),
|
|
105
|
-
transaction_group_id: transactionGroupId,
|
|
106
|
-
reference: "cart",
|
|
107
|
-
reference_id: data?.cart_id,
|
|
108
|
-
},
|
|
109
|
-
]);
|
|
110
|
-
return {
|
|
111
|
-
data: {
|
|
112
|
-
transaction_ids: transactions.map((t) => t.id),
|
|
113
|
-
},
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
async cancelPayment(input) {
|
|
117
|
-
const transactionIds = (input.data?.transaction_ids || []);
|
|
118
|
-
if (!(0, utils_1.isPresent)(transactionIds)) {
|
|
119
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Transaction IDs are required to refund payment");
|
|
120
|
-
}
|
|
121
|
-
const transactions = await this.storeCreditService_.listAccountTransactions({ id: transactionIds });
|
|
122
|
-
if (transactions.length !== transactionIds.length) {
|
|
123
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid transaction IDs");
|
|
124
|
-
}
|
|
125
|
-
await this.storeCreditService_.deleteTransactions(transactionIds);
|
|
126
|
-
return {
|
|
127
|
-
data: {
|
|
128
|
-
transaction_ids: transactionIds,
|
|
129
|
-
},
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
async deletePayment(input) {
|
|
133
|
-
const transactionIds = (input.data?.transaction_ids || []);
|
|
134
|
-
if (!(0, utils_1.isPresent)(transactionIds)) {
|
|
135
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Transaction IDs are required to refund payment");
|
|
136
|
-
}
|
|
137
|
-
const transactions = await this.storeCreditService_.listAccountTransactions({ id: transactionIds });
|
|
138
|
-
if (transactions.length) {
|
|
139
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Cannot delete payment with active transactions");
|
|
140
|
-
}
|
|
141
|
-
return {
|
|
142
|
-
data: {
|
|
143
|
-
transaction_ids: transactionIds,
|
|
144
|
-
},
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
async getPaymentStatus(input) {
|
|
148
|
-
const { data } = input;
|
|
149
|
-
const transactionIds = (data?.transaction_ids || []);
|
|
150
|
-
if (!(0, utils_1.isPresent)(transactionIds)) {
|
|
151
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Transaction IDs are required to get payment status");
|
|
152
|
-
}
|
|
153
|
-
return { status: utils_1.PaymentSessionStatus.CAPTURED };
|
|
154
|
-
}
|
|
155
|
-
async retrievePayment({ data, }) {
|
|
156
|
-
const transactionIds = (data?.transaction_ids || []);
|
|
157
|
-
const transactions = await this.storeCreditService_.listAccountTransactions({ id: transactionIds });
|
|
158
|
-
if (transactions.length !== transactionIds.length) {
|
|
159
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid transaction IDs");
|
|
160
|
-
}
|
|
161
|
-
return { data: { transactions } };
|
|
162
|
-
}
|
|
163
|
-
async updatePayment({ data, currency_code, amount, context, }) {
|
|
164
|
-
if ((0, utils_1.isPresent)(amount) && data?.amount === amount) {
|
|
165
|
-
return { data };
|
|
166
|
-
}
|
|
167
|
-
await this.storeCreditService_.deleteTransactions(data?.transaction_ids);
|
|
168
|
-
return await this.initiatePayment({
|
|
169
|
-
currency_code,
|
|
170
|
-
amount,
|
|
171
|
-
data,
|
|
172
|
-
context,
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
async getWebhookActionAndData(webhookData) {
|
|
176
|
-
return { action: utils_1.PaymentActions.NOT_SUPPORTED };
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
StoreCreditPaymentProvider.identifier = "store-credit";
|
|
180
|
-
exports.default = StoreCreditPaymentProvider;
|
|
181
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvc3RvcmUtY3JlZGl0LXBheW1lbnQvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXVCQSxxREFPbUM7QUFDbkMsb0RBQTRCO0FBVTVCLE1BQU0sMEJBQTJCLFNBQVEsK0JBQWdDO0lBT3ZFLFlBQVksU0FBK0IsRUFBRSxPQUFnQjtRQUMzRCxLQUFLLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTFCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQztJQUNwRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUNwQixhQUFhLEVBQ2IsTUFBTSxFQUNOLElBQUksRUFDSixPQUFPLEdBQ2M7UUFDckIsTUFBTSxVQUFVLEdBQUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUM7UUFDekMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEVBQUUsb0JBQTBDLENBQUM7UUFFNUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHlCQUF5QixDQUMxQixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FDakIsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsdUJBQXVCLENBQUM7WUFDckQsV0FBVyxFQUFFLFVBQVU7WUFDdkIsYUFBYTtTQUNkLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMs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
|