@medusajs/loyalty-plugin 0.0.4 → 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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medusajs/loyalty-plugin",
3
- "version": "0.0.4",
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-20250318091043",
42
- "@medusajs/cli": "2.6.2-snapshot-20250318091043",
43
- "@medusajs/framework": "2.6.2-snapshot-20250318091043",
44
- "@medusajs/icons": "2.6.2-snapshot-20250318091043",
45
- "@medusajs/js-sdk": "2.6.2-snapshot-20250318091043",
46
- "@medusajs/medusa": "2.6.2-snapshot-20250318091043",
47
- "@medusajs/test-utils": "2.6.2-snapshot-20250318091043",
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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