@hartl-services/medusa-base 2.6.1 → 2.7.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 (148) hide show
  1. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/ImageSettingInput.d.ts +3 -2
  2. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/ImageSettingInput.js +4 -4
  3. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginActionsSection.js +4 -4
  4. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginBreadcrumb.d.ts +16 -0
  5. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginBreadcrumb.js +25 -0
  6. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginDetailPage.js +1 -1
  7. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginFeatureSections.d.ts +5 -4
  8. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginFeatureSections.js +8 -5
  9. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginFeaturesCard.d.ts +4 -4
  10. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginFeaturesCard.js +24 -27
  11. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.d.ts +2 -2
  12. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.js +9 -9
  13. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginHubCard.d.ts +5 -1
  14. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginHubCard.js +11 -15
  15. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginPageShell.d.ts +10 -4
  16. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginPageShell.js +10 -5
  17. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginSettingsForm.d.ts +0 -1
  18. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginSettingsForm.js +73 -26
  19. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginStatusChips.d.ts +5 -1
  20. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginStatusChips.js +8 -6
  21. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/ShopMasterDataBanner.d.ts +11 -0
  22. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/ShopMasterDataBanner.js +15 -0
  23. package/.medusa/server/src/admin/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +36 -5
  24. package/.medusa/server/src/admin/admin-components/features/plugin-features/hooks/usePluginFeatures.d.ts +144 -20
  25. package/.medusa/server/src/admin/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +36 -5
  26. package/.medusa/server/src/admin/admin-components/features/plugin-features/hooks/usePluginSwitch.d.ts +15 -0
  27. package/.medusa/server/src/admin/admin-components/features/plugin-features/hooks/usePluginSwitch.js +66 -0
  28. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +144 -20
  29. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/plugin-view.d.ts +49 -0
  30. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/plugin-view.js +72 -0
  31. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/settings-draft.d.ts +1 -12
  32. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/settings-draft.js +4 -20
  33. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/settings-layout.d.ts +43 -0
  34. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/settings-layout.js +66 -0
  35. package/.medusa/server/src/admin/admin-components/i18n/texts.d.ts +22 -2
  36. package/.medusa/server/src/admin/admin-components/i18n/texts.js +29 -7
  37. package/.medusa/server/src/admin/admin-components/index.d.ts +12 -0
  38. package/.medusa/server/src/admin/admin-components/index.js +11 -0
  39. package/.medusa/server/src/admin/admin-components/shared/ui/AdminPageHeader.d.ts +22 -0
  40. package/.medusa/server/src/admin/admin-components/shared/ui/AdminPageHeader.js +8 -0
  41. package/.medusa/server/src/admin/admin-components/shared/ui/AdminSection.d.ts +26 -0
  42. package/.medusa/server/src/admin/admin-components/shared/ui/AdminSection.js +12 -0
  43. package/.medusa/server/src/admin/admin-components/shared/ui/BreadcrumbTrail.d.ts +23 -0
  44. package/.medusa/server/src/admin/admin-components/shared/ui/BreadcrumbTrail.js +20 -0
  45. package/.medusa/server/src/admin/admin-components/shared/ui/FileDropField.d.ts +21 -0
  46. package/.medusa/server/src/admin/admin-components/shared/ui/FileDropField.js +33 -0
  47. package/.medusa/server/src/admin/admin-components/shared/ui/FocusModalShell.d.ts +27 -0
  48. package/.medusa/server/src/admin/admin-components/shared/ui/FocusModalShell.js +13 -0
  49. package/.medusa/server/src/admin/admin-components/shared/ui/InfoTooltip.d.ts +13 -0
  50. package/.medusa/server/src/admin/admin-components/shared/ui/InfoTooltip.js +8 -0
  51. package/.medusa/server/src/admin/admin-components/shared/ui/MultiSelectDropdown.d.ts +22 -0
  52. package/.medusa/server/src/admin/admin-components/shared/ui/MultiSelectDropdown.js +14 -0
  53. package/.medusa/server/src/admin/admin-components/shared/ui/PluginIcon.d.ts +10 -0
  54. package/.medusa/server/src/admin/admin-components/shared/ui/PluginIcon.js +10 -0
  55. package/.medusa/server/src/admin/admin-components/shared/ui/SwitchRow.d.ts +27 -0
  56. package/.medusa/server/src/admin/admin-components/shared/ui/SwitchRow.js +15 -0
  57. package/.medusa/server/src/admin/admin-components/shared/ui/WidgetHeader.d.ts +15 -0
  58. package/.medusa/server/src/admin/admin-components/shared/ui/WidgetHeader.js +8 -0
  59. package/.medusa/server/src/admin/admin-components/shared/ui/file-drop.d.ts +13 -0
  60. package/.medusa/server/src/admin/admin-components/shared/ui/file-drop.js +16 -0
  61. package/.medusa/server/src/admin/admin-components/shared/ui/multi-select.d.ts +13 -0
  62. package/.medusa/server/src/admin/admin-components/shared/ui/multi-select.js +11 -0
  63. package/.medusa/server/src/admin/admin-components/shared/ui/plugin-icon.d.ts +12 -0
  64. package/.medusa/server/src/admin/admin-components/shared/ui/plugin-icon.js +29 -0
  65. package/.medusa/server/src/admin/index.js +3118 -2020
  66. package/.medusa/server/src/admin/index.mjs +3121 -2023
  67. package/.medusa/server/src/api/admin-first-login-password-policy.js +56 -0
  68. package/.medusa/server/src/api/answer-actor-type-casing-not-found.js +26 -0
  69. package/.medusa/server/src/api/answer-code-provider-route-not-found.js +34 -0
  70. package/.medusa/server/src/api/code-account-password-routes.js +92 -0
  71. package/.medusa/server/src/api/middlewares.js +82 -17
  72. package/.medusa/server/src/api/password-policy.js +55 -10
  73. package/.medusa/server/src/api/require-login-code-customer-email.js +40 -0
  74. package/.medusa/server/src/api/store/customer-auth/login-code/route.js +17 -0
  75. package/.medusa/server/src/api/store/customer-auth/password-policy/route.js +19 -0
  76. package/.medusa/server/src/customer-auth/application/prepare-code-account-password-reset.js +111 -0
  77. package/.medusa/server/src/customer-auth/application/request-login-code.js +145 -0
  78. package/.medusa/server/src/customer-auth/customer-auth-methods-snapshot.js +55 -0
  79. package/.medusa/server/src/customer-auth/customer-password-policy.js +40 -0
  80. package/.medusa/server/src/customer-auth/domain/account-linking.js +53 -0
  81. package/.medusa/server/src/customer-auth/domain/auth-methods.js +32 -0
  82. package/.medusa/server/src/customer-auth/domain/login-code.js +39 -0
  83. package/.medusa/server/src/customer-auth/login-code-accounts.js +146 -0
  84. package/.medusa/server/src/customer-auth/login-code-state.js +139 -0
  85. package/.medusa/server/src/customer-auth/plugin-features.js +80 -0
  86. package/.medusa/server/src/customer-auth/remove-provider-identity.js +18 -0
  87. package/.medusa/server/src/customer-auth/start-customer-auth-methods.js +20 -0
  88. package/.medusa/server/src/documents/plugin-features.js +8 -2
  89. package/.medusa/server/src/email/application/deliver-ephemeral-auth-mail.js +186 -0
  90. package/.medusa/server/src/email/application/deliver-login-code.js +89 -0
  91. package/.medusa/server/src/email/application/handle-customer-verification-event.js +29 -168
  92. package/.medusa/server/src/email/application/handle-password-reset-event.js +27 -166
  93. package/.medusa/server/src/email/customer-verification-snapshot.js +20 -108
  94. package/.medusa/server/src/email/domain/business-keys.js +15 -2
  95. package/.medusa/server/src/email/plugin-features.js +8 -3
  96. package/.medusa/server/src/email/rendering/default-templates.js +2 -1
  97. package/.medusa/server/src/email/templates/blocks/dynamic-blocks.js +19 -1
  98. package/.medusa/server/src/email/templates/defaults/documents.js +7 -1
  99. package/.medusa/server/src/email/templates/defaults/subjects.js +3 -1
  100. package/.medusa/server/src/email/templates/defaults/texts.js +5 -2
  101. package/.medusa/server/src/email/templates/render.js +2 -1
  102. package/.medusa/server/src/email/templates/sample-data.js +2 -1
  103. package/.medusa/server/src/email/templates/validate.js +8 -3
  104. package/.medusa/server/src/email/types/email-kinds.js +4 -2
  105. package/.medusa/server/src/email/types/template-data.js +9 -1
  106. package/.medusa/server/src/modules/customer-auth/index.js +14 -0
  107. package/.medusa/server/src/modules/customer-auth/service.js +35 -0
  108. package/.medusa/server/src/modules/email/migrations/Migration20261010090000.js +20 -0
  109. package/.medusa/server/src/modules/plugin-features/domain/plugin-settings.js +4 -1
  110. package/.medusa/server/src/modules/plugin-features/service.js +26 -1
  111. package/.medusa/server/src/providers/email-otp/index.js +8 -0
  112. package/.medusa/server/src/providers/email-otp/service.js +96 -0
  113. package/.medusa/server/src/public/descriptor.js +117 -5
  114. package/.medusa/server/src/public/effective-features.js +22 -1
  115. package/.medusa/server/src/public/index.js +4 -2
  116. package/.medusa/server/src/public/plugin-icons.js +28 -0
  117. package/.medusa/server/src/public/shop-master-data.js +33 -14
  118. package/.medusa/server/src/shared/lib/index.js +2 -1
  119. package/.medusa/server/src/shared/lib/refreshing-snapshot.js +122 -0
  120. package/.medusa/server/src/shop-config/build-food-shop-config.js +38 -1
  121. package/README.md +436 -87
  122. package/dist/customer-auth/customer-auth-methods-snapshot.d.ts +25 -0
  123. package/dist/customer-auth/customer-auth-methods-snapshot.js +54 -0
  124. package/dist/customer-auth/domain/auth-methods.d.ts +16 -0
  125. package/dist/customer-auth/domain/auth-methods.js +31 -0
  126. package/dist/customer-auth/plugin-features.d.ts +2 -0
  127. package/dist/customer-auth/plugin-features.js +79 -0
  128. package/dist/email/customer-verification-snapshot.d.ts +3 -15
  129. package/dist/email/customer-verification-snapshot.js +19 -107
  130. package/dist/email/types/email-kinds.d.ts +4 -3
  131. package/dist/email/types/email-kinds.js +3 -1
  132. package/dist/email/types/template-data.d.ts +8 -0
  133. package/dist/email/types/template-data.js +8 -0
  134. package/dist/public/descriptor.js +116 -4
  135. package/dist/public/effective-features.d.ts +10 -0
  136. package/dist/public/effective-features.js +21 -0
  137. package/dist/public/index.d.ts +2 -1
  138. package/dist/public/index.js +3 -1
  139. package/dist/public/plugin-icons.d.ts +7 -0
  140. package/dist/public/plugin-icons.js +27 -0
  141. package/dist/public/shop-master-data.js +32 -13
  142. package/dist/public/types.d.ts +63 -1
  143. package/dist/shared/lib/index.d.ts +1 -0
  144. package/dist/shared/lib/index.js +1 -0
  145. package/dist/shared/lib/refreshing-snapshot.d.ts +52 -0
  146. package/dist/shared/lib/refreshing-snapshot.js +121 -0
  147. package/dist/shop-config/build-food-shop-config.js +37 -0
  148. package/package.json +8 -3
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendLoginCodeMail = exports.LOGIN_CODE_MAIL_MAX_ATTEMPTS = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const customer_auth_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/customer-auth");
6
+ const business_keys_1 = require("../domain/business-keys");
7
+ const email_1 = require("../../modules/email");
8
+ const render_email_1 = require("../rendering/render-email");
9
+ const deliver_ephemeral_auth_mail_1 = require("./deliver-ephemeral-auth-mail");
10
+ /** The same two attempts as the password reset mail. */
11
+ exports.LOGIN_CODE_MAIL_MAX_ATTEMPTS = 2;
12
+ /**
13
+ * One delivery attempt of the claimed message. The code exists only in this
14
+ * call's arguments and in the rendered content handed to the notification
15
+ * module: the message stores no template data, the notification record keeps
16
+ * only ids, and nothing here is logged.
17
+ */
18
+ const deliverAttempt = async (container, email, claim, code, expiresAt) => {
19
+ const outcome = await (0, deliver_ephemeral_auth_mail_1.deliverEphemeralAuthMail)({
20
+ claim,
21
+ container,
22
+ email,
23
+ expiresAt,
24
+ getNow: () => new Date(),
25
+ kind: "auth.login_code",
26
+ maxAttempts: exports.LOGIN_CODE_MAIL_MAX_ATTEMPTS,
27
+ render: ({ configuration, shop, template }) => (0, render_email_1.renderEmail)(configuration, {
28
+ kind: "auth.login_code",
29
+ data: { code, valid_minutes: customer_auth_1.LOGIN_CODE_TTL_MINUTES },
30
+ }, shop, template),
31
+ // Due immediately: the caller claims the message again at once.
32
+ retryDelayMs: 0,
33
+ triggerType: "email.login_code.dispatch",
34
+ });
35
+ if (outcome.kind === "retry") {
36
+ return outcome;
37
+ }
38
+ const { attempt_id: _attemptId, ...result } = outcome.result;
39
+ return { kind: "done", result };
40
+ };
41
+ /**
42
+ * Sends the login code mail (`auth.login_code`): records the message, claims
43
+ * it and delivers it, retrying once on a temporary failure like the password
44
+ * reset mail. The message is ephemeral (`EPHEMERAL_EMAIL_KINDS`): the code is
45
+ * never stored in its `template_data`, and neither the generic retry job nor
46
+ * the automatic dispatch nor an Admin resend can touch it.
47
+ *
48
+ * The mail is deliberately not gated by the `account_mails` feature or the
49
+ * E-Mail plugin's own switch: with the code login on, login would otherwise
50
+ * be impossible.
51
+ */
52
+ const sendLoginCodeMail = async (container, input) => {
53
+ const email = container.resolve(email_1.EMAIL_MODULE);
54
+ const message = await email.upsertMessageFact({
55
+ kind: "auth.login_code",
56
+ business_key: (0, business_keys_1.loginCodeBusinessKey)((0, node_crypto_1.randomUUID)()),
57
+ resource_type: "customer",
58
+ resource_id: input.customerId,
59
+ recipient: input.to,
60
+ required_facts: ["login_code"],
61
+ fact: "login_code",
62
+ template_data: {},
63
+ payload_expires_at: input.expiresAt,
64
+ });
65
+ for (let attempt = 1; attempt <= exports.LOGIN_CODE_MAIL_MAX_ATTEMPTS; attempt += 1) {
66
+ const claim = await email.claimReadyMessage({
67
+ message_id: message.id,
68
+ now: new Date(),
69
+ });
70
+ if (!claim) {
71
+ return {
72
+ code: "claim_failed",
73
+ message_id: message.id,
74
+ status: "failed",
75
+ };
76
+ }
77
+ const outcome = await deliverAttempt(container, email, claim, input.code, input.expiresAt);
78
+ if (outcome.kind === "done") {
79
+ return outcome.result;
80
+ }
81
+ }
82
+ return {
83
+ code: "retry_exhausted",
84
+ message_id: message.id,
85
+ status: "failed",
86
+ };
87
+ };
88
+ exports.sendLoginCodeMail = sendLoginCodeMail;
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsaXZlci1sb2dpbi1jb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VtYWlsL2FwcGxpY2F0aW9uL2RlbGl2ZXItbG9naW4tY29kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBeUM7QUFHekMsMkdBQWlIO0FBRWpILDJEQUErRDtBQUMvRCwrQ0FBbUQ7QUFHbkQsNERBQXdEO0FBQ3hELCtFQUF5RTtBQUV6RSx3REFBd0Q7QUFDM0MsUUFBQSw0QkFBNEIsR0FBRyxDQUFDLENBQUM7QUFZOUM7Ozs7O0dBS0c7QUFDSCxNQUFNLGNBQWMsR0FBRyxLQUFLLEVBQzFCLFNBQTBCLEVBQzFCLEtBQXlCLEVBQ3pCLEtBQXdCLEVBQ3hCLElBQVksRUFDWixTQUFlLEVBQ1UsRUFBRTtJQUMzQixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEsc0RBQXdCLEVBQUM7UUFDN0MsS0FBSztRQUNMLFNBQVM7UUFDVCxLQUFLO1FBQ0wsU0FBUztRQUNULE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRTtRQUN4QixJQUFJLEVBQUUsaUJBQWlCO1FBQ3ZCLFdBQVcsRUFBRSxvQ0FBNEI7UUFDekMsTUFBTSxFQUFFLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FDNUMsSUFBQSwwQkFBVyxFQUNULGFBQWEsRUFDYjtZQUNFLElBQUksRUFBRSxpQkFBaUI7WUFDdkIsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxzQ0FBc0IsRUFBRTtTQUN0RCxFQUNELElBQUksRUFDSixRQUFRLENBQ1Q7UUFDSCxnRUFBZ0U7UUFDaEUsWUFBWSxFQUFFLENBQUM7UUFDZixXQUFXLEVBQUUsMkJBQTJCO0tBQ3pDLENBQUMsQ0FBQztJQUNILElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUM3QixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBQ0QsTUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQzdELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ2xDLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7O0dBVUc7QUFDSSxNQUFNLGlCQUFpQixHQUFHLEtBQUssRUFDcEMsU0FBMEIsRUFDMUIsS0FLRSxFQUM0QixFQUFFO0lBQ2hDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQXFCLG9CQUFZLENBQUMsQ0FBQztJQUNsRSxNQUFNLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztRQUM1QyxJQUFJLEVBQUUsaUJBQWlCO1FBQ3ZCLFlBQVksRUFBRSxJQUFBLG9DQUFvQixFQUFDLElBQUEsd0JBQVUsR0FBRSxDQUFDO1FBQ2hELGFBQWEsRUFBRSxVQUFVO1FBQ3pCLFdBQVcsRUFBRSxLQUFLLENBQUMsVUFBVTtRQUM3QixTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDbkIsY0FBYyxFQUFFLENBQUMsWUFBWSxDQUFDO1FBQzlCLElBQUksRUFBRSxZQUFZO1FBQ2xCLGFBQWEsRUFBRSxFQUFFO1FBQ2pCLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxTQUFTO0tBQ3BDLENBQUMsQ0FBQztJQUVILEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sSUFBSSxvQ0FBNEIsRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDNUUsTUFBTSxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUMsaUJBQWlCLENBQUM7WUFDMUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ3RCLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRTtTQUNoQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPO2dCQUNMLElBQUksRUFBRSxjQUFjO2dCQUNwQixVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQ3RCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxjQUFjLENBQ2xDLFNBQVMsRUFDVCxLQUFLLEVBQ0wsS0FBSyxFQUNMLEtBQUssQ0FBQyxJQUFJLEVBQ1YsS0FBSyxDQUFDLFNBQVMsQ0FDaEIsQ0FBQztRQUNGLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUM1QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLGlCQUFpQjtRQUN2QixVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDdEIsTUFBTSxFQUFFLFFBQVE7S0FDakIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQWxEVyxRQUFBLGlCQUFpQixxQkFrRDVCIn0=
@@ -2,14 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.handleCustomerVerificationEvent = exports.CUSTOMER_VERIFICATION_RETRY_SENTINEL = exports.CUSTOMER_VERIFICATION_MAX_ATTEMPTS = void 0;
4
4
  const utils_1 = require("@medusajs/framework/utils");
