@hartl-services/medusa-base 0.4.0 → 1.1.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 (258) hide show
  1. package/.medusa/server/src/admin/index.js +1657 -111
  2. package/.medusa/server/src/admin/index.mjs +1647 -101
  3. package/.medusa/server/src/api/admin/email/messages/[id]/resends/route.js +24 -0
  4. package/.medusa/server/src/api/admin/email/messages/[id]/route.js +12 -0
  5. package/.medusa/server/src/api/admin/email/messages/route.js +12 -0
  6. package/.medusa/server/src/api/admin/email/terms-versions/[id]/download/route.js +16 -0
  7. package/.medusa/server/src/api/admin/email/terms-versions/route.js +47 -0
  8. package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/download/route.js +21 -0
  9. package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/regenerate/route.js +38 -0
  10. package/.medusa/server/src/api/admin/orders/[id]/documents/regenerate/route.js +32 -0
  11. package/.medusa/server/src/api/admin/orders/[id]/documents/route.js +36 -0
  12. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/download/route.js +24 -0
  13. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/retry/route.js +44 -0
  14. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/route.js +82 -0
  15. package/.medusa/server/src/api/document-download-response.js +16 -0
  16. package/.medusa/server/src/api/document-response.js +23 -0
  17. package/.medusa/server/src/api/files/[asset]/route.js +24 -0
  18. package/.medusa/server/src/api/files/file-response.js +43 -0
  19. package/.medusa/server/src/api/files/gateway-options.js +31 -0
  20. package/.medusa/server/src/api/files/private/[token]/route.js +29 -0
  21. package/.medusa/server/src/api/files/upload/[token]/route.js +66 -0
  22. package/.medusa/server/src/api/middlewares.js +168 -1
  23. package/.medusa/server/src/api/packing-list-response.js +22 -0
  24. package/.medusa/server/src/api/route.js +27 -0
  25. package/.medusa/server/src/api/store/documents/[id]/download/route.js +21 -0
  26. package/.medusa/server/src/api/store/documents/[id]/route.js +15 -0
  27. package/.medusa/server/src/api/store/documents/route.js +11 -0
  28. package/.medusa/server/src/api/terms-download-response.js +12 -0
  29. package/.medusa/server/src/documents/config/index.js +18 -0
  30. package/.medusa/server/src/documents/paths/documents.js +6 -0
  31. package/.medusa/server/src/documents/paths/index.js +18 -0
  32. package/.medusa/server/src/documents/plugin-features.js +38 -0
  33. package/.medusa/server/src/documents/schemas/documents.js +18 -0
  34. package/.medusa/server/src/documents/schemas/index.js +18 -0
  35. package/.medusa/server/src/documents/scripts/verify-documents-file-storage.js +55 -0
  36. package/.medusa/server/src/documents/templates/financial-document.js +160 -0
  37. package/.medusa/server/src/documents/templates/format.js +73 -0
  38. package/.medusa/server/src/documents/templates/html-factory.js +42 -0
  39. package/.medusa/server/src/documents/templates/html-utils.js +23 -0
  40. package/.medusa/server/src/documents/templates/layout.js +142 -0
  41. package/.medusa/server/src/documents/templates/packing-list.js +52 -0
  42. package/.medusa/server/src/documents/types/admin-api.js +3 -0
  43. package/.medusa/server/src/documents/types/document-summary.js +3 -0
  44. package/.medusa/server/src/documents/types/documents.js +3 -0
  45. package/.medusa/server/src/documents/types/html-factory.js +6 -0
  46. package/.medusa/server/src/documents/types/index.js +22 -0
  47. package/.medusa/server/src/documents/types/store-api.js +3 -0
  48. package/.medusa/server/src/documents/utils/document-merchant.js +22 -0
  49. package/.medusa/server/src/documents/utils/document-render-settings.js +59 -0
  50. package/.medusa/server/src/documents/utils/html-to-pdf.js +61 -0
  51. package/.medusa/server/src/documents/utils/private-file-storage.js +64 -0
  52. package/.medusa/server/src/documents/utils/resolve-services.js +7 -0
  53. package/.medusa/server/src/email/application/handle-invite-event.js +318 -0
  54. package/.medusa/server/src/email/application/handle-password-reset-event.js +366 -0
  55. package/.medusa/server/src/email/config/index.js +84 -0
  56. package/.medusa/server/src/email/config/notification-module.js +20 -0
  57. package/.medusa/server/src/email/domain/business-keys.js +50 -0
  58. package/.medusa/server/src/email/domain/documents-fact-fingerprint.js +7 -0
  59. package/.medusa/server/src/email/domain/event-schemas.js +36 -0
  60. package/.medusa/server/src/email/domain/failure-classification.js +53 -0
  61. package/.medusa/server/src/email/domain/order-summary.js +103 -0
  62. package/.medusa/server/src/email/domain/refund-summary.js +43 -0
  63. package/.medusa/server/src/email/domain/return-summary.js +118 -0
  64. package/.medusa/server/src/email/domain/shipment-summary.js +74 -0
  65. package/.medusa/server/src/email/plugin-features.js +39 -0
  66. package/.medusa/server/src/email/rendering/default-templates.js +719 -0
  67. package/.medusa/server/src/email/rendering/load-email-shop-details.js +36 -0
  68. package/.medusa/server/src/email/rendering/render-email.js +50 -0
  69. package/.medusa/server/src/email/rendering/resolve-shop-configuration.js +67 -0
  70. package/.medusa/server/src/email/types/email-kinds.js +18 -0
  71. package/.medusa/server/src/email/types/index.js +21 -0
  72. package/.medusa/server/src/email/types/shop-configuration.js +3 -0
  73. package/.medusa/server/src/email/types/smtp-configuration.js +3 -0
  74. package/.medusa/server/src/email/types/template-data.js +232 -0
  75. package/.medusa/server/src/files/config/index.js +256 -0
  76. package/.medusa/server/src/files/gateway/index.js +115 -0
  77. package/.medusa/server/src/files/types/index.js +6 -0
  78. package/.medusa/server/src/files/types/public.js +6 -0
  79. package/.medusa/server/src/jobs/document-fact-publication-reconciliation.js +18 -0
  80. package/.medusa/server/src/jobs/document-resolution-reconciliation.js +20 -0
  81. package/.medusa/server/src/jobs/packing-list-reconciliation.js +49 -0
  82. package/.medusa/server/src/jobs/reconcile-email-attempts.js +63 -0
  83. package/.medusa/server/src/jobs/reconcile-pending-email-messages.js +41 -0
  84. package/.medusa/server/src/jobs/retry-email-messages.js +27 -0
  85. package/.medusa/server/src/migration-scripts/dismiss-orphaned-cart-promotion-links.js +26 -0
  86. package/.medusa/server/src/modules/documents/domain/cancellation-snapshot.js +97 -0
  87. package/.medusa/server/src/modules/documents/domain/document-number.js +36 -0
  88. package/.medusa/server/src/modules/documents/domain/document-resolution.js +24 -0
  89. package/.medusa/server/src/modules/documents/domain/issuance-rules.js +37 -0
  90. package/.medusa/server/src/modules/documents/domain/merchant.js +86 -0
  91. package/.medusa/server/src/modules/documents/domain/options.js +40 -0
  92. package/.medusa/server/src/modules/documents/domain/packing-list.js +90 -0
  93. package/.medusa/server/src/modules/documents/domain/snapshot-normalization.js +17 -0
  94. package/.medusa/server/src/modules/documents/domain/tax-breakdown.js +66 -0
  95. package/.medusa/server/src/modules/documents/index.js +15 -0
  96. package/.medusa/server/src/modules/documents/loaders/assert-private-file-storage.js +20 -0
  97. package/.medusa/server/src/modules/documents/migrations/Migration20260827061749.js +75 -0
  98. package/.medusa/server/src/modules/documents/migrations/Migration20260830111207.js +28 -0
  99. package/.medusa/server/src/modules/documents/models/document-artifact.js +25 -0
  100. package/.medusa/server/src/modules/documents/models/document-number-sequence.js +29 -0
  101. package/.medusa/server/src/modules/documents/models/document.js +82 -0
  102. package/.medusa/server/src/modules/documents/models/order-cancellation-resolution.js +51 -0
  103. package/.medusa/server/src/modules/documents/models/packing-list-revision.js +36 -0
  104. package/.medusa/server/src/modules/documents/models/packing-list.js +27 -0
  105. package/.medusa/server/src/modules/documents/models/refund-document-resolution.js +66 -0
  106. package/.medusa/server/src/modules/documents/models/shipment-invoice-assignment.js +51 -0
  107. package/.medusa/server/src/modules/documents/models/shipment-invoice-coordinator.js +44 -0
  108. package/.medusa/server/src/modules/documents/service.js +1701 -0
  109. package/.medusa/server/src/modules/email/domain/attachment.js +25 -0
  110. package/.medusa/server/src/modules/email/domain/message-state.js +69 -0
  111. package/.medusa/server/src/modules/email/index.js +13 -0
  112. package/.medusa/server/src/modules/email/migrations/Migration20260826173422.js +32 -0
  113. package/.medusa/server/src/modules/email/migrations/Migration20260827172945.js +16 -0
  114. package/.medusa/server/src/modules/email/migrations/Migration20260827194804.js +22 -0
  115. package/.medusa/server/src/modules/email/migrations/Migration20260906195205.js +16 -0
  116. package/.medusa/server/src/modules/email/models/email-attempt.js +56 -0
  117. package/.medusa/server/src/modules/email/models/email-message.js +71 -0
  118. package/.medusa/server/src/modules/email/models/email-terms-version.js +37 -0
  119. package/.medusa/server/src/modules/email/service.js +1285 -0
  120. package/.medusa/server/src/modules/plugin-features/domain/plugin-settings.js +4 -3
  121. package/.medusa/server/src/providers/s3-cache/cache/atomic-write.js +25 -0
  122. package/.medusa/server/src/providers/s3-cache/cache/cache-manager.js +115 -0
  123. package/.medusa/server/src/providers/s3-cache/cache/keyed-lock.js +28 -0
  124. package/.medusa/server/src/providers/s3-cache/index.js +8 -0
  125. package/.medusa/server/src/providers/s3-cache/object-key.js +53 -0
  126. package/.medusa/server/src/providers/s3-cache/s3-cache-file.js +229 -0
  127. package/.medusa/server/src/providers/s3-cache/s3-object-store.js +86 -0
  128. package/.medusa/server/src/providers/smtp/index.js +8 -0
  129. package/.medusa/server/src/providers/smtp/service.js +236 -0
  130. package/.medusa/server/src/providers/smtp/types.js +11 -0
  131. package/.medusa/server/src/public/config.js +186 -0
  132. package/.medusa/server/src/public/descriptor.js +3 -1
  133. package/.medusa/server/src/public/gateway.js +19 -0
  134. package/.medusa/server/src/public/instrumentation.js +56 -0
  135. package/.medusa/server/src/public/shop-config.js +12 -0
  136. package/.medusa/server/src/public/shop-master-data.js +2 -2
  137. package/.medusa/server/src/public/shop-types.js +24 -0
  138. package/.medusa/server/src/shop-config/build-food-shop-config.js +252 -0
  139. package/.medusa/server/src/shop-config/options.js +75 -0
  140. package/.medusa/server/src/subscribers/affiliate-consignment-reminder-due.js +26 -0
  141. package/.medusa/server/src/subscribers/documents-order-canceled.js +24 -0
  142. package/.medusa/server/src/subscribers/documents-order-cancellation-ready.js +26 -0
  143. package/.medusa/server/src/subscribers/documents-refund-ready.js +24 -0
  144. package/.medusa/server/src/subscribers/documents-shipment-created.js +36 -0
  145. package/.medusa/server/src/subscribers/documents-shipment-invoice-assignment-decided.js +26 -0
  146. package/.medusa/server/src/subscribers/email-order-canceled.js +28 -0
  147. package/.medusa/server/src/subscribers/email-shipment-created.js +32 -0
  148. package/.medusa/server/src/subscribers/order-placed.js +27 -0
  149. package/.medusa/server/src/subscribers/packing-list-allocation-revised.js +32 -0
  150. package/.medusa/server/src/subscribers/packing-list-fulfillment-canceled.js +54 -0
  151. package/.medusa/server/src/subscribers/packing-list-fulfillment-created.js +31 -0
  152. package/.medusa/server/src/subscribers/password-reset.js +23 -0
  153. package/.medusa/server/src/subscribers/payment-refunded.js +38 -0
  154. package/.medusa/server/src/subscribers/return-received.js +27 -0
  155. package/.medusa/server/src/subscribers/return-requested.js +27 -0
  156. package/.medusa/server/src/subscribers/user-invite.js +23 -0
  157. package/.medusa/server/src/utils/cart-promotion-links.js +101 -0
  158. package/.medusa/server/src/workflows/documents/issue-cancellation-after-refund.js +246 -0
  159. package/.medusa/server/src/workflows/documents/issue-document.js +165 -0
  160. package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +521 -0
  161. package/.medusa/server/src/workflows/documents/issue-packing-list.js +390 -0
  162. package/.medusa/server/src/workflows/documents/publish-document-facts.js +53 -0
  163. package/.medusa/server/src/workflows/documents/reconcile-document-resolutions.js +48 -0
  164. package/.medusa/server/src/workflows/documents/reconcile-order-cancellation.js +92 -0
  165. package/.medusa/server/src/workflows/documents/regenerate-issued-document.js +61 -0
  166. package/.medusa/server/src/workflows/email/dispatch-email-message.js +301 -0
  167. package/.medusa/server/src/workflows/email/documents-required-facts.js +30 -0
  168. package/.medusa/server/src/workflows/email/prepare-affiliate-reminder-email.js +58 -0
  169. package/.medusa/server/src/workflows/email/prepare-order-canceled-email.js +102 -0
  170. package/.medusa/server/src/workflows/email/prepare-order-received-email.js +82 -0
  171. package/.medusa/server/src/workflows/email/prepare-refund-email.js +71 -0
  172. package/.medusa/server/src/workflows/email/prepare-return-email.js +136 -0
  173. package/.medusa/server/src/workflows/email/prepare-shipment-email.js +115 -0
  174. package/.medusa/server/src/workflows/email/retry-email-messages.js +31 -0
  175. package/.medusa/server/src/workflows/hooks/dismiss-deleted-promotion-cart-links.js +23 -0
  176. package/README.md +1777 -8
  177. package/dist/admin-components/features/plugin-features/components/ImageSettingInput.d.ts +15 -0
  178. package/dist/admin-components/features/plugin-features/components/ImageSettingInput.js +42 -0
  179. package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.js +4 -2
  180. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +1 -1
  181. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.d.ts +4 -4
  182. package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +1 -1
  183. package/dist/admin-components/features/plugin-features/lib/image-upload.d.ts +6 -0
  184. package/dist/admin-components/features/plugin-features/lib/image-upload.js +17 -0
  185. package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +4 -4
  186. package/dist/admin-components/i18n/texts.d.ts +6 -0
  187. package/dist/admin-components/i18n/texts.js +6 -0
  188. package/dist/documents/config/index.d.ts +11 -0
  189. package/dist/documents/config/index.js +17 -0
  190. package/dist/documents/templates/financial-document.d.ts +3 -0
  191. package/dist/documents/templates/financial-document.js +159 -0
  192. package/dist/documents/templates/format.d.ts +30 -0
  193. package/dist/documents/templates/format.js +72 -0
  194. package/dist/documents/templates/html-factory.d.ts +15 -0
  195. package/dist/documents/templates/html-factory.js +41 -0
  196. package/dist/documents/templates/html-utils.d.ts +8 -0
  197. package/dist/documents/templates/html-utils.js +22 -0
  198. package/dist/documents/templates/layout.d.ts +35 -0
  199. package/dist/documents/templates/layout.js +141 -0
  200. package/dist/documents/templates/packing-list.d.ts +3 -0
  201. package/dist/documents/templates/packing-list.js +51 -0
  202. package/dist/documents/types/admin-api.d.ts +1 -0
  203. package/dist/documents/types/admin-api.js +2 -0
  204. package/dist/documents/types/document-summary.d.ts +1 -0
  205. package/dist/documents/types/document-summary.js +2 -0
  206. package/dist/documents/types/documents.d.ts +191 -0
  207. package/dist/documents/types/documents.js +2 -0
  208. package/dist/documents/types/html-factory.d.ts +8 -0
  209. package/dist/documents/types/html-factory.js +5 -0
  210. package/dist/documents/types/index.d.ts +5 -0
  211. package/dist/documents/types/index.js +21 -0
  212. package/dist/documents/types/store-api.d.ts +1 -0
  213. package/dist/documents/types/store-api.js +2 -0
  214. package/dist/email/config/index.d.ts +17 -0
  215. package/dist/email/config/index.js +83 -0
  216. package/dist/email/config/notification-module.d.ts +22 -0
  217. package/dist/email/config/notification-module.js +19 -0
  218. package/dist/email/types/email-kinds.d.ts +15 -0
  219. package/dist/email/types/email-kinds.js +17 -0
  220. package/dist/email/types/index.d.ts +4 -0
  221. package/dist/email/types/index.js +20 -0
  222. package/dist/email/types/shop-configuration.d.ts +68 -0
  223. package/dist/email/types/shop-configuration.js +2 -0
  224. package/dist/email/types/smtp-configuration.d.ts +9 -0
  225. package/dist/email/types/smtp-configuration.js +2 -0
  226. package/dist/email/types/template-data.d.ts +609 -0
  227. package/dist/email/types/template-data.js +231 -0
  228. package/dist/files/config/index.d.ts +32 -0
  229. package/dist/files/config/index.js +255 -0
  230. package/dist/files/gateway/index.d.ts +30 -0
  231. package/dist/files/gateway/index.js +114 -0
  232. package/dist/files/types/index.d.ts +2 -0
  233. package/dist/files/types/index.js +5 -0
  234. package/dist/files/types/public.d.ts +90 -0
  235. package/dist/files/types/public.js +5 -0
  236. package/dist/modules/documents/domain/merchant.d.ts +22 -0
  237. package/dist/modules/documents/domain/merchant.js +85 -0
  238. package/dist/modules/documents/domain/options.d.ts +34 -0
  239. package/dist/modules/documents/domain/options.js +39 -0
  240. package/dist/public/config.d.ts +59 -0
  241. package/dist/public/config.js +185 -0
  242. package/dist/public/descriptor.js +2 -0
  243. package/dist/public/gateway.d.ts +2 -0
  244. package/dist/public/gateway.js +18 -0
  245. package/dist/public/instrumentation.d.ts +12 -0
  246. package/dist/public/instrumentation.js +55 -0
  247. package/dist/public/shop-config.d.ts +8 -0
  248. package/dist/public/shop-config.js +11 -0
  249. package/dist/public/shop-master-data.d.ts +1 -1
  250. package/dist/public/shop-master-data.js +1 -1
  251. package/dist/public/shop-types.d.ts +7 -0
  252. package/dist/public/shop-types.js +23 -0
  253. package/dist/public/types.d.ts +19 -2
  254. package/dist/shop-config/build-food-shop-config.d.ts +44 -0
  255. package/dist/shop-config/build-food-shop-config.js +251 -0
  256. package/dist/shop-config/options.d.ts +48 -0
  257. package/dist/shop-config/options.js +74 -0
  258. package/package.json +48 -5
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PUT = exports.OPTIONS = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const gateway_1 = require("../../../../files/gateway");
6
+ const gateway_options_1 = require("../../gateway-options");
7
+ const MAX_UPLOAD_BYTES = 100 * 1024 * 1024;
8
+ const setCorsHeaders = (req, res, allowedOrigins) => {
9
+ const origin = req.get("origin");
10
+ if (origin && allowedOrigins.includes(origin)) {
11
+ res.setHeader("Access-Control-Allow-Origin", origin);
12
+ res.setHeader("Vary", "Origin");
13
+ }
14
+ res.setHeader("Access-Control-Allow-Methods", "PUT, OPTIONS");
15
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type");
16
+ };
17
+ const OPTIONS = async (req, res) => {
18
+ setCorsHeaders(req, res, (0, gateway_options_1.resolveFileGatewayRouteOptions)(req.scope).uploadAllowedOrigins);
19
+ res.status(204).end();
20
+ };
21
+ exports.OPTIONS = OPTIONS;
22
+ const PUT = async (req, res) => {
23
+ const { signingSecret, uploadAllowedOrigins } = (0, gateway_options_1.resolveFileGatewayRouteOptions)(req.scope);
24
+ setCorsHeaders(req, res, uploadAllowedOrigins);
25
+ const fileKey = (0, gateway_1.verifyFileGatewayUploadToken)({
26
+ expires: req.validatedQuery.expires,
27
+ signature: req.validatedQuery.signature,
28
+ signingSecret,
29
+ token: req.params.token,
30
+ });
31
+ if (!fileKey ||
32
+ (!fileKey.startsWith("private/") && !fileKey.startsWith("public/"))) {
33
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, "Invalid or expired file upload URL.");
34
+ }
35
+ const declaredSize = Number(req.get("content-length"));
36
+ if (Number.isFinite(declaredSize) && declaredSize > MAX_UPLOAD_BYTES) {
37
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Gateway uploads must not exceed ${MAX_UPLOAD_BYTES} bytes.`);
38
+ }
39
+ const chunks = [];
40
+ let size = 0;
41
+ for await (const chunk of req) {
42
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
43
+ size += buffer.length;
44
+ if (size > MAX_UPLOAD_BYTES) {
45
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Gateway uploads must not exceed ${MAX_UPLOAD_BYTES} bytes.`);
46
+ }
47
+ chunks.push(buffer);
48
+ }
49
+ const files = req.scope.resolve(utils_1.Modules.FILE);
50
+ const access = fileKey.startsWith("private/") ? "private" : "public";
51
+ const mimeType = req.get("content-type")?.split(";", 1)[0]?.trim() ||
52
+ "application/octet-stream";
53
+ const uploaded = await files.createFiles({
54
+ access,
55
+ content: Buffer.concat(chunks).toString("base64"),
56
+ filename: fileKey.slice(fileKey.indexOf("/") + 1),
57
+ mimeType,
58
+ });
59
+ if (uploaded.id !== fileKey) {
60
+ await files.deleteFiles(uploaded.id);
61
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Gateway upload did not preserve its reserved file key.");
62
+ }
63
+ res.status(204).end();
64
+ };
65
+ exports.PUT = PUT;
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2ZpbGVzL3VwbG9hZC9bdG9rZW5dL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHFEQUFpRTtBQUdqRSx1REFBeUU7QUFDekUsMkRBQXVFO0FBRXZFLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFM0MsTUFBTSxjQUFjLEdBQUcsQ0FDckIsR0FBa0IsRUFDbEIsR0FBbUIsRUFDbkIsY0FBaUMsRUFDM0IsRUFBRTtJQUNSLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakMsSUFBSSxNQUFNLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzlDLEdBQUcsQ0FBQyxTQUFTLENBQUMsNkJBQTZCLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNELEdBQUcsQ0FBQyxTQUFTLENBQUMsOEJBQThCLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDOUQsR0FBRyxDQUFDLFNBQVMsQ0FBQyw4QkFBOEIsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUNoRSxDQUFDLENBQUM7QUFFSyxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDdkUsY0FBYyxDQUNaLEdBQUcsRUFDSCxHQUFHLEVBQ0gsSUFBQSxnREFBOEIsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsb0JBQW9CLENBQy9ELENBQUM7SUFDRixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLENBQUMsQ0FBQztBQVBXLFFBQUEsT0FBTyxXQU9s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
@@ -2,6 +2,23 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const http_1 = require("@medusajs/framework/http");
4
4
  const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/plugin-features");
