@hszrdm/core 1.4.0 → 1.6.0

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.
Files changed (182) hide show
  1. package/.medusa/server/src/admin/index.js +6361 -3789
  2. package/.medusa/server/src/admin/index.mjs +6361 -3789
  3. package/.medusa/server/src/api/admin/back-in-stock/route.d.ts +2 -0
  4. package/.medusa/server/src/api/admin/back-in-stock/route.js +70 -0
  5. package/.medusa/server/src/api/admin/core-carts/[id]/items/[itemId]/route.d.ts +3 -0
  6. package/.medusa/server/src/api/admin/core-carts/[id]/items/[itemId]/route.js +64 -0
  7. package/.medusa/server/src/api/admin/core-carts/[id]/items/route.d.ts +2 -0
  8. package/.medusa/server/src/api/admin/core-carts/[id]/items/route.js +40 -0
  9. package/.medusa/server/src/api/admin/core-carts/[id]/promotions/[code]/route.d.ts +2 -0
  10. package/.medusa/server/src/api/admin/core-carts/[id]/promotions/[code]/route.js +40 -0
  11. package/.medusa/server/src/api/admin/core-carts/[id]/promotions/route.d.ts +2 -0
  12. package/.medusa/server/src/api/admin/core-carts/[id]/promotions/route.js +41 -0
  13. package/.medusa/server/src/api/admin/core-carts/[id]/route.d.ts +2 -0
  14. package/.medusa/server/src/api/admin/core-carts/[id]/route.js +28 -0
  15. package/.medusa/server/src/api/admin/core-carts/customer/[id]/route.d.ts +2 -0
  16. package/.medusa/server/src/api/admin/core-carts/customer/[id]/route.js +34 -0
  17. package/.medusa/server/src/api/admin/core-carts/route.d.ts +3 -0
  18. package/.medusa/server/src/api/admin/core-carts/route.js +69 -0
  19. package/.medusa/server/src/api/admin/customer-activation/route.d.ts +2 -0
  20. package/.medusa/server/src/api/admin/customer-activation/route.js +97 -0
  21. package/.medusa/server/src/api/admin/customer-import/route.d.ts +2 -0
  22. package/.medusa/server/src/api/admin/customer-import/route.js +166 -0
  23. package/.medusa/server/src/api/admin/order-export/route.d.ts +2 -0
  24. package/.medusa/server/src/api/admin/order-export/route.js +88 -0
  25. package/.medusa/server/src/api/admin/product-migration/inventory/route.d.ts +3 -0
  26. package/.medusa/server/src/api/admin/product-migration/inventory/route.js +164 -0
  27. package/.medusa/server/src/api/admin/product-migration/price-list-prices/route.d.ts +3 -0
  28. package/.medusa/server/src/api/admin/product-migration/price-list-prices/route.js +204 -0
  29. package/.medusa/server/src/api/admin/product-migration/products/route.d.ts +2 -0
  30. package/.medusa/server/src/api/admin/product-migration/products/route.js +24 -0
  31. package/.medusa/server/src/api/admin/product-reviews/[id]/route.js +36 -4
  32. package/.medusa/server/src/api/admin/product-reviews/settings/route.d.ts +3 -0
  33. package/.medusa/server/src/api/admin/product-reviews/settings/route.js +63 -0
  34. package/.medusa/server/src/api/admin/shared-cart/settings/route.d.ts +5 -0
  35. package/.medusa/server/src/api/admin/shared-cart/settings/route.js +31 -0
  36. package/.medusa/server/src/api/admin/system-runtime/route.d.ts +2 -0
  37. package/.medusa/server/src/api/admin/system-runtime/route.js +18 -0
  38. package/.medusa/server/src/api/hooks/packeta/status/route.d.ts +2 -0
  39. package/.medusa/server/src/api/hooks/packeta/status/route.js +55 -0
  40. package/.medusa/server/src/api/middlewares.js +24 -1
  41. package/.medusa/server/src/api/store/abandoned-cart/recover/route.d.ts +2 -0
  42. package/.medusa/server/src/api/store/abandoned-cart/recover/route.js +37 -0
  43. package/.medusa/server/src/api/store/back-in-stock/route.d.ts +8 -0
  44. package/.medusa/server/src/api/store/back-in-stock/route.js +124 -0
  45. package/.medusa/server/src/api/store/core-carts/me/active/route.d.ts +2 -0
  46. package/.medusa/server/src/api/store/core-carts/me/active/route.js +54 -0
  47. package/.medusa/server/src/api/store/customer-activation/complete/route.d.ts +2 -0
  48. package/.medusa/server/src/api/store/customer-activation/complete/route.js +96 -0
  49. package/.medusa/server/src/api/store/customer-activation/route.d.ts +2 -0
  50. package/.medusa/server/src/api/store/customer-activation/route.js +34 -0
  51. package/.medusa/server/src/api/store/products/[id]/reviews/route.d.ts +1 -0
  52. package/.medusa/server/src/api/store/products/[id]/reviews/route.js +76 -34
  53. package/.medusa/server/src/api/store/review-request/route.d.ts +2 -0
  54. package/.medusa/server/src/api/store/review-request/route.js +60 -0
  55. package/.medusa/server/src/api/store/shared-carts/[token]/route.d.ts +2 -0
  56. package/.medusa/server/src/api/store/shared-carts/[token]/route.js +52 -0
  57. package/.medusa/server/src/api/store/shared-carts/route.d.ts +13 -0
  58. package/.medusa/server/src/api/store/shared-carts/route.js +78 -0
  59. package/.medusa/server/src/core/abandoned-cart.d.ts +64 -0
  60. package/.medusa/server/src/core/abandoned-cart.js +197 -0
  61. package/.medusa/server/src/core/admin-cart-management.d.ts +18 -0
  62. package/.medusa/server/src/core/admin-cart-management.js +102 -0
  63. package/.medusa/server/src/core/admin-cart-visibility.d.ts +94 -0
  64. package/.medusa/server/src/core/admin-cart-visibility.js +192 -0
  65. package/.medusa/server/src/core/back-in-stock.d.ts +51 -0
  66. package/.medusa/server/src/core/back-in-stock.js +107 -0
  67. package/.medusa/server/src/core/cart-observability.d.ts +23 -0
  68. package/.medusa/server/src/core/cart-observability.js +54 -0
  69. package/.medusa/server/src/core/checkout-contract.d.ts +1 -0
  70. package/.medusa/server/src/core/checkout-contract.js +2 -1
  71. package/.medusa/server/src/core/customer-account-contract.d.ts +3 -0
  72. package/.medusa/server/src/core/customer-account-contract.js +4 -1
  73. package/.medusa/server/src/core/customer-activation.d.ts +120 -0
  74. package/.medusa/server/src/core/customer-activation.js +169 -0
  75. package/.medusa/server/src/core/customer-cart-resume.d.ts +21 -0
  76. package/.medusa/server/src/core/customer-cart-resume.js +72 -0
  77. package/.medusa/server/src/core/customer-email.d.ts +1 -1
  78. package/.medusa/server/src/core/customer-email.js +4 -1
  79. package/.medusa/server/src/core/native-migration-export.d.ts +6 -0
  80. package/.medusa/server/src/core/native-migration-export.js +105 -0
  81. package/.medusa/server/src/core/order-export.d.ts +11 -0
  82. package/.medusa/server/src/core/order-export.js +297 -0
  83. package/.medusa/server/src/core/review-request.d.ts +61 -0
  84. package/.medusa/server/src/core/review-request.js +105 -0
  85. package/.medusa/server/src/core/review-reward.d.ts +94 -0
  86. package/.medusa/server/src/core/review-reward.js +124 -0
  87. package/.medusa/server/src/core/runtime-health.d.ts +39 -0
  88. package/.medusa/server/src/core/runtime-health.js +250 -0
  89. package/.medusa/server/src/core/storefront-core-config.d.ts +10 -0
  90. package/.medusa/server/src/core/storefront-core-config.js +26 -1
  91. package/.medusa/server/src/core/version.d.ts +2 -2
  92. package/.medusa/server/src/core/version.js +2 -2
  93. package/.medusa/server/src/jobs/abandoned-cart-recovery.d.ts +23 -0
  94. package/.medusa/server/src/jobs/abandoned-cart-recovery.js +137 -0
  95. package/.medusa/server/src/jobs/back-in-stock-reconciliation.d.ts +15 -0
  96. package/.medusa/server/src/jobs/back-in-stock-reconciliation.js +90 -0
  97. package/.medusa/server/src/jobs/dpd-statusdata-sync.d.ts +17 -0
  98. package/.medusa/server/src/jobs/dpd-statusdata-sync.js +107 -0
  99. package/.medusa/server/src/jobs/mpl-push-tracking.d.ts +19 -0
  100. package/.medusa/server/src/jobs/mpl-push-tracking.js +183 -0
  101. package/.medusa/server/src/jobs/mpl-status-sync.d.ts +8 -2
  102. package/.medusa/server/src/jobs/mpl-status-sync.js +12 -7
  103. package/.medusa/server/src/jobs/product-review-request-dispatch.d.ts +28 -0
  104. package/.medusa/server/src/jobs/product-review-request-dispatch.js +84 -0
  105. package/.medusa/server/src/jobs/runtime-heartbeat.d.ts +12 -0
  106. package/.medusa/server/src/jobs/runtime-heartbeat.js +13 -0
  107. package/.medusa/server/src/jobs/shipping-status-sync.d.ts +8 -2
  108. package/.medusa/server/src/jobs/shipping-status-sync.js +11 -14
  109. package/.medusa/server/src/lib/modules/shipping/idempotency.js +3 -3
  110. package/.medusa/server/src/lib/modules/shipping/index.d.ts +1 -0
  111. package/.medusa/server/src/lib/modules/shipping/index.js +2 -1
  112. package/.medusa/server/src/lib/modules/shipping/tracking.d.ts +48 -0
  113. package/.medusa/server/src/lib/modules/shipping/tracking.js +368 -0
  114. package/.medusa/server/src/lib/modules/shipping/webhooks.d.ts +6 -9
  115. package/.medusa/server/src/lib/modules/shipping/webhooks.js +24 -137
  116. package/.medusa/server/src/modules/back-in-stock/index.d.ts +23 -0
  117. package/.medusa/server/src/modules/back-in-stock/index.js +16 -0
  118. package/.medusa/server/src/modules/back-in-stock/migrations/Migration20261101202000.d.ts +5 -0
  119. package/.medusa/server/src/modules/back-in-stock/migrations/Migration20261101202000.js +18 -0
  120. package/.medusa/server/src/modules/back-in-stock/models/back-in-stock-subscription.d.ts +13 -0
  121. package/.medusa/server/src/modules/back-in-stock/models/back-in-stock-subscription.js +23 -0
  122. package/.medusa/server/src/modules/back-in-stock/service.d.ts +22 -0
  123. package/.medusa/server/src/modules/back-in-stock/service.js +12 -0
  124. package/.medusa/server/src/modules/email-center/abandoned-cart-registration.d.ts +1 -0
  125. package/.medusa/server/src/modules/email-center/abandoned-cart-registration.js +27 -0
  126. package/.medusa/server/src/modules/email-center/back-in-stock-registration.d.ts +1 -0
  127. package/.medusa/server/src/modules/email-center/back-in-stock-registration.js +27 -0
  128. package/.medusa/server/src/modules/email-center/defaults.js +7 -1
  129. package/.medusa/server/src/modules/email-center/index.d.ts +2 -0
  130. package/.medusa/server/src/modules/email-center/index.js +3 -1
  131. package/.medusa/server/src/modules/integration-settings/abandoned-cart-registration.d.ts +1 -0
  132. package/.medusa/server/src/modules/integration-settings/abandoned-cart-registration.js +30 -0
  133. package/.medusa/server/src/modules/integration-settings/index.d.ts +1 -0
  134. package/.medusa/server/src/modules/integration-settings/index.js +2 -1
  135. package/.medusa/server/src/modules/integration-settings/storefront-public-registration.js +15 -1
  136. package/.medusa/server/src/modules/product-review/index.d.ts +14 -0
  137. package/.medusa/server/src/modules/product-review/migrations/Migration20261101113000.d.ts +5 -0
  138. package/.medusa/server/src/modules/product-review/migrations/Migration20261101113000.js +28 -0
  139. package/.medusa/server/src/modules/product-review/migrations/Migration20261101114500.d.ts +5 -0
  140. package/.medusa/server/src/modules/product-review/migrations/Migration20261101114500.js +20 -0
  141. package/.medusa/server/src/modules/product-review/migrations/Migration20261101121500.d.ts +5 -0
  142. package/.medusa/server/src/modules/product-review/migrations/Migration20261101121500.js +18 -0
  143. package/.medusa/server/src/modules/product-review/models/product-review-settings.d.ts +15 -0
  144. package/.medusa/server/src/modules/product-review/models/product-review-settings.js +19 -0
  145. package/.medusa/server/src/modules/product-review/models/product-review.d.ts +6 -2
  146. package/.medusa/server/src/modules/product-review/models/product-review.js +7 -3
  147. package/.medusa/server/src/modules/product-review/service.d.ts +22 -1
  148. package/.medusa/server/src/modules/product-review/service.js +3 -2
  149. package/.medusa/server/src/modules/shared-cart/index.d.ts +21 -0
  150. package/.medusa/server/src/modules/shared-cart/index.js +13 -0
  151. package/.medusa/server/src/modules/shared-cart/migrations/Migration20261102010000.d.ts +5 -0
  152. package/.medusa/server/src/modules/shared-cart/migrations/Migration20261102010000.js +16 -0
  153. package/.medusa/server/src/modules/shared-cart/models/shared-cart.d.ts +10 -0
  154. package/.medusa/server/src/modules/shared-cart/models/shared-cart.js +17 -0
  155. package/.medusa/server/src/modules/shared-cart/service.d.ts +14 -0
  156. package/.medusa/server/src/modules/shared-cart/service.js +11 -0
  157. package/.medusa/server/src/modules/shared-cart/settings.d.ts +7 -0
  158. package/.medusa/server/src/modules/shared-cart/settings.js +64 -0
  159. package/.medusa/server/src/providers/dpd/index.d.ts +2 -0
  160. package/.medusa/server/src/providers/dpd/index.js +3 -1
  161. package/.medusa/server/src/providers/dpd/statusdata-ftp.d.ts +16 -0
  162. package/.medusa/server/src/providers/dpd/statusdata-ftp.js +268 -0
  163. package/.medusa/server/src/providers/dpd/statusdata.d.ts +14 -0
  164. package/.medusa/server/src/providers/dpd/statusdata.js +161 -0
  165. package/.medusa/server/src/providers/mpl/client.d.ts +3 -1
  166. package/.medusa/server/src/providers/mpl/client.js +154 -2
  167. package/.medusa/server/src/providers/mpl/service.js +31 -20
  168. package/.medusa/server/src/providers/mpl/types.d.ts +25 -0
  169. package/.medusa/server/src/providers/mpl/types.js +1 -1
  170. package/.medusa/server/src/providers/packeta/index.d.ts +1 -0
  171. package/.medusa/server/src/providers/packeta/index.js +2 -1
  172. package/.medusa/server/src/providers/packeta/push-tracking.d.ts +8 -0
  173. package/.medusa/server/src/providers/packeta/push-tracking.js +96 -0
  174. package/.medusa/server/src/providers/packeta/service.js +22 -2
  175. package/.medusa/server/src/scripts/core-init.d.ts +1 -1
  176. package/.medusa/server/src/scripts/core-init.js +3 -2
  177. package/.medusa/server/src/subscribers/back-in-stock-inventory-changed.d.ts +7 -0
  178. package/.medusa/server/src/subscribers/back-in-stock-inventory-changed.js +65 -0
  179. package/.medusa/server/src/workflows/link-migrated-customer.d.ts +8 -0
  180. package/.medusa/server/src/workflows/link-migrated-customer.js +17 -0
  181. package/README.md +1 -1
  182. package/package.json +30 -8
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ exports.POST = POST;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
7
+ const EXPORT_HEADERS = [
8
+ "Price List Id",
9
+ "Price List Title",
10
+ "Customer Group Ids",
11
+ "Price Id",
12
+ "Variant Id",
13
+ "Variant Sku",
14
+ "Amount",
15
+ "Currency Code",
16
+ "Min Quantity",
17
+ "Max Quantity",
18
+ ];
19
+ async function GET(req, res) {
20
+ const priceLists = await loadPriceLists(req, undefined);
21
+ const rows = priceLists.flatMap((list) => {
22
+ const customerGroups = customerGroupIds(list);
23
+ return (list.prices || []).map((price) => [
24
+ list.id,
25
+ list.title || "",
26
+ customerGroups.join(";"),
27
+ price.id || "",
28
+ price.price_set?.variant?.id || "",
29
+ price.price_set?.variant?.sku || "",
30
+ printable(price.amount),
31
+ price.currency_code || "",
32
+ printable(price.min_quantity),
33
+ printable(price.max_quantity),
34
+ ]);
35
+ });
36
+ res.setHeader("Cache-Control", "private, no-store, max-age=0");
37
+ return res.json({ headers: EXPORT_HEADERS, rows });
38
+ }
39
+ async function POST(req, res) {
40
+ const body = (req.body || {});
41
+ const rows = Array.isArray(body.rows) ? body.rows : [];
42
+ const dryRun = body.dry_run !== false;
43
+ const mode = body.mode === "skip" ? "skip" : "update";
44
+ if (!rows.length)
45
+ return res.status(400).json({ message: "Nincs importálható Price List ársor." });
46
+ if (rows.length > 10_000)
47
+ return res.status(400).json({ message: "Egy Price List import legfeljebb 10 000 sort tartalmazhat." });
48
+ const priceListIds = [...new Set(rows.map((row) => cell(row, "Price List Id")).filter(Boolean))];
49
+ if (!priceListIds.length)
50
+ return res.status(400).json({ message: "A Price List Id oszlop kötelező." });
51
+ const priceLists = await loadPriceLists(req, priceListIds);
52
+ const listMap = new Map(priceLists.map((list) => [list.id, list]));
53
+ const operations = new Map();
54
+ const errors = [];
55
+ const seen = new Set();
56
+ let skipped = 0;
57
+ for (let index = 0; index < rows.length; index++) {
58
+ const source = rows[index] || {};
59
+ const rowNumber = index + 2;
60
+ const priceListId = cell(source, "Price List Id");
61
+ const priceId = cell(source, "Price Id");
62
+ const variantId = cell(source, "Variant Id");
63
+ const currencyCode = cell(source, "Currency Code").toLowerCase();
64
+ const amount = parseRequiredNumber(source, "Amount");
65
+ const minQuantity = parseOptionalNumber(source, "Min Quantity");
66
+ const maxQuantity = parseOptionalNumber(source, "Max Quantity");
67
+ if (!priceListId || !listMap.has(priceListId)) {
68
+ errors.push({ row: rowNumber, message: `Ismeretlen vagy hiányzó Price List Id: ${priceListId || "—"}` });
69
+ continue;
70
+ }
71
+ if (!variantId) {
72
+ errors.push({ row: rowNumber, message: "Hiányzó Variant Id." });
73
+ continue;
74
+ }
75
+ if (!currencyCode) {
76
+ errors.push({ row: rowNumber, message: "Hiányzó Currency Code." });
77
+ continue;
78
+ }
79
+ if (amount == null || amount < 0) {
80
+ errors.push({ row: rowNumber, message: "Az Amount mezőnek 0 vagy pozitív számnak kell lennie." });
81
+ continue;
82
+ }
83
+ if (minQuantity === false || maxQuantity === false) {
84
+ errors.push({ row: rowNumber, message: "A Min Quantity / Max Quantity csak szám vagy üres érték lehet." });
85
+ continue;
86
+ }
87
+ const list = listMap.get(priceListId);
88
+ const existingIds = new Set((list.prices || []).map((price) => String(price.id || "")).filter(Boolean));
89
+ if (priceId && !existingIds.has(priceId)) {
90
+ errors.push({ row: rowNumber, message: `A Price Id (${priceId}) nem ehhez a Price Listhez tartozik.` });
91
+ continue;
92
+ }
93
+ const identity = priceId
94
+ ? `${priceListId}:price:${priceId}`
95
+ : `${priceListId}:new:${variantId}:${currencyCode}:${minQuantity ?? ""}:${maxQuantity ?? ""}`;
96
+ if (seen.has(identity)) {
97
+ errors.push({ row: rowNumber, message: "Duplikált Price List ársor a fájlban." });
98
+ continue;
99
+ }
100
+ seen.add(identity);
101
+ const operation = operations.get(priceListId) || { create: [], update: [] };
102
+ const price = {
103
+ amount,
104
+ currency_code: currencyCode,
105
+ variant_id: variantId,
106
+ ...(minQuantity == null ? {} : { min_quantity: minQuantity }),
107
+ ...(maxQuantity == null ? {} : { max_quantity: maxQuantity }),
108
+ };
109
+ if (priceId) {
110
+ if (mode === "skip") {
111
+ skipped++;
112
+ }
113
+ else {
114
+ operation.update.push({ id: priceId, ...price });
115
+ }
116
+ }
117
+ else {
118
+ operation.create.push(price);
119
+ }
120
+ operations.set(priceListId, operation);
121
+ }
122
+ const created = [...operations.values()].reduce((sum, operation) => sum + operation.create.length, 0);
123
+ const updated = [...operations.values()].reduce((sum, operation) => sum + operation.update.length, 0);
124
+ if (!dryRun) {
125
+ for (const [priceListId, operation] of operations) {
126
+ if (!operation.create.length && !operation.update.length)
127
+ continue;
128
+ await (0, core_flows_1.batchPriceListPricesWorkflow)(req.scope).run({
129
+ input: {
130
+ data: {
131
+ id: priceListId,
132
+ create: operation.create,
133
+ update: operation.update,
134
+ delete: [],
135
+ },
136
+ },
137
+ });
138
+ }
139
+ }
140
+ return res.json({
141
+ dry_run: dryRun,
142
+ mode,
143
+ total: rows.length,
144
+ created,
145
+ updated,
146
+ skipped,
147
+ failed: errors.length,
148
+ errors: errors.slice(0, 200),
149
+ });
150
+ }
151
+ async function loadPriceLists(req, ids) {
152
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
153
+ const { data } = await query.graph({
154
+ entity: "price_list",
155
+ fields: [
156
+ "id",
157
+ "title",
158
+ "type",
159
+ "status",
160
+ "rules",
161
+ "prices.id",
162
+ "prices.amount",
163
+ "prices.currency_code",
164
+ "prices.min_quantity",
165
+ "prices.max_quantity",
166
+ "prices.price_set.variant.id",
167
+ "prices.price_set.variant.sku",
168
+ ],
169
+ filters: ids?.length ? { id: ids } : {},
170
+ pagination: { take: ids?.length ? Math.min(ids.length, 10_000) : 1_000 },
171
+ });
172
+ return (data || []);
173
+ }
174
+ function customerGroupIds(list) {
175
+ const raw = list.rules?.["customer.groups.id"];
176
+ if (Array.isArray(raw))
177
+ return raw.map(String);
178
+ if (raw == null || raw === "")
179
+ return [];
180
+ return [String(raw)];
181
+ }
182
+ function cell(row, wanted) {
183
+ const key = Object.keys(row).find((candidate) => candidate.trim().toLowerCase() === wanted.toLowerCase());
184
+ const value = key ? row[key] : undefined;
185
+ return value == null ? "" : String(value).trim();
186
+ }
187
+ function parseRequiredNumber(row, key) {
188
+ const raw = cell(row, key).replace(",", ".");
189
+ if (!raw)
190
+ return null;
191
+ const value = Number(raw);
192
+ return Number.isFinite(value) ? value : null;
193
+ }
194
+ function parseOptionalNumber(row, key) {
195
+ const raw = cell(row, key).replace(",", ".");
196
+ if (!raw)
197
+ return null;
198
+ const value = Number(raw);
199
+ return Number.isFinite(value) ? value : false;
200
+ }
201
+ function printable(value) {
202
+ return value == null ? "" : String(value);
203
+ }
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Byb2R1Y3QtbWlncmF0aW9uL3ByaWNlLWxpc3QtcHJpY2VzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBeUNBLGtCQW9CQztBQUVELG9CQXdIQztBQXRMRCxxREFBcUU7QUFDckUsNERBQTBFO0FBMEIxRSxNQUFNLGNBQWMsR0FBRztJQUNyQixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLG9CQUFvQjtJQUNwQixVQUFVO0lBQ1YsWUFBWTtJQUNaLGFBQWE7SUFDYixRQUFRO0lBQ1IsZUFBZTtJQUNmLGNBQWM7SUFDZCxjQUFjO0NBQ2YsQ0FBQTtBQUVNLEtBQUssVUFBVSxHQUFHLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUMvRCxNQUFNLFVBQVUsR0FBRyxNQUFNLGNBQWMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDdkQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzdDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLEVBQUU7WUFDUCxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDaEIsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDeEIsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFO1lBQ2QsS0FBSyxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUU7WUFDbEMsS0FBSyxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUU7WUFDbkMsU0FBUyxDQUFDLEtBQUssQ0FBQyxN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
@@ -0,0 +1,2 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function GET(req: MedusaRequest, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ const native_migration_export_1 = require("../../../../core/native-migration-export");
5
+ async function GET(req, res) {
6
+ try {
7
+ const exported = await (0, native_migration_export_1.exportNativeMigrationCsv)(req.scope, "products");
8
+ res.setHeader("Cache-Control", "private, no-store, max-age=0");
9
+ res.setHeader("Content-Type", "text/csv; charset=utf-8");
10
+ res.setHeader("Content-Disposition", `attachment; filename="${safeFilename(exported.filename)}"`);
11
+ return res.send(exported.csv);
12
+ }
13
+ catch (error) {
14
+ return res.status(500).json({
15
+ message: error instanceof Error
16
+ ? error.message
17
+ : "A natív termékexport nem készíthető el.",
18
+ });
19
+ }
20
+ }
21
+ function safeFilename(value) {
22
+ return value.replace(/[\r\n"\\/]+/g, "-") || "products.csv";
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Byb2R1Y3QtbWlncmF0aW9uL3Byb2R1Y3RzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBSUEsa0JBa0JDO0FBcEJELHNGQUFtRjtBQUU1RSxLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDL0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFBLGtEQUF3QixFQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDdEUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsOEJBQThCLENBQUMsQ0FBQTtRQUM5RCxHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFBO1FBQ3hELEdBQUcsQ0FBQyxTQUFTLENBQ1gscUJBQXFCLEVBQ3JCLHlCQUF5QixZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQzVELENBQUE7UUFDRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQy9CLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMxQixPQUFPLEVBQ0wsS0FBSyxZQUFZLEtBQUs7Z0JBQ3BCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTztnQkFDZixDQUFDLENBQUMseUNBQXlDO1NBQ2hELENBQUMsQ0FBQTtJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBYTtJQUNqQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxJQUFJLGNBQWMsQ0FBQTtBQUM3RCxDQUFDIn0=
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.POST = POST;
4
4
  const core_audit_1 = require("../../../../modules/core-audit");
5
5
  const product_review_1 = require("../../../../modules/product-review");
6
+ const review_reward_1 = require("../../../../core/review-reward");
6
7
  async function POST(req, res) {
7
8
  const service = req.scope.resolve(product_review_1.PRODUCT_REVIEW_MODULE);
8
9
  const status = text(req.body?.status, 40);
@@ -12,13 +13,44 @@ async function POST(req, res) {
12
13
  const actorId = req.auth_context?.actor_id || null;
13
14
  try {
14
15
  const review = await service.retrieveProductReview(req.params.id);
15
- const updated = await service.updateProductReviews({
16
+ let updated = await service.updateProductReviews({
16
17
  id: review.id,
17
18
  status,
18
19
  moderation_note: text(req.body?.moderation_note, 2000) || null,
19
20
  moderated_at: new Date(),
20
21
  moderated_by: actorId,
21
22
  });
23
+ let rewardError = null;
24
+ if (status === "published" && review.status !== "published" && !review.reward_coupon_code) {
25
+ try {
26
+ const [settings] = await service.listProductReviewSettings({}, { take: 1 });
27
+ const reward = await (0, review_reward_1.issuePublishedReviewReward)({
28
+ container: req.scope,
29
+ review: updated,
30
+ settings: settings || { reward_enabled: true, reward_type: "percentage", reward_value: 10, reward_currency_code: "huf" },
31
+ });
32
+ if (reward && !reward.existing) {
33
+ updated = await service.updateProductReviews({
34
+ id: review.id,
35
+ reward_promotion_id: reward.id,
36
+ reward_coupon_code: reward.code,
37
+ reward_issued_at: new Date(),
38
+ });
39
+ try {
40
+ const mail = await (0, review_reward_1.sendPublishedReviewRewardEmail)({ container: req.scope, review: updated, reward: reward });
41
+ if (!mail?.skipped) {
42
+ updated = await service.updateProductReviews({ id: review.id, reward_email_sent_at: new Date() });
43
+ }
44
+ }
45
+ catch {
46
+ // A kupon létrejött; e-mail hiba miatt nem generálunk új kupont.
47
+ }
48
+ }
49
+ }
50
+ catch (error) {
51
+ rewardError = error instanceof Error ? error.message : "Az értékelési jutalom létrehozása nem sikerült.";
52
+ }
53
+ }
22
54
  await (0, core_audit_1.writeCoreAudit)(req.scope, {
23
55
  action: `product_review.${status}`,
24
56
  resourceType: "product_review",
@@ -26,9 +58,9 @@ async function POST(req, res) {
26
58
  integration: "product-review",
27
59
  actorId,
28
60
  summary: `Termékértékelés moderálva: ${status}.`,
29
- details: { product_id: review.product_id, customer_id: review.customer_id, status },
61
+ details: { product_id: review.product_id, customer_id: review.customer_id, status, reward_error: rewardError },
30
62
  });
31
- return res.json({ review: updated });
63
+ return res.json({ review: updated, reward_error: rewardError });
32
64
  }
33
65
  catch (error) {
34
66
  return res.status(400).json({ message: error instanceof Error ? error.message : "Az értékelés nem moderálható." });
@@ -37,4 +69,4 @@ async function POST(req, res) {
37
69
  function text(value, max) {
38
70
  return typeof value === "string" ? value.trim().slice(0, max) : "";
39
71
  }
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Byb2R1Y3QtcmV2aWV3cy9baWRdL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBVUEsb0JBZ0NDO0FBekNELCtEQUErRDtBQUMvRCx1RUFJMkM7QUFJcEMsS0FBSyxVQUFVLElBQUksQ0FBQyxHQUF3QixFQUFFLEdBQW1CO0lBQ3RFLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLHNDQUFxQixDQUF5QixDQUFBO0lBQ2hGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUN6QyxJQUFJLENBQUUsd0NBQTZDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDckUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxDQUFDLENBQUE7SUFDNUUsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFJLEdBQTJELENBQUMsWUFBWSxFQUFFLFFBQVEsSUFBSSxJQUFJLENBQUE7SUFDM0csSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQW1DLENBQUE7UUFDbkcsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsb0JBQW9CLENBQUM7WUFDakQsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ2IsTUFBTTtZQUNOLGVBQWUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSTtZQUM5RCxZQUFZLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDeEIsWUFBWSxFQUFFLE9BQU87U0FDYixDQUFtQyxDQUFBO1FBRTdDLE1BQU0sSUFBQSwyQkFBYyxFQUFDLEdBQUcsQ0FBQyxLQUFjLEVBQUU7WUFDdkMsTUFBTSxFQUFFLGtCQUFrQixNQUFNLEVBQUU7WUFDbEMsWUFBWSxFQUFFLGdCQUFnQjtZQUM5QixVQUFVLEVBQUUsTUFBTSxDQUFDLEVBQUU7WUFDckIsV0FBVyxFQUFFLGdCQUFnQjtZQUM3QixPQUFPO1lBQ1AsT0FBTyxFQUFFLDhCQUE4QixNQUFNLEdBQUc7WUFDaEQsT0FBTyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFO1NBQ3BGLENBQUMsQ0FBQTtRQUVGLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQ3RDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQywrQkFBK0IsRUFBRSxDQUFDLENBQUE7SUFDcEgsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLElBQUksQ0FBQyxLQUFjLEVBQUUsR0FBVztJQUN2QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtBQUNwRSxDQUFDIn0=
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Byb2R1Y3QtcmV2aWV3cy9baWRdL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBY0Esb0JBOERDO0FBM0VELCtEQUErRDtBQUMvRCx1RUFJMkM7QUFDM0Msa0VBR3VDO0FBSWhDLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBd0IsRUFBRSxHQUFtQjtJQUN0RSxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxzQ0FBcUIsQ0FBeUIsQ0FBQTtJQUNoRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDekMsSUFBSSxDQUFFLHdDQUE2QyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3JFLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsQ0FBQyxDQUFBO0lBQzVFLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBSSxHQUEyRCxDQUFDLFlBQVksRUFBRSxRQUFRLElBQUksSUFBSSxDQUFBO0lBQzNHLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFtQyxDQUFBO1FBQ25HLElBQUksT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLG9CQUFvQixDQUFDO1lBQy9DLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNiLE1BQU07WUFDTixlQUFlLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUk7WUFDOUQsWUFBWSxFQUFFLElBQUksSUFB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
@@ -0,0 +1,3 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function GET(req: MedusaRequest, res: MedusaResponse): Promise<MedusaResponse>;
3
+ export declare function POST(req: MedusaRequest, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ exports.POST = POST;
5
+ const product_review_1 = require("../../../../modules/product-review");
6
+ const SETTINGS_ID = "product-review-settings";
7
+ async function GET(req, res) {
8
+ const service = req.scope.resolve(product_review_1.PRODUCT_REVIEW_MODULE);
9
+ const settings = await getOrCreateSettings(service);
10
+ return res.json({ settings });
11
+ }
12
+ async function POST(req, res) {
13
+ const service = req.scope.resolve(product_review_1.PRODUCT_REVIEW_MODULE);
14
+ const current = await getOrCreateSettings(service);
15
+ const body = (req.body || {});
16
+ const rewardType = body.reward_type === "fixed" ? "fixed" : "percentage";
17
+ const rawValue = Number(body.reward_value ?? current.reward_value ?? 5);
18
+ const rewardValue = Number.isFinite(rawValue) && rawValue > 0
19
+ ? (rewardType === "percentage" ? Math.min(rawValue, 100) : rawValue)
20
+ : current.reward_value || 5;
21
+ const trigger = body.request_trigger === "order" || body.request_trigger === "fulfillment" || body.request_trigger === "delivery"
22
+ ? body.request_trigger
23
+ : (current.request_trigger || "delivery");
24
+ const rawDelay = Number(body.request_delay_days ?? current.request_delay_days ?? 2);
25
+ const requestDelayDays = Number.isFinite(rawDelay) ? Math.max(0, Math.min(90, Math.trunc(rawDelay))) : 2;
26
+ const rawExpiry = Number(body.reward_coupon_expiry_days ?? current.reward_coupon_expiry_days ?? 30);
27
+ const rewardCouponExpiryDays = Number.isFinite(rawExpiry) ? Math.max(0, Math.min(3650, Math.trunc(rawExpiry))) : 30;
28
+ const settings = await service.updateProductReviewSettings({
29
+ id: current.id,
30
+ auto_publish: body.auto_publish === true,
31
+ reward_enabled: body.reward_enabled !== false,
32
+ reward_type: rewardType,
33
+ reward_value: rewardValue,
34
+ reward_currency_code: String(body.reward_currency_code || current.reward_currency_code || "huf").trim().toLowerCase() || "huf",
35
+ reward_coupon_expiry_days: rewardCouponExpiryDays,
36
+ reward_once_per_order: body.reward_once_per_order !== false,
37
+ reward_email_enabled: body.reward_email_enabled !== false,
38
+ request_email_enabled: body.request_email_enabled !== false,
39
+ request_trigger: trigger,
40
+ request_delay_days: requestDelayDays,
41
+ });
42
+ return res.json({ settings });
43
+ }
44
+ async function getOrCreateSettings(service) {
45
+ const [existing] = await service.listProductReviewSettings({}, { take: 1 });
46
+ if (existing)
47
+ return existing;
48
+ return service.createProductReviewSettings({
49
+ id: SETTINGS_ID,
50
+ auto_publish: false,
51
+ reward_enabled: true,
52
+ reward_type: "percentage",
53
+ reward_value: 5,
54
+ reward_currency_code: "huf",
55
+ reward_coupon_expiry_days: 30,
56
+ reward_once_per_order: true,
57
+ reward_email_enabled: true,
58
+ request_email_enabled: true,
59
+ request_trigger: "delivery",
60
+ request_delay_days: 2,
61
+ });
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Byb2R1Y3QtcmV2aWV3cy9zZXR0aW5ncy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUtBLGtCQUlDO0FBRUQsb0JBaUNDO0FBM0NELHVFQUFxRztBQUVyRyxNQUFNLFdBQVcsR0FBRyx5QkFBeUIsQ0FBQTtBQUV0QyxLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDL0QsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsc0NBQXFCLENBQXlCLENBQUE7SUFDaEYsTUFBTSxRQUFRLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNuRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO0FBQy9CLENBQUM7QUFFTSxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDaEUsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsc0NBQXFCLENBQXlCLENBQUE7SUFDaEYsTUFBTSxPQUFPLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNsRCxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUE0QixDQUFBO0lBQ3hELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQTtJQUN4RSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ3ZFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMs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
@@ -0,0 +1,5 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function GET(req: MedusaRequest, res: MedusaResponse): Promise<MedusaResponse>;
3
+ export declare function POST(req: MedusaRequest<{
4
+ ttl_days?: number;
5
+ }>, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ exports.POST = POST;
5
+ const integration_settings_1 = require("../../../../modules/integration-settings");
6
+ const settings_1 = require("../../../../modules/shared-cart/settings");
7
+ async function GET(req, res) {
8
+ try {
9
+ const store = req.scope.resolve(integration_settings_1.INTEGRATION_SETTINGS_MODULE);
10
+ const ttl_days = await (0, settings_1.getSharedCartTtlDays)(store);
11
+ return res.json({ ttl_days });
12
+ }
13
+ catch (error) {
14
+ return res.status(500).json({
15
+ message: error instanceof Error ? error.message : "A kosármegosztás beállítása nem tölthető be.",
16
+ });
17
+ }
18
+ }
19
+ async function POST(req, res) {
20
+ try {
21
+ const store = req.scope.resolve(integration_settings_1.INTEGRATION_SETTINGS_MODULE);
22
+ const ttl_days = await (0, settings_1.saveSharedCartTtlDays)(store, Number(req.body?.ttl_days));
23
+ return res.json({ ttl_days });
24
+ }
25
+ catch (error) {
26
+ return res.status(400).json({
27
+ message: error instanceof Error ? error.message : "A kosármegosztás beállítása nem menthető.",
28
+ });
29
+ }
30
+ }
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3NoYXJlZC1jYXJ0L3NldHRpbmdzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBVUEsa0JBVUM7QUFFRCxvQkFhQztBQWxDRCxtRkFHaUQ7QUFDakQsdUVBR2lEO0FBRTFDLEtBQUssVUFBVSxHQUFHLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUMvRCxJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrREFBMkIsQ0FBd0MsQ0FBQTtRQUNuRyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEsK0JBQW9CLEVBQUMsS0FBSyxDQUFDLENBQUE7UUFDbEQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUMvQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsT0FBTyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLDhDQUE4QztTQUNqRyxDQUFDLENBQUE7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVNLEtBQUssVUFBVSxJQUFJLENBQ3hCLEdBQXlDLEVBQ3pDLEdBQW1CO0lBRW5CLElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGtEQUEyQixDQUF3QyxDQUFBO1FBQ25HLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSxnQ0FBcUIsRUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUMvRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQy9CLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMxQixPQUFPLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsMkNBQTJDO1NBQzlGLENBQUMsQ0FBQTtJQUNKLENBQUM7QUFDSCxDQUFDIn0=
@@ -0,0 +1,2 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function GET(_req: MedusaRequest, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ const runtime_health_1 = require("../../../core/runtime-health");
5
+ async function GET(_req, res) {
6
+ try {
7
+ res.setHeader("Cache-Control", "private, no-store, max-age=0");
8
+ return res.json((0, runtime_health_1.collectRuntimeHealth)());
9
+ }
10
+ catch (error) {
11
+ return res.status(500).json({
12
+ message: error instanceof Error
13
+ ? error.message
14
+ : "A runtime állapot nem ellenőrizhető.",
15
+ });
16
+ }
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3N5c3RlbS1ydW50aW1lL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBSUEsa0JBWUM7QUFkRCxpRUFBbUU7QUFFNUQsS0FBSyxVQUFVLEdBQUcsQ0FBQyxJQUFtQixFQUFFLEdBQW1CO0lBQ2hFLElBQUksQ0FBQztRQUNILEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLDhCQUE4QixDQUFDLENBQUE7UUFDOUQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUEscUNBQW9CLEdBQUUsQ0FBQyxDQUFBO0lBQ3pDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMxQixPQUFPLEVBQ0wsS0FBSyxZQUFZLEtBQUs7Z0JBQ3BCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTztnQkFDZixDQUFDLENBQUMsc0NBQXNDO1NBQzdDLENBQUMsQ0FBQTtJQUNKLENBQUM7QUFDSCxDQUFDIn0=
@@ -0,0 +1,2 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function POST(req: MedusaRequest, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const packeta_1 = require("../../../../providers/packeta");
5
+ const shipping_1 = require("../../../../lib/modules/shipping");
6
+ const integration_operation_1 = require("../../../../modules/integration-operation");
7
+ function headerValue(value) {
8
+ return Array.isArray(value) ? value[0] : value;
9
+ }
10
+ async function POST(req, res) {
11
+ const rawBody = req.rawBody
12
+ ? req.rawBody.toString("utf8")
13
+ : JSON.stringify(req.body ?? {});
14
+ const timestamp = headerValue(req.headers["x-webhook-timestamp"]);
15
+ const signature = headerValue(req.headers["x-webhook-signature"]);
16
+ const eventId = headerValue(req.headers["x-webhook-event-id"]);
17
+ if (!(0, packeta_1.verifyPacketaPushSignature)({
18
+ rawBody,
19
+ timestamp,
20
+ signature,
21
+ signingKey: process.env.PACKETA_WEBHOOK_SIGNING_KEY,
22
+ })) {
23
+ return res.status(401).json({ message: "Érvénytelen Packeta webhook aláírás." });
24
+ }
25
+ let event;
26
+ try {
27
+ event = (0, packeta_1.packetaPushEvent)(req.body, eventId);
28
+ }
29
+ catch (error) {
30
+ return res.status(400).json({
31
+ message: error instanceof Error ? error.message : "Érvénytelen Packeta tracking esemény.",
32
+ });
33
+ }
34
+ try {
35
+ const orderService = req.scope.resolve("order");
36
+ const operationStore = req.scope.resolve(integration_operation_1.INTEGRATION_OPERATION_MODULE);
37
+ const result = await (0, shipping_1.applyNormalizedTrackingEvent)({
38
+ orderService,
39
+ operationStore,
40
+ event,
41
+ });
42
+ if (!result) {
43
+ // Packeta retries non-2xx responses with exponential backoff. If the
44
+ // order/operation is not visible yet, keep the signed event retryable.
45
+ return res.status(503).json({ received: true, matched: false });
46
+ }
47
+ return res.status(200).json({ received: true, matched: true, ...result });
48
+ }
49
+ catch (error) {
50
+ return res.status(503).json({
51
+ message: error instanceof Error ? error.message : "Packeta tracking feldolgozási hiba.",
52
+ });
53
+ }
54
+ }
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2hvb2tzL3BhY2tldGEvc3RhdHVzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBa0JBLG9CQXVEQztBQXhFRCwyREFHc0M7QUFDdEMsK0RBR3lDO0FBQ3pDLHFGQUdrRDtBQUVsRCxTQUFTLFdBQVcsQ0FBQyxLQUFvQztJQUN2RCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBO0FBQ2hELENBQUM7QUFFTSxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDaEUsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU87UUFDekIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUM5QixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ2xDLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FDM0IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBa0MsQ0FDcEUsQ0FBQTtJQUNELE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FDM0IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBa0MsQ0FDcEUsQ0FBQTtJQUNELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FDekIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBa0MsQ0FDbkUsQ0FBQTtJQUVELElBQUksQ0FBQyxJQUFBLG9DQUEwQixFQUFDO1FBQzlCLE9BQU87UUFDUCxTQUFTO1FBQ1QsU0FBUztRQUNULFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQjtLQUNwRCxDQUFDLEVBQUUsQ0FBQztRQUNILE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsQ0FBQyxDQUFBO0lBQ2xGLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQTtJQUNULElBQUksQ0FBQztRQUNILEtBQUssR0FBRyxJQUFBLDBCQUFnQixFQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLE9BQU8sRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyx1Q0FBdUM7U0FDMUYsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBb0MsQ0FBQTtRQUNsRixNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDdEMsb0RBQTRCLENBQ0UsQ0FBQTtRQUNoQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsdUNBQTRCLEVBQUM7WUFDaEQsWUFBWTtZQUNaLGNBQWM7WUFDZCxLQUFLO1NBQ04sQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1oscUVBQXFFO1lBQ3JFLHVFQUF1RTtZQUN2RSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUNqRSxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUE7SUFDM0UsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLE9BQU8sRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxxQ0FBcUM7U0FDeEYsQ0FBQyxDQUFBO0lBQ0osQ0FBQztBQUNILENBQUMifQ==