@hszrdm/core 1.4.0 → 1.5.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 (141) hide show
  1. package/.medusa/server/src/admin/index.js +5582 -3769
  2. package/.medusa/server/src/admin/index.mjs +5582 -3769
  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/customer-activation/route.d.ts +2 -0
  6. package/.medusa/server/src/api/admin/customer-activation/route.js +97 -0
  7. package/.medusa/server/src/api/admin/customer-import/route.d.ts +2 -0
  8. package/.medusa/server/src/api/admin/customer-import/route.js +166 -0
  9. package/.medusa/server/src/api/admin/order-export/route.d.ts +2 -0
  10. package/.medusa/server/src/api/admin/order-export/route.js +88 -0
  11. package/.medusa/server/src/api/admin/product-migration/inventory/route.d.ts +3 -0
  12. package/.medusa/server/src/api/admin/product-migration/inventory/route.js +164 -0
  13. package/.medusa/server/src/api/admin/product-migration/price-list-prices/route.d.ts +3 -0
  14. package/.medusa/server/src/api/admin/product-migration/price-list-prices/route.js +204 -0
  15. package/.medusa/server/src/api/admin/product-migration/products/route.d.ts +2 -0
  16. package/.medusa/server/src/api/admin/product-migration/products/route.js +24 -0
  17. package/.medusa/server/src/api/admin/product-reviews/[id]/route.js +36 -4
  18. package/.medusa/server/src/api/admin/product-reviews/settings/route.d.ts +3 -0
  19. package/.medusa/server/src/api/admin/product-reviews/settings/route.js +63 -0
  20. package/.medusa/server/src/api/admin/system-runtime/route.d.ts +2 -0
  21. package/.medusa/server/src/api/admin/system-runtime/route.js +18 -0
  22. package/.medusa/server/src/api/hooks/packeta/status/route.d.ts +2 -0
  23. package/.medusa/server/src/api/hooks/packeta/status/route.js +55 -0
  24. package/.medusa/server/src/api/middlewares.js +16 -1
  25. package/.medusa/server/src/api/store/abandoned-cart/recover/route.d.ts +2 -0
  26. package/.medusa/server/src/api/store/abandoned-cart/recover/route.js +37 -0
  27. package/.medusa/server/src/api/store/back-in-stock/route.d.ts +8 -0
  28. package/.medusa/server/src/api/store/back-in-stock/route.js +124 -0
  29. package/.medusa/server/src/api/store/customer-activation/complete/route.d.ts +2 -0
  30. package/.medusa/server/src/api/store/customer-activation/complete/route.js +96 -0
  31. package/.medusa/server/src/api/store/customer-activation/route.d.ts +2 -0
  32. package/.medusa/server/src/api/store/customer-activation/route.js +34 -0
  33. package/.medusa/server/src/api/store/products/[id]/reviews/route.d.ts +1 -0
  34. package/.medusa/server/src/api/store/products/[id]/reviews/route.js +76 -34
  35. package/.medusa/server/src/api/store/review-request/route.d.ts +2 -0
  36. package/.medusa/server/src/api/store/review-request/route.js +60 -0
  37. package/.medusa/server/src/core/abandoned-cart.d.ts +64 -0
  38. package/.medusa/server/src/core/abandoned-cart.js +197 -0
  39. package/.medusa/server/src/core/back-in-stock.d.ts +51 -0
  40. package/.medusa/server/src/core/back-in-stock.js +107 -0
  41. package/.medusa/server/src/core/checkout-contract.d.ts +1 -0
  42. package/.medusa/server/src/core/checkout-contract.js +2 -1
  43. package/.medusa/server/src/core/customer-account-contract.d.ts +3 -0
  44. package/.medusa/server/src/core/customer-account-contract.js +4 -1
  45. package/.medusa/server/src/core/customer-activation.d.ts +120 -0
  46. package/.medusa/server/src/core/customer-activation.js +169 -0
  47. package/.medusa/server/src/core/customer-email.d.ts +1 -1
  48. package/.medusa/server/src/core/customer-email.js +4 -1
  49. package/.medusa/server/src/core/native-migration-export.d.ts +6 -0
  50. package/.medusa/server/src/core/native-migration-export.js +105 -0
  51. package/.medusa/server/src/core/order-export.d.ts +11 -0
  52. package/.medusa/server/src/core/order-export.js +297 -0
  53. package/.medusa/server/src/core/review-request.d.ts +61 -0
  54. package/.medusa/server/src/core/review-request.js +105 -0
  55. package/.medusa/server/src/core/review-reward.d.ts +94 -0
  56. package/.medusa/server/src/core/review-reward.js +124 -0
  57. package/.medusa/server/src/core/runtime-health.d.ts +39 -0
  58. package/.medusa/server/src/core/runtime-health.js +250 -0
  59. package/.medusa/server/src/core/storefront-core-config.d.ts +10 -0
  60. package/.medusa/server/src/core/storefront-core-config.js +26 -1
  61. package/.medusa/server/src/core/version.d.ts +2 -2
  62. package/.medusa/server/src/core/version.js +2 -2
  63. package/.medusa/server/src/jobs/abandoned-cart-recovery.d.ts +23 -0
  64. package/.medusa/server/src/jobs/abandoned-cart-recovery.js +138 -0
  65. package/.medusa/server/src/jobs/back-in-stock-reconciliation.d.ts +15 -0
  66. package/.medusa/server/src/jobs/back-in-stock-reconciliation.js +90 -0
  67. package/.medusa/server/src/jobs/dpd-statusdata-sync.d.ts +17 -0
  68. package/.medusa/server/src/jobs/dpd-statusdata-sync.js +107 -0
  69. package/.medusa/server/src/jobs/mpl-push-tracking.d.ts +19 -0
  70. package/.medusa/server/src/jobs/mpl-push-tracking.js +183 -0
  71. package/.medusa/server/src/jobs/mpl-status-sync.d.ts +8 -2
  72. package/.medusa/server/src/jobs/mpl-status-sync.js +12 -7
  73. package/.medusa/server/src/jobs/product-review-request-dispatch.d.ts +28 -0
  74. package/.medusa/server/src/jobs/product-review-request-dispatch.js +84 -0
  75. package/.medusa/server/src/jobs/runtime-heartbeat.d.ts +12 -0
  76. package/.medusa/server/src/jobs/runtime-heartbeat.js +13 -0
  77. package/.medusa/server/src/jobs/shipping-status-sync.d.ts +8 -2
  78. package/.medusa/server/src/jobs/shipping-status-sync.js +11 -14
  79. package/.medusa/server/src/lib/modules/shipping/idempotency.js +3 -3
  80. package/.medusa/server/src/lib/modules/shipping/index.d.ts +1 -0
  81. package/.medusa/server/src/lib/modules/shipping/index.js +2 -1
  82. package/.medusa/server/src/lib/modules/shipping/tracking.d.ts +48 -0
  83. package/.medusa/server/src/lib/modules/shipping/tracking.js +368 -0
  84. package/.medusa/server/src/lib/modules/shipping/webhooks.d.ts +6 -9
  85. package/.medusa/server/src/lib/modules/shipping/webhooks.js +24 -137
  86. package/.medusa/server/src/modules/back-in-stock/index.d.ts +23 -0
  87. package/.medusa/server/src/modules/back-in-stock/index.js +16 -0
  88. package/.medusa/server/src/modules/back-in-stock/migrations/Migration20261101202000.d.ts +5 -0
  89. package/.medusa/server/src/modules/back-in-stock/migrations/Migration20261101202000.js +18 -0
  90. package/.medusa/server/src/modules/back-in-stock/models/back-in-stock-subscription.d.ts +13 -0
  91. package/.medusa/server/src/modules/back-in-stock/models/back-in-stock-subscription.js +23 -0
  92. package/.medusa/server/src/modules/back-in-stock/service.d.ts +22 -0
  93. package/.medusa/server/src/modules/back-in-stock/service.js +12 -0
  94. package/.medusa/server/src/modules/email-center/abandoned-cart-registration.d.ts +1 -0
  95. package/.medusa/server/src/modules/email-center/abandoned-cart-registration.js +27 -0
  96. package/.medusa/server/src/modules/email-center/back-in-stock-registration.d.ts +1 -0
  97. package/.medusa/server/src/modules/email-center/back-in-stock-registration.js +27 -0
  98. package/.medusa/server/src/modules/email-center/defaults.js +7 -1
  99. package/.medusa/server/src/modules/email-center/index.d.ts +2 -0
  100. package/.medusa/server/src/modules/email-center/index.js +3 -1
  101. package/.medusa/server/src/modules/integration-settings/abandoned-cart-registration.d.ts +1 -0
  102. package/.medusa/server/src/modules/integration-settings/abandoned-cart-registration.js +30 -0
  103. package/.medusa/server/src/modules/integration-settings/index.d.ts +1 -0
  104. package/.medusa/server/src/modules/integration-settings/index.js +2 -1
  105. package/.medusa/server/src/modules/integration-settings/storefront-public-registration.js +15 -1
  106. package/.medusa/server/src/modules/product-review/index.d.ts +14 -0
  107. package/.medusa/server/src/modules/product-review/migrations/Migration20261101113000.d.ts +5 -0
  108. package/.medusa/server/src/modules/product-review/migrations/Migration20261101113000.js +28 -0
  109. package/.medusa/server/src/modules/product-review/migrations/Migration20261101114500.d.ts +5 -0
  110. package/.medusa/server/src/modules/product-review/migrations/Migration20261101114500.js +20 -0
  111. package/.medusa/server/src/modules/product-review/migrations/Migration20261101121500.d.ts +5 -0
  112. package/.medusa/server/src/modules/product-review/migrations/Migration20261101121500.js +18 -0
  113. package/.medusa/server/src/modules/product-review/models/product-review-settings.d.ts +15 -0
  114. package/.medusa/server/src/modules/product-review/models/product-review-settings.js +19 -0
  115. package/.medusa/server/src/modules/product-review/models/product-review.d.ts +6 -2
  116. package/.medusa/server/src/modules/product-review/models/product-review.js +7 -3
  117. package/.medusa/server/src/modules/product-review/service.d.ts +22 -1
  118. package/.medusa/server/src/modules/product-review/service.js +3 -2
  119. package/.medusa/server/src/providers/dpd/index.d.ts +2 -0
  120. package/.medusa/server/src/providers/dpd/index.js +3 -1
  121. package/.medusa/server/src/providers/dpd/statusdata-ftp.d.ts +16 -0
  122. package/.medusa/server/src/providers/dpd/statusdata-ftp.js +268 -0
  123. package/.medusa/server/src/providers/dpd/statusdata.d.ts +14 -0
  124. package/.medusa/server/src/providers/dpd/statusdata.js +161 -0
  125. package/.medusa/server/src/providers/mpl/client.d.ts +3 -1
  126. package/.medusa/server/src/providers/mpl/client.js +154 -2
  127. package/.medusa/server/src/providers/mpl/service.js +31 -20
  128. package/.medusa/server/src/providers/mpl/types.d.ts +25 -0
  129. package/.medusa/server/src/providers/mpl/types.js +1 -1
  130. package/.medusa/server/src/providers/packeta/index.d.ts +1 -0
  131. package/.medusa/server/src/providers/packeta/index.js +2 -1
  132. package/.medusa/server/src/providers/packeta/push-tracking.d.ts +8 -0
  133. package/.medusa/server/src/providers/packeta/push-tracking.js +96 -0
  134. package/.medusa/server/src/providers/packeta/service.js +22 -2
  135. package/.medusa/server/src/scripts/core-init.d.ts +1 -1
  136. package/.medusa/server/src/scripts/core-init.js +3 -2
  137. package/.medusa/server/src/subscribers/back-in-stock-inventory-changed.d.ts +7 -0
  138. package/.medusa/server/src/subscribers/back-in-stock-inventory-changed.js +65 -0
  139. package/.medusa/server/src/workflows/link-migrated-customer.d.ts +8 -0
  140. package/.medusa/server/src/workflows/link-migrated-customer.js +17 -0
  141. package/package.json +2 -1