5
+ const documents_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/documents");
6
+ const email_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/email");
7
+ const files_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/files");
8
+ const plugin_features_2 = require("../documents/plugin-features");
9
+ const plugin_features_3 = require("../email/plugin-features");
10
+ const public_1 = require("../public");
11
+ /**
12
+ * Feature-toggle gate for the Documents routes. Without `methods` Medusa
13
+ * registers the entry with `app.use`, i.e. as a prefix match that runs before
14
+ * every method-specific middleware (authentication included), so a disabled
15
+ * feature answers 404 for the route and everything below it. Without keys only
16
+ * the plugin switch is checked; several keys must all be enabled.
17
+ */
18
+ const documentsGate = (matcher, ...keys) => ({
19
+ matcher,
20
+ middlewares: [(0, public_1.requirePluginFeature)(plugin_features_2.documentsPluginFeatures, ...keys)],
21
+ });
5
22
  // Authentication: Medusa authenticates every /admin route (actor "user";
6
23
  // bearer, session or secret API key) before plugin middlewares run
7
24
  // (framework 2.19.0 http/router.js), so no second `authenticate` here.
@@ -34,6 +51,156 @@ exports.default = (0, http_1.defineMiddlewares)({
34
51
  }),
35
52
  ],
36
53
  },
54
+ // --- E-Mail ---------------------------------------------------------
55
+ // Feature-toggle gate (see plugin-features.ts). Without `methods` Medusa
56
+ // registers it with `app.use`, a prefix match that runs before every
57
+ // method-specific entry below, so a switched-off plugin answers 404 for
58
+ // the whole Admin mail log and the terms versions.
59
+ // The mail features gate subscribers only; no route belongs to them.
60
+ {
61
+ matcher: "/admin/email",
62
+ middlewares: [(0, public_1.requirePluginFeature)(plugin_features_3.emailPluginFeatures)],
63
+ },
64
+ {
65
+ matcher: "/admin/email/messages",
66
+ methods: ["GET"],
67
+ middlewares: [
68
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
69
+ (0, http_1.validateAndTransformQuery)(email_1.ListAdminEmailMessagesQuerySchema, {
70
+ isList: true,
71
+ }),
72
+ ],
73
+ },
74
+ {
75
+ matcher: "/admin/email/messages/:id",
76
+ methods: ["GET"],
77
+ middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
78
+ },
79
+ {
80
+ matcher: "/admin/email/messages/:id/resends",
81
+ methods: ["POST"],
82
+ middlewares: [
83
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
84
+ (0, http_1.validateAndTransformBody)(email_1.ResendAdminEmailMessageSchema),
85
+ ],
86
+ },
87
+ {
88
+ matcher: "/admin/email/terms-versions",
89
+ methods: ["GET"],
90
+ middlewares: [
91
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
92
+ (0, http_1.validateAndTransformQuery)(email_1.ListAdminEmailTermsVersionsQuerySchema, {
93
+ isList: true,
94
+ }),
95
+ ],
96
+ },
97
+ {
98
+ bodyParser: { sizeLimit: "7mb" },
99
+ matcher: "/admin/email/terms-versions",
100
+ methods: ["POST"],
101
+ middlewares: [
102
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
103
+ (0, http_1.validateAndTransformBody)(email_1.CreateAdminEmailTermsVersionSchema),
104
+ ],
105
+ },
106
+ {
107
+ matcher: "/admin/email/terms-versions/:id/download",
108
+ methods: ["GET"],
109
+ middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
110
+ },
111
+ // --- Dokumente ------------------------------------------------------
112
+ // Feature-toggle gates (see plugin-features.ts). They cover every
113
+ // Documents route and nothing else; subscribers and jobs check the
114
+ // toggles themselves, workflow hooks and the checkout path never do.
115
+ //
116
+ // Plugin switch
117
+ documentsGate("/store/documents"),
118
+ documentsGate("/admin/orders/:id/documents"),
119
+ documentsGate("/admin/orders/:id/packing-lists"),
120
+ // Rechnungen & Stornos
121
+ documentsGate("/store/documents", "invoices"),
122
+ documentsGate("/admin/orders/:id/documents", "invoices"),
123
+ // Packlisten
124
+ documentsGate("/admin/orders/:id/packing-lists", "packing_lists"),
125
+ {
126
+ matcher: "/store/documents",
127
+ methods: ["GET"],
128
+ middlewares: [(0, http_1.authenticate)("customer", ["session", "bearer"])],
129
+ },
130
+ {
131
+ matcher: "/store/documents/:id",
132
+ methods: ["GET"],
133
+ middlewares: [(0, http_1.authenticate)("customer", ["session", "bearer"])],
134
+ },
135
+ {
136
+ matcher: "/store/documents/:id/download",
137
+ methods: ["GET"],
138
+ middlewares: [(0, http_1.authenticate)("customer", ["session", "bearer"])],
139
+ },
140
+ {
141
+ matcher: "/admin/orders/:id/documents",
142
+ methods: ["GET", "POST"],
143
+ middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
144
+ },
145
+ {
146
+ matcher: "/admin/orders/:id/documents/:document_id/download",
147
+ methods: ["GET"],
148
+ middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
149
+ },
150
+ {
151
+ matcher: "/admin/orders/:id/documents/regenerate",
152
+ methods: ["POST"],
153
+ middlewares: [
154
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
155
+ (0, http_1.validateAndTransformBody)(documents_1.RegenerateAdminOrderDocumentBodySchema),
156
+ ],
157
+ },
158
+ {
159
+ matcher: "/admin/orders/:id/documents/:document_id/regenerate",
160
+ methods: ["POST"],
161
+ middlewares: [
162
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
163
+ (0, http_1.validateAndTransformBody)(documents_1.RegenerateAdminOrderDocumentBodySchema),
164
+ ],
165
+ },
166
+ {
167
+ matcher: "/admin/orders/:id/packing-lists",
168
+ methods: ["GET"],
169
+ middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
170
+ },
171
+ {
172
+ matcher: "/admin/orders/:id/packing-lists/:fulfillment_id/download",
173
+ methods: ["GET"],
174
+ middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
175
+ },
176
+ {
177
+ matcher: "/admin/orders/:id/packing-lists/:fulfillment_id/retry",
178
+ methods: ["POST"],
179
+ middlewares: [
180
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
181
+ (0, http_1.validateAndTransformBody)(documents_1.RetryAdminOrderPackingListBodySchema),
182
+ ],
183
+ },
184
+ // --- Dateispeicher (/files gateway) ---------------------------------
185
+ {
186
+ matcher: "/files/private/:token",
187
+ methods: ["GET"],
188
+ middlewares: [
189
+ (0, http_1.validateAndTransformQuery)(files_1.PrivateFileGatewayDownloadQuerySchema, {
190
+ isList: false,
191
+ }),
192
+ ],
193
+ },
194
+ {
195
+ bodyParser: false,
196
+ matcher: "/files/upload/:token",
197
+ methods: ["PUT"],
198
+ middlewares: [
199
+ (0, http_1.validateAndTransformQuery)(files_1.PrivateFileGatewayDownloadQuerySchema, {
200
+ isList: false,
201
+ }),
202
+ ],
203
+ },
37
204
  ],