5
- const failure_classification_1 = require("../domain/failure-classification");
6
5
  const business_keys_1 = require("../domain/business-keys");
7
6
  const event_schemas_1 = require("../domain/event-schemas");
8
7
  const email_1 = require("../../modules/email");
9
- const load_email_shop_details_1 = require("../rendering/load-email-shop-details");
10
8
  const render_email_1 = require("../rendering/render-email");
11
- const load_template_1 = require("../templates/load-template");
12
9
  const dispatch_email_message_1 = require("../../workflows/email/dispatch-email-message");
10
+ const deliver_ephemeral_auth_mail_1 = require("./deliver-ephemeral-auth-mail");
13
11
  exports.CUSTOMER_VERIFICATION_MAX_ATTEMPTS = 2;
14
12
  exports.CUSTOMER_VERIFICATION_RETRY_SENTINEL = "EMAIL_CUSTOMER_VERIFICATION_RETRY";
15
13
  const emailAddressPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
@@ -27,20 +25,6 @@ const resultForMessage = (message, code) => ({
27
25
  ? "failed"
28
26
  : "in_progress",
29
27
  });
30
- const asNotificationRecord = (value) => {
31
- if (!value || typeof value !== "object") {
32
- return null;
33
- }
34
- const record = value;
35
- if (typeof record.id !== "string" ||
36
- !record.id.trim() ||
37
- (record.status !== "failure" &&
38
- record.status !== "pending" &&
39
- record.status !== "success")) {
40
- return null;
41
- }
42
- return { id: record.id, status: record.status };
43
- };
44
28
  const localeFromMetadata = (metadata) => {
45
29
  const locale = metadata.locale;
46
30
  return typeof locale === "string" &&
@@ -111,159 +95,36 @@ const reconcileSendingMessage = async (container, email, message, now) => {
111
95
  }
112
96
  return retry();
113
97
  };