@@ -0,0 +1,164 @@
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 native_migration_export_1 = require("../../../../core/native-migration-export");
8
+ async function GET(req, res) {
9
+ try {
10
+ const exported = await (0, native_migration_export_1.exportNativeMigrationCsv)(req.scope, "inventory");
11
+ res.setHeader("Cache-Control", "private, no-store, max-age=0");
12
+ res.setHeader("Content-Type", "text/csv; charset=utf-8");
13
+ res.setHeader("Content-Disposition", `attachment; filename="${safeFilename(exported.filename)}"`);
14
+ return res.send(exported.csv);
15
+ }
16
+ catch (error) {
17
+ return res.status(500).json({
18
+ message: error instanceof Error
19
+ ? error.message
20
+ : "A natív készletexport nem készíthető el.",
21
+ });
22
+ }
23
+ }
24
+ async function POST(req, res) {
25
+ const body = (req.body || {});
26
+ const rows = Array.isArray(body.rows) ? body.rows : [];
27
+ const dryRun = body.dry_run !== false;
28
+ const mode = body.mode === "skip" ? "skip" : "update";
29
+ if (!rows.length)
30
+ return res.status(400).json({ message: "Nincs importálható készletsor." });
31
+ if (rows.length > 10_000)
32
+ return res.status(400).json({ message: "Egy készletimport legfeljebb 10 000 sort tartalmazhat." });
33
+ const locationColumns = inventoryLocationColumns(rows[0]);
34
+ if (!locationColumns.length) {
35
+ return res.status(400).json({
36
+ message: "Nem található 'Location [Név] Stocked Quantity' oszlop. Használd a Medusa natív Inventory exportját.",
37
+ });
38
+ }
39
+ const itemIds = [...new Set(rows.map((row) => cell(row, "Item Id")).filter(Boolean))];
40
+ if (!itemIds.length)
41
+ return res.status(400).json({ message: "Az Item Id oszlop kötelező." });
42
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
43
+ const { data: inventoryItems } = await query.graph({
44
+ entity: "inventory_items",
45
+ fields: ["id", "location_levels.id", "location_levels.location_id", "location_levels.stocked_quantity"],
46
+ filters: { id: itemIds },
47
+ });
48
+ const itemMap = new Map(inventoryItems.map((item) => [String(item.id), item]));
49
+ const stockLocationService = req.scope.resolve(utils_1.Modules.STOCK_LOCATION);
50
+ const locations = await stockLocationService.listStockLocations({}, { select: ["id", "name"], take: 1000 });
51
+ const locationByName = new Map((locations || []).map((location) => [
52
+ String(location.name || "").trim().toLowerCase(),
53
+ String(location.id),
54
+ ]));
55
+ const create = [];
56
+ const update = [];
57
+ const errors = [];
58
+ let skipped = 0;
59
+ let total = 0;
60
+ // A native inventory export creates one row per linked product variant. If an
61
+ // inventory item is linked more than once, identical item+location quantities
62
+ // can therefore repeat. Collapse identical repeats; only conflicting repeats
63
+ // are considered invalid.
64
+ const seen = new Map();
65
+ for (let index = 0; index < rows.length; index++) {
66
+ const source = rows[index] || {};
67
+ const rowNumber = index + 2;
68
+ const itemId = cell(source, "Item Id");
69
+ if (!itemId) {
70
+ errors.push({ row: rowNumber, message: "Hiányzó Item Id." });
71
+ continue;
72
+ }
73
+ const item = itemMap.get(itemId);
74
+ if (!item) {
75
+ errors.push({ row: rowNumber, message: `Ismeretlen inventory item: ${itemId}` });
76
+ continue;
77
+ }
78
+ const existingLevels = new Map((item.location_levels || []).map((level) => [String(level.location_id), level]));
79
+ for (const column of locationColumns) {
80
+ const raw = cell(source, column.header);
81
+ if (!raw)
82
+ continue;
83
+ const quantity = Number(raw.replace(",", "."));
84
+ if (!Number.isFinite(quantity) || quantity < 0) {
85
+ errors.push({ row: rowNumber, message: `${column.header}: érvénytelen stocked quantity (${raw}).` });
86
+ continue;
87
+ }
88
+ const locationId = locationByName.get(column.locationName.toLowerCase());
89
+ if (!locationId) {
90
+ errors.push({ row: rowNumber, message: `Ismeretlen stock location: ${column.locationName}` });
91
+ continue;
92
+ }
93
+ const identity = `${itemId}:${locationId}`;
94
+ const previous = seen.get(identity);
95
+ if (previous !== undefined) {
96
+ if (previous === quantity)
97
+ continue;
98
+ errors.push({
99
+ row: rowNumber,
100
+ message: `Ellentmondó készlet ugyanahhoz az inventory itemhez és locationhöz (${column.locationName}): ${previous} / ${quantity}.`,
101
+ });
102
+ continue;
103
+ }
104
+ seen.set(identity, quantity);
105
+ total++;
106
+ const current = existingLevels.get(locationId);
107
+ if (current?.id) {
108
+ if (mode === "skip") {
109
+ skipped++;
110
+ continue;
111
+ }
112
+ update.push({
113
+ id: current.id,
114
+ inventory_item_id: itemId,
115
+ location_id: locationId,
116
+ stocked_quantity: quantity,
117
+ });
118
+ }
119
+ else {
120
+ create.push({
121
+ inventory_item_id: itemId,
122
+ location_id: locationId,
123
+ stocked_quantity: quantity,
124
+ });
125
+ }
126
+ }
127
+ }
128
+ if (!dryRun && (create.length || update.length)) {
129
+ for (let offset = 0; offset < Math.max(create.length, update.length); offset += 500) {
130
+ await (0, core_flows_1.batchInventoryItemLevelsWorkflow)(req.scope).run({
131
+ input: {
132
+ create: create.slice(offset, offset + 500),
133
+ update: update.slice(offset, offset + 500),
134
+ delete: [],
135
+ },
136
+ });
137
+ }
138
+ }
139
+ return res.json({
140
+ dry_run: dryRun,
141
+ mode,
142
+ total,
143
+ created: create.length,
144
+ updated: update.length,
145
+ skipped,
146
+ failed: errors.length,
147
+ errors: errors.slice(0, 200),
148
+ });
149
+ }
150
+ function inventoryLocationColumns(row) {
151
+ return Object.keys(row).flatMap((header) => {
152
+ const match = /^Location \[(.+)\] Stocked Quantity$/i.exec(header.trim());
153
+ return match ? [{ header, locationName: match[1].trim() }] : [];
154
+ });
155
+ }
156
+ function cell(row, wanted) {
157
+ const key = Object.keys(row).find((candidate) => candidate.trim().toLowerCase() === wanted.toLowerCase());
158
+ const value = key ? row[key] : undefined;
159
+ return value == null ? "" : String(value).trim();
160
+ }
161
+ function safeFilename(value) {
162
+ return value.replace(/[\r\n"\\/]+/g, "-") || "inventory.csv";
163
+ }
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Byb2R1Y3QtbWlncmF0aW9uL2ludmVudG9yeS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1CQSxrQkFrQkM7QUFFRCxvQkEySUM7QUFqTEQscURBQThFO0FBQzlFLDREQUE4RTtBQUU5RSxzRkFBbUY7QUFlNUUsS0FBSyxVQUFVLEdBQUcsQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQy9ELElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSxrREFBd0IsRUFBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBQ3ZFLEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLDhCQUE4QixDQUFDLENBQUE7UUFDOUQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUseUJBQXlCLENBQUMsQ0FBQTtRQUN4RCxHQUFHLENBQUMsU0FBUyxDQUNYLHFCQUFxQixFQUNyQix5QkFBeUIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUM1RCxDQUFBO1FBQ0QsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUMvQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsT0FBTyxFQUNMLEtBQUssWUFBWSxLQUFLO2dCQUNwQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU87Z0JBQ2YsQ0FBQyxDQUFDLDBDQUEwQztTQUNqRCxDQUFDLENBQUE7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVNLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUNoRSxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUE0QixDQUFBO0lBQ3hELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBbUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFBO0lBQ3JDLE1BQU0sSUFBSSxHQUFlLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQTtJQUVqRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLENBQUMsQ0FBQTtJQUM1RixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTTtRQUFFLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsd0RBQXdELEVBQUUsQ0FBQyxDQUFBO0lBRTVILE1BQU0sZUFBZSxHQUFHLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3pELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMxQixPQUFPLEVBQUUsc0dBQXNHO1NBQ2hILENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDckYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO1FBQUUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxDQUFDLENBQUE7SUFFNUYsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFRLENBQUE7SUFDdkUsTUFBTSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDakQsTUFBTSxFQUFFLGlCQUFpQjtRQUN6QixNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsNkJBQTZCLEVBQUUsa0NBQWtDLENBQUM7UUFDdkcsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRTtLQUN6QixDQUE4QixDQUFBO0lBRS9CLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDOUUsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsY0FBYyxDQUFRLENBQUE7SUFDN0UsTUFBTSxTQUFTLEdBQUcsTUFBTSxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDM0csTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQzVCLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFLENBQUM7UUFDdkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1FBQ2hELE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO0tBQ0EsQ0FBQyxDQUN2QixDQUFBO0lBRUQsTUFBTSxNQUFNLEdBQW1DLEVBQUUsQ0FBQTtJQUNqRCxNQUFNLE1BQU0sR0FBbUMsRUFBRSxDQUFBO0lBQ2pELE1BQU0sTUFBTSxHQUFrQixFQUFFLENBQUE7SUFDaEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFBO0lBQ2YsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFBO0lBRWIsOEVBQThFO0lBQzlFLDhFQUE4RTtJQUM5RSw2RUFBNkU7SUFDN0UsMEJBQTBCO0lBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFBO0lBRXRDLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDakQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUNoQyxNQUFNLFNBQVMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFBO1FBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDdEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQTtZQUM1RCxTQUFRO1FBQ1YsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDaEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLDhCQUE4QixNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7WUFDaEYsU0FBUTtRQUNWLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FDNUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQ2hGLENBQUE7UUFFRCxLQUFLLE1BQU0sTUFBTSxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ3ZDLElBQUksQ0FBQyxHQUFHO2dCQUFFLFNBQVE7WUFFbEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFBO2dCQUNwRyxTQUFRO1lBQ1YsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFBO1lBQ3hFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLDhCQUE4QixNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFBO2dCQUM3RixTQUFRO1lBQ1YsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLEdBQUcsTUFBTSxJQUFJLFVBQVUsRUFBRSxDQUFBO1lBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDbkMsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzNCLElBQUksUUFBUSxLQUFLLFFBQVE7b0JBQUUsU0FBUTtnQkFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDVixHQUFHLEVBQUUsU0FBUztvQkFDZCxPQUFPLEVBQUUsdUVBQXVFLE1BQU0sQ0FBQyxZQUFZLE1BQU0sUUFBUSxNQUFNLFFBQVEsR0FBRztpQkFDbkksQ0FBQyxDQUFBO2dCQUNGLFNBQVE7WUFDVixDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFDNUIsS0FBSyxFQUFFLENBQUE7WUFFUCxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQzlDLElBQUksT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDO2dCQUNoQixJQUFJLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztvQkFDcEIsT0FBTyxFQUFFLENBQUE7b0JBQ1QsU0FBUTtnQkFDVixDQUFDO2dCQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ1YsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFO29CQUNkLGlCQUFpQixFQUFFLE1BQU07b0JBQ3pCLFdBQVcsRUFBRSxVQUFVO29CQUN2QixnQkFBZ0IsRUFBRSxRQUFRO2lCQUMzQixDQUFDLENBQUE7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDVixpQkFBaUIsRUFBRSxNQUFNO29CQUN6QixXQUFXLEVBQUUsVUFBVTtvQkFDdkIsZ0JBQWdCLEVBQUUsUUFBUTtpQkFDM0IsQ0FBQyxDQUFBO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDaEQsS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3BGLE1BQU0sSUFBQSw2Q0FBZ0MsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUNwRCxLQUFLLEVBQUU7b0JBQ0wsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxHQUFHLENBQVE7b0JBQ2pELE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsR0FBRyxDQUFRO29CQUNqRCxNQUFNLEVBQUUsRUFBRTtpQkFDWDthQUNGLENBQUMsQ0FBQTtRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ2QsT0FBTyxFQUFFLE1BQU07UUFDZixJQUFJO1FBQ0osS0FBSztRQUNMLE9BQU8sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUN0QixPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDdEIsT0FBTztRQUNQLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO0tBQzdCLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRCxTQUFTLHdCQUF3QixDQUFDLEdBQWM7SUFDOUMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLHVDQUF1QyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUN6RSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQ2pFLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQUVELFNBQVMsSUFBSSxDQUFDLEdBQWMsRUFBRSxNQUFjO0lBQzFDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUE7SUFDekcsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUN4QyxPQUFPLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ2xELENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFhO0lBQ2pDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLElBQUksZUFBZSxDQUFBO0FBQzlELENBQUMifQ==
@@ -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,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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Byb2R1Y3QtcmV2aWV3cy9baWRdL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBY0Esb0JBOERDO0FBM0VELCtEQUErRDtBQUMvRCx1RUFJMkM7QUFDM0Msa0VBR3VDO0FBSWhDLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBd0IsRUFBRSxHQUFtQjtJQUN0RSxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxzQ0FBcUIsQ0FBeUIsQ0FBQTtJQUNoRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDekMsSUFBSSxDQUFFLHdDQUE2QyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3JFLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsQ0FBQyxDQUFBO0lBQzVFLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBSSxHQUEyRCxDQUFDLFlBQVksRUFBRSxRQUFRLElBQUksSUFBSSxDQUFBO0lBQzNHLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFtQyxDQUFBO1FBQ25HLElBQUksT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLG9CQUFvQixDQUFDO1lBQy9DLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNiLE1BQU07WUFDTixlQUFlLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUk7WUFDOUQsWUFBWSxFQUFFLElBQUksSUFBSSxFQUFFO1lBQ3hCLFlBQVksRUFBRSxPQUFPO1NBQ2IsQ0FBbUMsQ0FBQTtRQUU3QyxJQUFJLFdBQVcsR0FBa0IsSUFBSSxDQUFBO1FBQ3JDLElBQUksTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFGLElBQUksQ0FBQztnQkFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMseUJBQXlCLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBVyxDQUEwQyxDQUFBO2dCQUM3SCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsMENBQTBCLEVBQUM7b0JBQzlDLFNBQVMsRUFBRSxHQUFHLENBQUMsS0FBYztvQkFDN0IsTUFBTSxFQUFFLE9BQU87b0JBQ2YsUUFBUSxFQUFFLFFBQVEsSUFBSSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRTtpQkFDekgsQ0FBQyxDQUFBO2dCQUNGLElBQUksTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUMvQixPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsb0JBQW9CLENBQUM7d0JBQzNDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRTt3QkFDYixtQkFBbUIsRUFBRSxNQUFNLENBQUMsRUFBRTt3QkFDOUIsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLElBQUk7d0JBQy9CLGdCQUFnQixFQUFFLElBQUksSUFBSSxFQUFFO3FCQUNwQixDQUFtQyxDQUFBO29CQUM3QyxJQUFJLENBQUM7d0JBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFBLDhDQUE4QixFQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxLQUFjLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBYSxFQUFFLENBQUMsQ0FBQTt3QkFDNUgsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQzs0QkFDbkIsT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBVyxDQUFtQyxDQUFBO3dCQUM5SSxDQUFDO29CQUNILENBQUM7b0JBQUMsTUFBTSxDQUFDO3dCQUNQLGlFQUFpRTtvQkFDbkUsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsV0FBVyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlEQUFpRCxDQUFBO1lBQzFHLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxJQUFBLDJCQUFjLEVBQUMsR0FBRyxDQUFDLEtBQWMsRUFBRTtZQUN2QyxNQUFNLEVBQUUsa0JBQWtCLE1BQU0sRUFBRTtZQUNsQyxZQUFZLEVBQUUsZ0JBQWdCO1lBQzlCLFVBQVUsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNyQixXQUFXLEVBQUUsZ0JBQWdCO1lBQzdCLE9BQU87WUFDUCxPQUFPLEVBQUUsOEJBQThCLE1BQU0sR0FBRztZQUNoRCxPQUFPLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRTtTQUMvRyxDQUFDLENBQUE7UUFFRixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBQ2pFLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQywrQkFBK0IsRUFBRSxDQUFDLENBQUE7SUFDcEgsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLElBQUksQ0FBQyxLQUFjLEVBQUUsR0FBVztJQUN2QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtBQUNwRSxDQUFDIn0=
@@ -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,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>;