38
205
  });
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBSWlDO0FBQ2pDLCtHQUtrRjtBQUVsRix5RUFBeUU7QUFDekUsbUVBQW1FO0FBQ25FLHVFQUF1RTtBQUN2RSwyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLHVDQUF1QztBQUN2QyxrQkFBZSxJQUFBLHdCQUFpQixFQUFDO0lBQy9CLE1BQU0sRUFBRTtRQUNOO1lBQ0UsT0FBTyxFQUFFLHdCQUF3QjtZQUNqQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakIsV0FBVyxFQUFFLENBQUMsSUFBQSwrQkFBd0IsRUFBQyw0Q0FBMEIsQ0FBQyxDQUFDO1NBQ3BFO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsNkNBQTZDO1lBQ3RELE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqQixXQUFXLEVBQUUsQ0FBQyxJQUFBLCtCQUF3QixFQUFDLDRDQUEwQixDQUFDLENBQUM7U0FDcEU7UUFDRDtZQUNFLE9BQU8sRUFBRSx3REFBd0Q7WUFDakUsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2pCLFdBQVcsRUFBRSxDQUFDLElBQUEsK0JBQXdCLEVBQUMsdUNBQXFCLENBQUMsQ0FBQztTQUMvRDtRQUNEO1lBQ0UsT0FBTyxFQUFFLDZEQUE2RDtZQUN0RSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEIsV0FBVyxFQUFFO2dCQUNYLElBQUEsZ0NBQXlCLEVBQUMsaURBQStCLEVBQUU7b0JBQ3pELE1BQU0sRUFBRSxLQUFLO2lCQUNkLENBQUM7YUFDSDtTQUNGO0tBQ0Y7Q0FDRixDQUFDLENBQUEifQ==
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBS2lDO0FBQ2pDLCtHQUtrRjtBQUNsRixtR0FHNEU7QUFDNUUsMkZBS3dFO0FBQ3hFLDJGQUF1SDtBQUV2SCxrRUFHcUM7QUFDckMsOERBQThEO0FBQzlELHNDQUFnRDtBQUVoRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLGFBQWEsR0FBRyxDQUFDLE9BQWUsRUFBRSxHQUFHLElBQTJCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUUsT0FBTztJQUNQLFdBQVcsRUFBRSxDQUFDLElBQUEsNkJBQW9CLEVBQUMseUNBQXVCLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztDQUN0RSxDQUFDLENBQUE7QUFFRix5RUFBeUU7QUFDekUsbUVBQW1FO0FBQ25FLHVFQUF1RTtBQUN2RSwyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLHVDQUF1QztBQUN2QyxrQkFBZSxJQUFBLHdCQUFpQixFQUFDO0lBQy9CLE1BQU0sRUFBRTtRQUNOO1lBQ0UsT0FBTyxFQUFFLHdCQUF3QjtZQUNqQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakIsV0FBVyxFQUFFLENBQUMsSUFBQSwrQkFBd0IsRUFBQyw0Q0FBMEIsQ0FBQyxDQUFDO1NBQ3BFO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsNkNBQTZDO1lBQ3RELE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqQixXQUFXLEVBQUUsQ0FBQyxJQUFBLCtCQUF3QixFQUFDLDRDQUEwQixDQUFDLENBQUM7U0FDcEU7UUFDRDtZQUNFLE9BQU8sRUFBRSx3REFBd0Q7WUFDakUsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2pCLFdBQVcsRUFBRSxDQUFDLElBQUEsK0JBQXdCLEVBQUMsdUNBQXFCLENBQUMsQ0FBQztTQUMvRDtRQUNEO1lBQ0UsT0FB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
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toPackingListSummary = void 0;
4
+ const toPackingListSummary = (value) => {
5
+ const latestRevision = value.revisions[0] ?? null;
6
+ const latestReady = value.revisions.find((revision) => revision.generation_status === "ready");
7
+ const snapshot = latestRevision?.snapshot ?? latestReady?.snapshot ?? null;
8
+ return {
9
+ id: value.packing_list.id,
10
+ fulfillment_id: value.packing_list.fulfillment_id,
11
+ status: value.packing_list.lifecycle_status === "canceled"
12
+ ? "canceled"
13
+ : (latestRevision?.generation_status ?? "pending"),
14
+ number: snapshot?.document.number ?? null,
15
+ source_revision: latestRevision?.source_revision ?? null,
16
+ generated_at: latestReady?.generated_at?.toISOString() ?? null,
17
+ location_name: snapshot?.fulfillment.location_name ?? null,
18
+ failure_reason: latestRevision?.failure_reason ?? null,
19
+ };
20
+ };
21
+ exports.toPackingListSummary = toPackingListSummary;
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2luZy1saXN0LXJlc3BvbnNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9wYWNraW5nLWxpc3QtcmVzcG9uc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSU8sTUFBTSxvQkFBb0IsR0FBRyxDQUNsQyxLQUErQixFQUNYLEVBQUU7SUFDdEIsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUE7SUFDakQsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ3RDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEtBQUssT0FBTyxDQUNyRCxDQUFBO0lBQ0QsTUFBTSxRQUFRLEdBQUcsY0FBYyxFQUFFLFFBQVEsSUFBSSxXQUFXLEVBQUUsUUFBUSxJQUFJLElBQUksQ0FBQTtJQUUxRSxPQUFPO1FBQ0wsRUFBRSxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRTtRQUN6QixjQUFjLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxjQUFjO1FBQ2pELE1BQU0sRUFDSixLQUFLLENBQUMsWUFBWSxDQUFDLGdCQUFnQixLQUFLLFVBQVU7WUFDaEQsQ0FBQyxDQUFDLFVBQVU7WUFDWixDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLElBQUksU0FBUyxDQUFDO1FBQ3RELE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLE1BQU0sSUFBSSxJQUFJO1FBQ3pDLGVBQWUsRUFBRSxjQUFjLEVBQUUsZUFBZSxJQUFJLElBQUk7UUFDeEQsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLElBQUksSUFBSTtRQUM5RCxhQUFhLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxhQUFhLElBQUksSUFBSTtRQUMxRCxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsSUFBSSxJQUFJO0tBQ3ZELENBQUE7QUFDSCxDQUFDLENBQUE7QUF0QlksUUFBQSxvQkFBb0Isd0JBc0JoQyJ9
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ /**
6
+ * Medusa serves nothing at the root path - the backend's landing page is the
7
+ * admin dashboard under admin.path (default /app). Without this route the
8
+ * deployed domain answers "/" with a 404, so the admin has to be opened by
9
+ * typing its path every time.
10
+ *
11
+ * Deliberately handled in the plugin rather than with a reverse-proxy
12
+ * redirect label: a proxy rule needs a bare hostname to avoid hijacking the
13
+ * root path of every other app behind the same shared proxy, and no existing
14
+ * environment variable carries one (MEDUSA_BACKEND_URL includes the scheme).
15
+ * Doing it here keeps the shop deployable per shop without extra
16
+ * configuration and makes the redirect work in local development too. The
17
+ * target follows the shop's configured admin.path.
18
+ *
19
+ * 302, not 301: browsers cache a permanent redirect on the bare domain
20
+ * essentially forever, which is painful to undo should "/" ever get real
21
+ * content.
22
+ */
23
+ async function GET(req, res) {
24
+ const config = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
25
+ res.redirect(302, config.admin?.path || "/app");
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBcUJBLGtCQUdDO0FBdkJELHFEQUFxRTtBQUVyRTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSSxLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDL0QsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDekUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDLENBQUE7QUFDakQsQ0FBQyJ9
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const document_download_response_1 = require("../../../../document-download-response");
6
+ const resolve_services_1 = require("../../../../../documents/utils/resolve-services");
7
+ const GET = async (req, res) => {
8
+ const document = await (0, resolve_services_1.resolveDocumentsService)(req.scope).getDocumentForCustomer(req.params.id, req.auth_context.actor_id);
9
+ if (!document?.file_id || !document.filename) {
10
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Document not found.");
11
+ }
12
+ const files = req.scope.resolve(utils_1.Modules.FILE);
13
+ const stream = await files.getDownloadStream(document.file_id);
14
+ (0, document_download_response_1.setDocumentDownloadHeaders)(res, {
15
+ filename: document.filename,
16
+ disposition: "attachment",
17
+ });
18
+ stream.pipe(res);
19
+ };
20
+ exports.GET = GET;
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2RvY3VtZW50cy9baWRdL2Rvd25sb2FkL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLHFEQUFnRTtBQUVoRSx1RkFBbUY7QUFDbkYsc0ZBQXlGO0FBRWxGLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBK0IsRUFDL0IsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSwwQ0FBdUIsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsc0JBQXNCLENBQzlFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUNiLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUMxQixDQUFBO0lBQ0QsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0MsTUFBTSxJQUFJLG1CQUFXLENBQUMsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLHFCQUFxQixDQUFDLENBQUE7SUFDM0UsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBQXVCLENBQUE7SUFDbkUsTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzlELElBQUEsdURBQTBCLEVBQUMsR0FBRyxFQUFFO1FBQzlCLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtRQUMzQixXQUFXLEVBQUUsWUFBWTtLQUMxQixDQUFDLENBQUE7SUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ2xCLENBQUMsQ0FBQTtBQW5CWSxRQUFBLEdBQUcsT0FtQmYifQ==
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const resolve_services_1 = require("../../../../documents/utils/resolve-services");
6
+ const document_response_1 = require("../../../document-response");
7
+ const GET = async (req, res) => {
8
+ const document = await (0, resolve_services_1.resolveDocumentsService)(req.scope).getDocumentForCustomer(req.params.id, req.auth_context.actor_id);
9
+ if (!document) {
10
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Document not found.");
11
+ }
12
+ res.json({ document: (0, document_response_1.toDocumentSummary)(document) });
13
+ };
14
+ exports.GET = GET;
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2RvY3VtZW50cy9baWRdL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLHFEQUF1RDtBQUd2RCxtRkFBc0Y7QUFDdEYsa0VBQThEO0FBRXZELE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBK0IsRUFDL0IsR0FBNkMsRUFDN0MsRUFBRTtJQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSwwQ0FBdUIsRUFDNUMsR0FBRyxDQUFDLEtBQUssQ0FDVixDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDbEUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSxJQUFJLG1CQUFXLENBQUMsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLHFCQUFxQixDQUFDLENBQUE7SUFDM0UsQ0FBQztJQUVELEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBQSxxQ0FBaUIsRUFBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDckQsQ0FBQyxDQUFBO0FBWlksUUFBQSxHQUFHLE9BWWYifQ==
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = void 0;
4
+ const resolve_services_1 = require("../../../documents/utils/resolve-services");
5
+ const document_response_1 = require("../../document-response");
6
+ const GET = async (req, res) => {
7
+ const documents = await (0, resolve_services_1.resolveDocumentsService)(req.scope).listIssuedDocumentsForCustomer(req.auth_context.actor_id);
8
+ res.json({ documents: documents.map(document_response_1.toDocumentSummary) });
9
+ };
10
+ exports.GET = GET;
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2RvY3VtZW50cy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFNQSxnRkFBbUY7QUFDbkYsK0RBQTJEO0FBRXBELE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBK0IsRUFDL0IsR0FBK0MsRUFDL0MsRUFBRTtJQUNGLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBQSwwQ0FBdUIsRUFDN0MsR0FBRyxDQUFDLEtBQUssQ0FDVixDQUFDLDhCQUE4QixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFM0QsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLHFDQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQzNELENBQUMsQ0FBQTtBQVRZLFFBQUEsR0FBRyxPQVNmIn0=
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setTermsDownloadHeaders = void 0;
4
+ const safeFilename = (filename) => filename.replaceAll(/[^a-zA-Z0-9._-]/g, "_");
5
+ const setTermsDownloadHeaders = (res, filename) => {
6
+ res.setHeader("Cache-Control", "private, no-store, max-age=0");
7
+ res.setHeader("Content-Type", "application/pdf");
8
+ res.setHeader("Content-Disposition", `attachment; filename="${safeFilename(filename)}"`);
9
+ res.setHeader("X-Content-Type-Options", "nosniff");
10
+ };
11
+ exports.setTermsDownloadHeaders = setTermsDownloadHeaders;
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVybXMtZG93bmxvYWQtcmVzcG9uc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL3Rlcm1zLWRvd25sb2FkLXJlc3BvbnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLE1BQU0sWUFBWSxHQUFHLENBQUMsUUFBZ0IsRUFBVSxFQUFFLENBQ2hELFFBQVEsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFFeEMsTUFBTSx1QkFBdUIsR0FBRyxDQUNyQyxHQUFtQixFQUNuQixRQUFnQixFQUNWLEVBQUU7SUFDUixHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO0lBQy9ELEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDakQsR0FBRyxDQUFDLFNBQVMsQ0FDWCxxQkFBcUIsRUFDckIseUJBQXlCLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUNuRCxDQUFDO0lBQ0YsR0FBRyxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNyRCxDQUFDLENBQUM7QUFYVyxRQUFBLHVCQUF1QiwyQkFXbEMifQ==
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DOCUMENTS_BUILD_PLACEHOLDERS = exports.createDefaultDocumentHtmlFactory = void 0;
4
+ /**
5
+ * Documents part of the `@hartl-services/medusa-base/config` entry point: values a shop
6
+ * needs in `medusa-config.ts` or in a test, without loading the plugin itself.
7
+ */
8
+ var html_factory_1 = require("../templates/html-factory");
9
+ Object.defineProperty(exports, "createDefaultDocumentHtmlFactory", { enumerable: true, get: function () { return html_factory_1.createDefaultDocumentHtmlFactory; } });
10
+ /**
11
+ * Placeholder environment values for `medusa build`. `medusa-config.ts` is
12
+ * evaluated at build time, where the runtime-only Documents PDF executable
13
+ * is not set; spread these under the real environment during the build.
14
+ */
15
+ exports.DOCUMENTS_BUILD_PLACEHOLDERS = {
16
+ DOCUMENT_PDF_EXECUTABLE: "google-chrome",
17
+ };
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZG9jdW1lbnRzL2NvbmZpZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7O0dBR0c7QUFDSCwwREFBNEU7QUFBbkUsZ0lBQUEsZ0NBQWdDLE9BQUE7QUFFekM7Ozs7R0FJRztBQUNVLFFBQUEsNEJBQTRCLEdBQXFDO0lBQzVFLHVCQUF1QixFQUFFLGVBQWU7Q0FDekMsQ0FBQSJ9
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.documentsPaths = void 0;
4
+ var documents_1 = require("@hartl-services/medusa-food-supplements-contracts/paths/documents");
5
+ Object.defineProperty(exports, "documentsPaths", { enumerable: true, get: function () { return documents_1.documentsPaths; } });
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy9wYXRocy9kb2N1bWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0ZBQWtHO0FBQXpGLDJHQUFBLGNBQWMsT0FBQSJ9
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./documents"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZG9jdW1lbnRzL3BhdGhzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw4Q0FBMkIifQ==
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.documentsPluginFeatures = void 0;
4
+ const public_1 = require("../public");
5
+ exports.documentsPluginFeatures = (0, public_1.definePluginFeatures)({
6
+ plugin_key: "documents",
7
+ label: "Dokumente",
8
+ description: "Rechnungen, Stornos und Packlisten zu Bestellungen. Ausgeschaltet sind alle Dokument-Routen in Admin und Storefront nicht erreichbar und es werden keine neuen Dokumente erstellt; bereits ausgestellte Dokumente bleiben gespeichert. Checkout, Fulfillment und Versand laufen unverändert weiter.",
9
+ features: [
10
+ {
11
+ key: "invoices",
12
+ label: "Rechnungen & Stornos",
13
+ description: "Rechnungen nach Versand, Stornorechnungen bei Stornierung und Erstattung sowie deren Abruf im Admin und im Kundenkonto. Ausgeschaltet wird für neue Versendungen, Stornierungen und Erstattungen keine Rechnung, kein Storno und kein Erstattungsdokument ausgestellt, und auch später nicht nachträglich (die Ereignisse werden nicht erneut abgespielt). Versand- und Storno-Mails werden dann ohne Beleg verschickt; Erstattungs-Mails entfallen.",
14
+ default_enabled: true,
15
+ },
16
+ {
17
+ key: "packing_lists",
18
+ label: "Packlisten",
19
+ description: "Packlisten je Fulfillment inklusive Chargenrevisionen und Abruf im Admin.",
20
+ default_enabled: true,
21
+ },
22
+ ],
23
+ settings: [
24
+ {
25
+ key: "logo",
26
+ label: "Logo",
27
+ description: "PNG oder JPG, erscheint oben links auf Rechnungen, Stornos und Packlisten. Am besten mindestens 1000 px breit, auf weißem oder transparentem Hintergrund. Ohne Logo steht dort der Firmenname.",
28
+ type: "image",
29
+ },
30
+ {
31
+ key: "payment_terms",
32
+ label: "Zahlungskonditionen",
33
+ description: "Erscheint auf Rechnungen unter den Summen, z. B. „Der Betrag wurde bei der Bestellung per Kreditkarte bezahlt.“ Leer lassen, wenn nichts stehen soll. Gilt für neu erstellte und neu erzeugte Rechnungen.",
34
+ type: "string",
35
+ },
36
+ ],
37
+ });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWZlYXR1cmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy9wbHVnaW4tZmVhdHVyZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0NBQWdEO0FBRW5DLFFBQUEsdUJBQXVCLEdBQUcsSUFBQSw2QkFBb0IsRUFBQztJQUMxRCxVQUFVLEVBQUUsV0FBVztJQUN2QixLQUFLLEVBQUUsV0FBVztJQUNsQixXQUFXLEVBQ1QscVNBQXFTO0lBQ3ZTLFFBQVEsRUFBRTtRQUNSO1lBQ0UsR0FBRyxFQUFFLFVBQVU7WUFDZixLQUFLLEVBQUUsc0JBQXNCO1lBQzdCLFdBQVcsRUFDVCxzYkFBc2I7WUFDeGIsZUFBZSxFQUFFLElBQUk7U0FDdEI7UUFDRDtZQUNFLEdBQUcsRUFBRSxlQUFlO1lBQ3BCLEtBQUssRUFBRSxZQUFZO1lBQ25CLFdBQVcsRUFDVCwyRUFBMkU7WUFDN0UsZUFBZSxFQUFFLElBQUk7U0FDdEI7S0FDRjtJQUNELFFBQVEsRUFBRTtRQUNSO1lBQ0UsR0FBRyxFQUFFLE1BQU07WUFDWCxLQUFLLEVBQUUsTUFBTTtZQUNiLFdBQVcsRUFDVCxnTUFBZ007WUFDbE0sSUFBSSxFQUFFLE9BQU87U0FDZDtRQUNEO1lBQ0UsR0FBRyxFQUFFLGVBQWU7WUFDcEIsS0FBSyxFQUFFLHFCQUFxQjtZQUM1QixXQUFXLEVBQ1QsMk1BQTJNO1lBQzdNLElBQUksRUFBRSxRQUFRO1NBQ2Y7S0FDRjtDQUNGLENBQUMsQ0FBQSJ9
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("@hartl-services/medusa-food-supplements-contracts/schemas/documents"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy9zY2hlbWFzL2RvY3VtZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0dBQW1GIn0=
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./documents"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZG9jdW1lbnRzL3NjaGVtYXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQUEyQiJ9
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = verifyDocumentsFileStorage;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const PAGE_SIZE = 100;
7
+ const DOCUMENTS_MODULE = "documents";
8
+ const hashIdentifier = (value) => (0, node_crypto_1.createHash)("sha256").update(value).digest("hex").slice(0, 12);
9
+ const countStreamBytes = async (stream) => {
10
+ let bytes = 0;
11
+ for await (const chunk of stream) {
12
+ bytes += Buffer.isBuffer(chunk)
13
+ ? chunk.length
14
+ : Buffer.byteLength(String(chunk));
15
+ }
16
+ return bytes;
17
+ };
18
+ /**
19
+ * Read-only restore drill for private Documents files through the active
20
+ * Medusa File provider. It intentionally does not change document or product
21
+ * data, and works against local storage or the S3 cache provider.
22
+ *
23
+ * Run after an object-store restore:
24
+ * pnpm exec medusa exec ./node_modules/@hartl-services/medusa-base/.medusa/server/src/documents/scripts/verify-documents-file-storage.js
25
+ *
26
+ * Deliberately not under `migration-scripts`: Medusa runs every plugin
27
+ * `migration-scripts` file on `db:migrate`, this drill must only run on demand.
28
+ */
29
+ async function verifyDocumentsFileStorage({ container, }) {
30
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
31
+ if (!container.hasRegistration(DOCUMENTS_MODULE)) {
32
+ logger.info("Skipping Documents file storage verification: the Documents module is not enabled for this shop.");
33
+ return;
34
+ }
35
+ const documents = container.resolve(DOCUMENTS_MODULE);
36
+ const files = container.resolve(utils_1.Modules.FILE);
37
+ let documentCount = 0;
38
+ let totalBytes = 0;
39
+ for (let skip = 0;; skip += PAGE_SIZE) {
40
+ const page = await documents.listDocuments({ status: "issued" }, { skip, take: PAGE_SIZE });
41
+ for (const document of page) {
42
+ if (!document.file_id) {
43
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Issued document ${hashIdentifier(document.id)} has no File Module key.`);
44
+ }
45
+ const stream = await files.getDownloadStream(document.file_id);
46
+ totalBytes += await countStreamBytes(stream);
47
+ documentCount += 1;
48
+ }
49
+ if (page.length < PAGE_SIZE) {
50
+ break;
51
+ }
52
+ }
53
+ logger.info(`Verified ${documentCount} issued document files through the active File provider (${totalBytes} bytes).`);
54
+ }
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5LWRvY3VtZW50cy1maWxlLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZG9jdW1lbnRzL3NjcmlwdHMvdmVyaWZ5LWRvY3VtZW50cy1maWxlLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFtREEsNkNBK0NDO0FBbEdELDZDQUF3QztBQUl4QyxxREFJa0M7QUFjbEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFBO0FBQ3JCLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFBO0FBRXBDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBYSxFQUFVLEVBQUUsQ0FDL0MsSUFBQSx3QkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUUvRCxNQUFNLGdCQUFnQixHQUFHLEtBQUssRUFDNUIsTUFBOEIsRUFDYixFQUFFO0lBQ25CLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQTtJQUNiLElBQUksS0FBSyxFQUFFLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ2pDLEtBQUssSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUM3QixDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU07WUFDZCxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDLENBQUE7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ1ksS0FBSyxVQUFVLDBCQUEwQixDQUFDLEVBQ3ZELFNBQVMsR0FHVjtJQUNDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFbEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxJQUFJLENBQ1Qsa0dBQWtHLENBQ25HLENBQUE7UUFDRCxPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQW9CLENBQUE7SUFDeEUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsSUFBSSxDQUF1QixDQUFBO0lBRW5FLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQTtJQUNyQixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUE7SUFFbEIsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUksSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLE1BQU0sU0FBUyxDQUFDLGFBQWEsQ0FDeEMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQ3BCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FDMUIsQ0FBQTtRQUVELEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyxtQkFBbUIsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsMEJBQTBCLENBQ3pFLENBQUE7WUFDSCxDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQzlELFVBQVUsSUFBSSxNQUFNLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQzVDLGFBQWEsSUFBSSxDQUFDLENBQUE7UUFDcEIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUM1QixNQUFLO1FBQ1AsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSSxDQUNULFlBQVksYUFBYSw0REFBNEQsVUFBVSxVQUFVLENBQzFHLENBQUE7QUFDSCxDQUFDIn0=