114
- const failClaim = async (email, claim, code, now, notificationId = null) => {
115
- const completed = await email.markAttemptFailed({
116
- attempt_id: claim.attempt.id,
117
- attempt_token: claim.attempt_token,
118
- failure_code: code,
119
- finished_at: now,
120
- notification_id: notificationId,
121
- });
122
- return {
123
- attempt_id: claim.attempt.id,
124
- code,
125
- message_id: completed.message.id,
126
- status: "failed",
127
- };
128
- };
129
98
  const deliverCustomerVerification = async (container, email, claim, token, expiresAt, getNow) => {
130
- // A stored template never fails the mail: it falls back to the default.
131
- const [shop, template] = await Promise.all([
132
- (0, load_email_shop_details_1.loadEmailShopDetails)(container),
133
- (0, load_template_1.loadEmailTemplate)(container, email, "auth.verification"),
134
- ]);
135
- let rendered;
136
- try {
137
- const configuration = email.getDispatchConfiguration();
138
- const verificationData = claim.message.template_data;
139
- if (!configuration.verifyAccountUrl) {
140
- throw new Error("verifyAccountUrl is not configured.");
141
- }
142
- const verifyUrl = new URL(configuration.verifyAccountUrl({
143
- locale: verificationData?.locale ?? null,
144
- }));
145
- verifyUrl.hash = new URLSearchParams({ token }).toString();
146
- rendered = (0, render_email_1.renderEmail)(configuration, {
147
- kind: "auth.verification",
148
- data: {
99
+ const outcome = await (0, deliver_ephemeral_auth_mail_1.deliverEphemeralAuthMail)({
100
+ claim,
101
+ container,
102
+ email,
103
+ expiresAt,
104
+ getNow,
105
+ kind: "auth.verification",
106
+ maxAttempts: exports.CUSTOMER_VERIFICATION_MAX_ATTEMPTS,
107
+ render: ({ configuration, shop, template }) => {
108
+ const verificationData = claim.message.template_data;
109
+ if (!configuration.verifyAccountUrl) {
110
+ throw new Error("verifyAccountUrl is not configured.");
111
+ }
112
+ const verifyUrl = new URL(configuration.verifyAccountUrl({
149
113
  locale: verificationData?.locale ?? null,
150
- verify_url: verifyUrl.toString(),
151
- },
152
- }, shop, template);
153
- }
154
- catch {
155
- return await failClaim(email, claim, "render_failed", getNow());
156
- }
157
- const beforeNotification = getNow();
158
- if (expiresAt.getTime() <= beforeNotification.getTime()) {
159
- return await failClaim(email, claim, "payload_expired", beforeNotification);
160
- }
161
- try {
162
- await email.renewAttemptLease({
163
- attempt_id: claim.attempt.id,
164
- attempt_token: claim.attempt_token,
165
- now: beforeNotification,
166
- });
167
- }
168
- catch {
169
- return retry();
170
- }
171
- const notifications = container.resolve(utils_1.Modules.NOTIFICATION);
172
- const safeData = {
173
- attempt_id: claim.attempt.id,
174
- kind: claim.message.kind,
175
- message_id: claim.message.id,
176
- };
177
- let creationError;
178
- let created = null;
179
- try {
180
- created = asNotificationRecord(await notifications.createNotifications({
181
- channel: "email",
182
- content: {
183
- html: rendered.html,
184
- subject: rendered.subject,
185
- text: rendered.text,
186
- },
187
- data: safeData,
188
- idempotency_key: (0, failure_classification_1.emailAttemptNotificationKey)(claim.attempt.id),
189
- ...(claim.previous_notification_id
190
- ? { original_notification_id: claim.previous_notification_id }
191
- : {}),
192
- provider_data: safeData,
193
- ...(claim.message.resource_id
194
- ? { resource_id: claim.message.resource_id }
195
- : {}),
196
- resource_type: "customer",
197
- template: claim.message.kind,
198
- to: claim.message.recipient,
199
- trigger_type: "email.customer_verification.dispatch",
200
- }));
201
- }
202
- catch (error) {
203
- creationError = error;
204
- }
205
- let persisted = null;
206
- let lookupFailed = false;
207
- if (!created || creationError) {
208
- try {
209
- persisted = await (0, dispatch_email_message_1.findAttemptNotification)(container, claim.attempt.id);
210
- }
211
- catch {
212
- lookupFailed = true;
213
- }
214
- }
215
- const notification = created ?? persisted;
216
- const finishedAt = getNow();
217
- if (notification?.status === "success") {
218
- const completed = await email.markAttemptSent({
219
- attempt_id: claim.attempt.id,
220
- attempt_token: claim.attempt_token,
221
- finished_at: finishedAt,
222
- notification_id: notification.id,
223
- });
224
- return {
225
- attempt_id: claim.attempt.id,
226
- message_id: completed.message.id,
227
- status: "sent",
228
- };
229
- }
230
- const failure = creationError && notification?.status === "failure" && !lookupFailed
231
- ? (0, failure_classification_1.classifyNotificationFailure)(creationError)
232
- : { code: "outcome_unknown", outcome: "unknown" };
233
- if (failure.outcome === "retryable") {
234
- const nextAttemptAt = new Date(finishedAt.getTime() + 1_000);
235
- if (claim.attempt.attempt_number < exports.CUSTOMER_VERIFICATION_MAX_ATTEMPTS &&
236
- nextAttemptAt.getTime() < expiresAt.getTime()) {
237
- await email.markAttemptRetryable({
238
- attempt_id: claim.attempt.id,
239
- attempt_token: claim.attempt_token,
240
- failure_code: failure.code,
241
- finished_at: finishedAt,
242
- next_attempt_at: nextAttemptAt,
243
- notification_id: notification?.id ?? null,
244
- });
245
- return retry();
246
- }
247
- return await failClaim(email, claim, expiresAt.getTime() <= nextAttemptAt.getTime()
248
- ? "payload_expired"
249
- : "retry_exhausted", finishedAt, notification?.id ?? null);
250
- }
251
- if (failure.outcome === "failed") {
252
- return await failClaim(email, claim, failure.code, finishedAt, notification?.id ?? null);
253
- }
254
- const completed = await email.markAttemptUnknown({
255
- attempt_id: claim.attempt.id,
256
- attempt_token: claim.attempt_token,
257
- failure_code: failure.code,
258
- finished_at: finishedAt,
259
- notification_id: notification?.id ?? null,
114
+ }));
115
+ verifyUrl.hash = new URLSearchParams({ token }).toString();
116
+ return (0, render_email_1.renderEmail)(configuration, {
117
+ kind: "auth.verification",
118
+ data: {
119
+ locale: verificationData?.locale ?? null,
120
+ verify_url: verifyUrl.toString(),
121
+ },
122
+ }, shop, template);
123
+ },
124
+ retryDelayMs: 1_000,
125
+ triggerType: "email.customer_verification.dispatch",
260
126
  });
261
- return {
262
- attempt_id: claim.attempt.id,
263
- code: failure.code,
264
- message_id: completed.message.id,
265
- status: "unknown",
266
- };
127
+ return outcome.kind === "retry" ? retry() : outcome.result;
267
128
  };
268
129
  const handleCustomerVerification = async (container, event, getNow) => {
269
130
  const now = getNow();
@@ -343,4 +204,4 @@ const handleCustomerVerificationEvent = async (container, payload, clock = () =>
343
204
  }
344
205
  };
345
206
  exports.handleCustomerVerificationEvent = handleCustomerVerificationEvent;
346
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLWN1c3RvbWVyLXZlcmlmaWNhdGlvbi1ldmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbWFpbC9hcHBsaWNhdGlvbi9oYW5kbGUtY3VzdG9tZXItdmVyaWZpY2F0aW9uLWV2ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLHFEQUFvRDtBQUVwRCw2RUFHMEM7QUFDMUMsMkRBQTBFO0FBQzFFLDJEQUdpQztBQUNqQywrQ0FBbUQ7QUFNbkQsa0ZBQTRFO0FBQzVFLDREQUF3RDtBQUN4RCw4REFBK0Q7QUFFL0QseUZBQXVGO0FBRTFFLFFBQUEsa0NBQWtDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLFFBQUEsb0NBQW9DLEdBQy9DLG1DQUFtQyxDQUFDO0FBRXRDLE1BQU0sbUJBQW1CLEdBQUcsNEJBQTRCLENBQUM7QUFjekQsTUFBTSxLQUFLLEdBQUcsR0FBVSxFQUFFO0lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQW9DLENBQUMsQ0FBQztBQUN4RCxDQUFDLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHLENBQ3ZCLE9BQTJCLEVBQzNCLElBQWEsRUFDZSxFQUFFLENBQUMsQ0FBQztJQUNoQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDekIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFO0lBQ3RCLE1BQU0sRUFDSixPQUFPLENBQUMsTUFBTSxLQUFLLE1BQU07UUFDdkIsQ0FBQyxDQUFDLE1BQU07UUFDUixDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTO1lBQzVCLENBQUMsQ0FBQyxTQUFTO1lBQ1gsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssWUFBWTtnQkFDOUQsQ0FBQyxDQUFDLFFBQVE7Z0JBQ1YsQ0FBQyxD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
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLWN1c3RvbWVyLXZlcmlmaWNhdGlvbi1ldmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbWFpbC9hcHBsaWNhdGlvbi9oYW5kbGUtY3VzdG9tZXItdmVyaWZpY2F0aW9uLWV2ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLHFEQUFvRDtBQUVwRCwyREFBMEU7QUFDMUUsMkRBR2lDO0FBQ2pDLCtDQUFtRDtBQU1uRCw0REFBd0Q7QUFFeEQseUZBQXVGO0FBQ3ZGLCtFQUF5RTtBQUU1RCxRQUFBLGtDQUFrQyxHQUFHLENBQUMsQ0FBQztBQUN2QyxRQUFBLG9DQUFvQyxHQUMvQyxtQ0FBbUMsQ0FBQztBQUV0QyxNQUFNLG1CQUFtQixHQUFHLDRCQUE0QixDQUFDO0FBU3pELE1BQU0sS0FBSyxHQUFHLEdBQVUsRUFBRTtJQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUFvQyxDQUFDLENBQUM7QUFDeEQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxnQkFBZ0IsR0FBRyxDQUN2QixPQUEyQixFQUMzQixJQUFhLEVBQ2UsRUFBRSxDQUFDLENBQUM7SUFDaEMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3pCLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRTtJQUN0QixNQUFNLEVBQ0osT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNO1FBQ3ZCLENBQUMsQ0FBQyxNQUFNO1FBQ1IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUztZQUM1QixDQUFDLENBQUMsU0FBUztZQUNYLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLFlBQVk7Z0JBQzlELENBQUMsQ0FBQyxRQUFRO2dCQUNWLENBQUMsQ0FBQyxhQUFhO0NBQ3hCLENBQUMsQ0FBQztB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