customer-registration 0.0.112 → 0.0.113

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 (34) hide show
  1. package/.medusa/server/src/api/auth/customer/emailpass/reset-password/route.js +1 -26
  2. package/.medusa/server/src/api/auth/customer/emailpass/route.js +19 -97
  3. package/.medusa/server/src/api/auth/customer/phonepass/register/route.js +50 -0
  4. package/.medusa/server/src/api/auth/customer/phonepass/route.js +105 -0
  5. package/.medusa/server/src/api/middlewares/{block-pending-customer.js → guard-account-deletion.js} +4 -4
  6. package/.medusa/server/src/api/middlewares/ip-rate-limit.js +48 -0
  7. package/.medusa/server/src/api/middlewares/validate-customer-registration.js +60 -0
  8. package/.medusa/server/src/api/middlewares.js +17 -4
  9. package/.medusa/server/src/api/store/customers/account-deletion/cancel-request/route.js +16 -6
  10. package/.medusa/server/src/api/store/customers/account-deletion/validators.js +11 -3
  11. package/.medusa/server/src/api/store/customers/me/contact/route.js +95 -0
  12. package/.medusa/server/src/api/store/customers/me/contact/verify/route.js +83 -0
  13. package/.medusa/server/src/api/store/customers/me/route.js +53 -0
  14. package/.medusa/server/src/api/store/customers/otp/send/route.js +1 -6
  15. package/.medusa/server/src/api/store/customers/otp/verify/route.js +95 -3
  16. package/.medusa/server/src/api/store/customers/route.js +89 -0
  17. package/.medusa/server/src/config.js +32 -23
  18. package/.medusa/server/src/modules/otp-verification/service.js +72 -1
  19. package/.medusa/server/src/providers/phonepass/index.js +9 -0
  20. package/.medusa/server/src/providers/phonepass/service.js +133 -0
  21. package/.medusa/server/src/subscribers/password-reset.js +1 -42
  22. package/.medusa/server/src/workflows/change-password.js +40 -64
  23. package/.medusa/server/src/workflows/send-contact-change-otp-workflow.js +41 -0
  24. package/.medusa/server/src/workflows/steps/determine-contact-method-step.js +8 -2
  25. package/.medusa/server/src/workflows/steps/generate-contact-change-otp-step.js +24 -0
  26. package/.medusa/server/src/workflows/steps/index.js +6 -2
  27. package/.medusa/server/src/workflows/steps/send-notification-step.js +1 -11
  28. package/.medusa/server/src/workflows/steps/sync-phonepass-entity-id-step.js +63 -0
  29. package/.medusa/server/src/workflows/steps/update-password-step.js +21 -29
  30. package/.medusa/server/src/workflows/update-contact-workflow.js +100 -0
  31. package/.medusa/server/src/workflows/verify-phone.js +11 -4
  32. package/README.md +363 -223
  33. package/package.json +3 -1
  34. package/.medusa/server/src/subscribers/customer-updated.js +0 -100
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const core_flows_1 = require("@medusajs/core-flows");
6
+ const config_1 = require("../../../config");
7
+ /**
8
+ * Override of Medusa's built-in POST /store/customers.
9
+ *
10
+ * Medusa's default implementation calls validateCustomerAccountCreation which
11
+ * throws when email is missing. When registration.identifier is "phone" we
12
+ * must bypass that step and create the customer with phone only.
13
+ *
14
+ * For "email" and "both" we delegate to the built-in workflow so that all of
15
+ * Medusa's existing validations (duplicate email check, etc.) are preserved.
16
+ */
17
+ const POST = async (req, res) => {
18
+ const authContext = req.auth_context;
19
+ if (authContext?.actor_id) {
20
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Request already authenticated as a customer.");
21
+ }
22
+ const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
23
+ const options = (0, config_1.resolveCustomerRegistrationOptions)(configModule);
24
+ const { identifier } = options.registration;
25
+ const authIdentityId = authContext?.auth_identity_id;
26
+ const customerData = (req.body ?? {});
27
+ if (identifier !== "phone") {
28
+ // "email" or "both": delegate to Medusa's built-in workflow which enforces
29
+ // the email requirement and handles duplicate detection.
30
+ const { result } = await (0, core_flows_1.createCustomerAccountWorkflow)(req.scope).run({
31
+ input: {
32
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
+ customerData: customerData,
34
+ authIdentityId: authIdentityId ?? "",
35
+ },
36
+ });
37
+ const customer = await refetchCustomer(result.id, req.scope);
38
+ return res.status(200).json({ customer });
39
+ }
40
+ // "phone": create customer without email validation.
41
+ if (!customerData.phone) {
42
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Phone is required for registration");
43
+ }
44
+ const customerService = req.scope.resolve(utils_1.Modules.CUSTOMER);
45
+ // Check for duplicate phone
46
+ const knex = req.scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
47
+ const existing = await knex.raw(`SELECT id FROM customer WHERE phone = ? AND has_account = true LIMIT 1`, [customerData.phone]);
48
+ if (existing.rows?.[0] ?? existing[0]?.[0]) {
49
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.DUPLICATE_ERROR, "A customer with this phone number already has an account");
50
+ }
51
+ const [customer] = await customerService.createCustomers([
52
+ {
53
+ ...customerData,
54
+ has_account: !!authIdentityId,
55
+ },
56
+ ]);
57
+ // Link the auth identity to the new customer (same as setAuthAppMetadataStep)
58
+ if (authIdentityId) {
59
+ const authService = req.scope.resolve(utils_1.Modules.AUTH);
60
+ await authService.updateAuthIdentities({
61
+ id: authIdentityId,
62
+ app_metadata: { customer_id: customer.id },
63
+ });
64
+ }
65
+ const fullCustomer = await refetchCustomer(customer.id, req.scope);
66
+ return res.status(200).json({ customer: fullCustomer });
67
+ };
68
+ exports.POST = POST;
69
+ async function refetchCustomer(customerId, scope) {
70
+ const remoteQuery = scope.resolve(utils_1.ContainerRegistrationKeys.REMOTE_QUERY);
71
+ const queryObject = (0, utils_1.remoteQueryObjectFromString)({
72
+ entryPoint: "customer",
73
+ variables: { filters: { id: customerId } },
74
+ fields: [
75
+ "id",
76
+ "email",
77
+ "first_name",
78
+ "last_name",
79
+ "phone",
80
+ "has_account",
81
+ "metadata",
82
+ "created_at",
83
+ "updated_at",
84
+ ],
85
+ });
86
+ const customers = await remoteQuery(queryObject);
87
+ return customers[0];
88
+ }
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxxREFLa0M7QUFDbEMscURBQW9FO0FBQ3BFLDRDQUd3QjtBQUV4Qjs7Ozs7Ozs7O0dBU0c7QUFDSSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsTUFBTSxXQUFXLEdBQ2YsR0FHRCxDQUFDLFlBQVksQ0FBQTtJQUVkLElBQUksV0FBVyxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDhDQUE4QyxDQUMvQyxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQy9FLE1BQU0sT0FBTyxHQUFHLElBQUEsMkNBQWtDLEVBQUMsWUFBaUMsQ0FBQyxDQUFBO0lBQ3JGLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFBO0lBRTNDLE1BQU0sY0FBYyxHQUFHLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQTtJQUNwRCxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUE0QixDQUFBO0lBRWhFLElBQUksVUFBVSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQzNCLDJFQUEyRTtRQUMzRSx5REFBeUQ7UUFDekQsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSwwQ0FBNkIsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3BFLEtBQUssRUFBRTtnQkFDTCw4REFBOEQ7Z0JBQzlELFlBQVksRUFBRSxZ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
@@ -9,40 +9,49 @@ exports.resolveCustomerRegistrationOptions = resolveCustomerRegistrationOptions;
9
9
  const utils_1 = require("@medusajs/framework/utils");
10
10
  const PLUGIN_NAME = "customer-registration";
11
11
  function normalizeCustomerRegistrationOptions(input) {
12
- if (!input) {
13
- return null;
14
- }
12
+ const base = input ?? {};
15
13
  // Password reset template is required if password_reset is configured
16
- if (input.password_reset && !input.password_reset.template) {
14
+ if (base.password_reset && !base.password_reset.template) {
17
15
  throw new Error("customer-registration: password_reset.template is required when password_reset is configured");
18
16
  }
19
- if (input.account_deletion_request && !input.account_deletion_request.template) {
17
+ if (base.password_reset && !base.storefrontUrl) {
18
+ throw new Error("[customer-registration] storefrontUrl is required when password_reset is configured — " +
19
+ "the reset email link will be malformed without it");
20
+ }
21
+ if (base.account_deletion_request && !base.account_deletion_request.template) {
20
22
  throw new Error("customer-registration: account_deletion_request.template is required when account_deletion_request is configured");
21
23
  }
22
- if (input.account_deletion_cancel && !input.account_deletion_cancel.template) {
24
+ if (base.account_deletion_cancel && !base.account_deletion_cancel.template) {
23
25
  throw new Error("customer-registration: account_deletion_cancel.template is required when account_deletion_cancel is configured");
24
26
  }
27
+ const registrationIdentifier = base.registration?.identifier ?? "email";
25
28
  return {
26
- storefrontUrl: input.storefrontUrl,
27
- password_reset: input.password_reset
29
+ storefrontUrl: base.storefrontUrl,
30
+ registration: {
31
+ identifier: registrationIdentifier,
32
+ require_verification: base.registration?.require_verification ?? true,
33
+ },
34
+ login: {
35
+ identifier: base.login?.identifier ?? registrationIdentifier,
36
+ },
37
+ password_reset: base.password_reset
28
38
  ? {
29
- template: input.password_reset.template,
30
- subject: input.password_reset.subject || "Reset Your Password",
39
+ template: base.password_reset.template,
40
+ subject: base.password_reset.subject || "Reset Your Password",
31
41
  }
32
42
  : undefined,
33
- account_deletion_request: input.account_deletion_request
43
+ account_deletion_request: base.account_deletion_request
34
44
  ? {
35
- template: input.account_deletion_request.template,
36
- subject: input.account_deletion_request.subject ||
45
+ template: base.account_deletion_request.template,
46
+ subject: base.account_deletion_request.subject ||
37
47
  "Confirm your account deletion request",
38
- scheduled_days: input.account_deletion_request.scheduled_days ??
39
- 7,
48
+ scheduled_days: base.account_deletion_request.scheduled_days ?? 7,
40
49
  }
41
50
  : undefined,
42
- account_deletion_cancel: input.account_deletion_cancel
51
+ account_deletion_cancel: base.account_deletion_cancel
43
52
  ? {
44
- template: input.account_deletion_cancel.template,
45
- subject: input.account_deletion_cancel.subject ||
53
+ template: base.account_deletion_cancel.template,
54
+ subject: base.account_deletion_cancel.subject ||
46
55
  "Confirm cancellation of account deletion",
47
56
  }
48
57
  : undefined,
@@ -57,8 +66,8 @@ function resolveCustomerRegistrationOptions(configModule) {
57
66
  for (const plugin of plugins) {
58
67
  if ((0, utils_1.isString)(plugin)) {
59
68
  if (plugin === PLUGIN_NAME) {
60
- // String plugin without options - return null (options are optional)
61
- return null;
69
+ // String plugin without options resolve with all defaults
70
+ return normalizeCustomerRegistrationOptions(null);
62
71
  }
63
72
  continue;
64
73
  }
@@ -66,7 +75,7 @@ function resolveCustomerRegistrationOptions(configModule) {
66
75
  return normalizeCustomerRegistrationOptions(plugin.options);
67
76
  }
68
77
  }
69
- // Plugin not found - return null (plugin might not be configured)
70
- return null;
78
+ // Plugin not found in config — return all defaults so callers never get null
79
+ return normalizeCustomerRegistrationOptions(null);
71
80
  }
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOztBQTZDSCxvRkFxREM7QUFFRCxnRkF5QkM7QUEzSEQscURBQW9EO0FBR3BELE1BQU0sV0FBVyxHQUFHLHVCQUF1QixDQUFBO0FBd0MzQyxTQUFnQixvQ0FBb0MsQ0FDbEQsS0FBZ0Q7SUFFaEQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLElBQUksS0FBSyxDQUFDLGNBQWMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDM0QsTUFBTSxJQUFJLEtBQUssQ0FDYiw4RkFBOEYsQ0FDL0YsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvRSxNQUFNLElBQUksS0FBSyxDQUNiLGtIQUFrSCxDQUNuSCxDQUFBO0lBQ0gsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLHVCQUF1QixJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdFLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0hBQWdILENBQ2pILENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtRQUNsQyxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7WUFDbEMsQ0FBQyxDQUFDO2dCQUNFLFFBQVEsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQVE7Z0JBQ3ZDLE9BQU8sRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sSUFBSSxxQkFBcUI7YUFDL0Q7WUFDSCxDQUFDLENBQUMsU0FBUztRQUNiLHdCQUF3QixFQUFFLEtBQUssQ0FBQyx3QkFBd0I7WUFDdEQsQ0FBQyxDQUFDO2dCQUNFLFFBQVEsRUFBRSxLQUFLLENBQUMsd0JBQXdCLENBQUMsUUFBUTtnQkFDakQsT0FBTyxFQUNMLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPO29CQUN0Qyx1Q0FBdUM7Z0JBQ3pDLGNBQWMsRUFDWixLQUFLLENBQUMsd0JBQXdCLENBQUMsY0FBYztvQkFDN0MsQ0FBQzthQUNKO1lBQ0gsQ0FBQyxDQUFDLFNBQVM7UUFDYix1QkFBdUIsRUFBRSxLQUFLLENBQUMsdUJBQXVCO1lBQ3BELENBQUMsQ0FBQztnQkFDRSxRQUFRLEVBQUUsS0FBSyxDQUFDLHVCQUF1QixDQUFDLFFBQVE7Z0JBQ2hELE9BQU8sRUFDTCxLQUFLLENBQUMsdUJBQXVCLENBQUMsT0FBTztvQkFDckMsMENBQTBDO2FBQzdDO1lBQ0gsQ0FBQyxDQUFDLFNBQVM7S0FDZCxDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQWdCLGtDQUFrQyxDQUNoRCxZQUFnQztJQUVoQyw2REFBNkQ7SUFDN0QsTUFBTSxjQUFjLEdBQUcsWUFBWSxFQUFFLGFBQWEsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ2pFLHNDQUFzQztJQUN0QyxNQUFNLGFBQWEsR0FBRyxZQUFZLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQTtJQUNqRCxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsY0FBYyxFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUE7SUFFckQsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM3QixJQUFJLElBQUEsZ0JBQVEsRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3JCLElBQUksTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUMzQixxRUFBcUU7Z0JBQ3JFLE9BQU8sSUFBSSxDQUFBO1lBQ2IsQ0FBQztZQUNELFNBQVE7UUFDVixDQUFDO1FBRUQsSUFBSSxNQUFNLEVBQUUsT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sb0NBQW9DLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyJ9
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOztBQStESCxvRkFrRUM7QUFFRCxnRkF5QkM7QUExSkQscURBQW9EO0FBS3BELE1BQU0sV0FBVyxHQUFHLHVCQUF1QixDQUFBO0FBd0QzQyxTQUFnQixvQ0FBb0MsQ0FDbEQsS0FBZ0Q7SUFFaEQsTUFBTSxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQTtJQUV4QixzRUFBc0U7SUFDdEUsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6RCxNQUFNLElBQUksS0FBSyxDQUNiLDhGQUE4RixDQUMvRixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMvQyxNQUFNLElBQUksS0FBSyxDQUNiLHdGQUF3RjtZQUN0RixtREFBbUQsQ0FDdEQsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3RSxNQUFNLElBQUksS0FBSyxDQUNiLGtIQUFrSCxDQUNuSCxDQUFBO0lBQ0gsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzNFLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0hBQWdILENBQ2pILENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxzQkFBc0IsR0FBb0IsSUFBSSxDQUFDLFlBQVksRUFBRSxVQUFVLElBQUksT0FBTyxDQUFBO0lBRXhGLE9BQU87UUFDTCxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7UUFDakMsWUFBWSxFQUFFO1lBQ1osVUFBVSxFQUFFLHNCQUFzQjtZQUNsQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLG9CQUFvQixJQUFJLElBQUk7U0FDdEU7UUFDRCxLQUFLLEVBQUU7WUFDTCxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLElBQUksc0JBQXNCO1NBQzdEO1FBQ0QsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ2pDLENBQUMsQ0FBQztnQkFDRSxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRO2dCQUN0QyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLElBQUkscUJBQXFCO2FBQzlEO1lBQ0gsQ0FBQyxDQUFDLFNBQVM7UUFDYix3QkFBd0IsRUFBRSxJQUFJLENBQUMsd0JBQXdCO1lBQ3JELENBQUMsQ0FBQztnQkFDRSxRQUFRLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVE7Z0JBQ2hELE9BQU8sRUFDTCxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTztvQkFDckMsdUNBQXVDO2dCQUN6QyxjQUFjLEVBQ1osSUFBSSxDQUFDLHdCQUF3QixDQUFDLGNBQWMsSUFBSSxDQUFDO2FBQ3BEO1lBQ0gsQ0FBQyxDQUFDLFNBQVM7UUFDYix1QkFBdUIsRUFBRSxJQUFJLENBQUMsdUJBQXVCO1lBQ25ELENBQUMsQ0FBQztnQkFDRSxRQUFRLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVE7Z0JBQy9DLE9BQU8sRUFDTCxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTztvQkFDcEMsMENBQTBDO2FBQzdDO1lBQ0gsQ0FBQyxDQUFDLFNBQVM7S0FDZCxDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQWdCLGtDQUFrQyxDQUNoRCxZQUFnQztJQUVoQyw2REFBNkQ7SUFDN0QsTUFBTSxjQUFjLEdBQUcsWUFBWSxFQUFFLGFBQWEsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ2pFLHNDQUFzQztJQUN0QyxNQUFNLGFBQWEsR0FBRyxZQUFZLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQTtJQUNqRCxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsY0FBYyxFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUE7SUFFckQsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM3QixJQUFJLElBQUEsZ0JBQVEsRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3JCLElBQUksTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUMzQiw0REFBNEQ7Z0JBQzVELE9BQU8sb0NBQW9DLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDbkQsQ0FBQztZQUNELFNBQVE7UUFDVixDQUFDO1FBRUQsSUFBSSxNQUFNLEVBQUUsT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sb0NBQW9DLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLE9BQU8sb0NBQW9DLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDbkQsQ0FBQyJ9
@@ -305,6 +305,53 @@ class OtpVerificationService extends (0, utils_1.MedusaService)({
305
305
  type: otp.purpose,
306
306
  };
307
307
  }
308
+ /**
309
+ * Generate OTP for a contact-change request.
310
+ * Identical to generateOtpWithCode but embeds `new_value` and `contact_type`
311
+ * in the signed JWT so no metadata staging is required.
312
+ */
313
+ async generateOtpForContactChange(input, jwtSecret, newValue, contactType) {
314
+ const { customer_id, type } = input;
315
+ const purpose = type;
316
+ await this.checkExistingOtp(customer_id, purpose);
317
+ const code = this.generateCode();
318
+ const hashedCode = this.hashCode(code);
319
+ const expiresAt = new Date();
320
+ expiresAt.setMinutes(expiresAt.getMinutes() + (this.config_.otpExpiryMinutes ?? 15));
321
+ const otp = await this.createOtpRecord(customer_id, purpose, hashedCode, expiresAt);
322
+ const token = jsonwebtoken_1.default.sign({
323
+ otp_id: otp.id,
324
+ customer_id: otp.customer_id,
325
+ type,
326
+ purpose: otp.purpose,
327
+ new_value: newValue,
328
+ contact_type: contactType,
329
+ }, jwtSecret, { expiresIn: `${this.config_.otpExpiryMinutes ?? 15}m` });
330
+ return { token, expires_at: expiresAt, code };
331
+ }
332
+ /**
333
+ * Decode a contact-change OTP token, returning the embedded new_value and contact_type
334
+ * in addition to the standard otp_id / customer_id / type fields.
335
+ */
336
+ decodeContactChangeToken(token, jwtSecret) {
337
+ try {
338
+ const decoded = jsonwebtoken_1.default.verify(token, jwtSecret);
339
+ const { otp_id, customer_id, type, new_value, contact_type } = decoded;
340
+ if (!otp_id || !customer_id || !type || !new_value || !contact_type) {
341
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid contact-change token format.");
342
+ }
343
+ return {
344
+ otp_id: otp_id,
345
+ customer_id: customer_id,
346
+ type: type,
347
+ new_value: new_value,
348
+ contact_type: contact_type,
349
+ };
350
+ }
351
+ catch {
352
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid or expired contact-change token. Please request a new OTP.");
353
+ }
354
+ }
308
355
  /**
309
356
  * Generate OTP code and return it (for sending via notification)
310
357
  * This is a helper that generates code, creates OTP record, and returns both code and token
@@ -418,6 +465,23 @@ class OtpVerificationService extends (0, utils_1.MedusaService)({
418
465
  phone_verified: row?.phone_verified ?? false,
419
466
  };
420
467
  }
468
+ /**
469
+ * Get customer verification status by phone
470
+ */
471
+ async getCustomerVerificationByPhone(sharedContext, phone) {
472
+ const knex = sharedContext.manager?.getKnex();
473
+ if (!knex) {
474
+ throw new Error("Database connection not available");
475
+ }
476
+ const result = await knex.raw(`SELECT email_verified, phone_verified
477
+ FROM customer
478
+ WHERE phone = ?`, [phone]);
479
+ const row = result.rows?.[0] || result[0]?.[0];
480
+ return {
481
+ email_verified: row?.email_verified ?? false,
482
+ phone_verified: row?.phone_verified ?? false,
483
+ };
484
+ }
421
485
  /**
422
486
  * Get customer verification status by email
423
487
  */
@@ -486,6 +550,13 @@ __decorate([
486
550
  __metadata("design:paramtypes", [Object, String]),
487
551
  __metadata("design:returntype", Promise)
488
552
  ], OtpVerificationService.prototype, "getCustomerVerificationByCustomerId", null);
553
+ __decorate([
554
+ (0, utils_2.InjectManager)(),
555
+ __param(0, (0, utils_3.MedusaContext)()),
556
+ __metadata("design:type", Function),
557
+ __metadata("design:paramtypes", [Object, String]),
558
+ __metadata("design:returntype", Promise)
559
+ ], OtpVerificationService.prototype, "getCustomerVerificationByPhone", null);
489
560
  __decorate([
490
561
  (0, utils_2.InjectManager)(),
491
562
  __param(0, (0, utils_3.MedusaContext)()),
@@ -493,4 +564,4 @@ __decorate([
493
564
  __metadata("design:paramtypes", [Object, String]),
494
565
  __metadata("design:returntype", Promise)
495
566
  ], OtpVerificationService.prototype, "getCustomerVerificationByEmail", null);
496
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL290cC12ZXJpZmljYXRpb24vc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBc0U7QUFDdEUscURBQXlEO0FBRXpELHFEQUF5RDtBQUV6RCxvREFBMkI7QUFDM0IsZ0VBQThCO0FBQzlCLGdFQUF1RTtBQVl2RSxNQUFhLHNCQUF1QixTQUFRLElBQUEscUJBQWEsRUFBQztJQUN4RCxlQUFlLEVBQWYsa0NBQWU7Q0FDaEIsQ0FBQztJQUdBLFlBQ0UsU0FBK0IsRUFDL0IsYUFBeUIsRUFDekIsaUJBQTJDO1FBRTNDLEtBQUssQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUE7UUFFbEQsTUFBTSxlQUFlLEdBQUcsaUJBQWlCLEVBQUUsT0FBTyxJQUFJLGFBQWEsSUFBSSxFQUFFLENBQUE7UUFDekUsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFNBQVMsRUFBRSxDQUFDO1lBQ1osVUFBVSxFQUFFLFNBQVM7WUFDckIsZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixXQUFXLEVBQUUsQ0FBQztZQUNkLEdBQUcsZUFBZTtTQUNuQixDQUFBO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCLENBQUMsSUFBZ0I7UUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUF1QixDQUFDLENBQUE7UUFDcEQsK0JBQStCO1FBQy9CLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxzQ0FBc0MsSUFBSSw2QkFBNkIsRUFDdkUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQzFCLENBQUE7UUFDSCxDQUFDO1FB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
567
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL290cC12ZXJpZmljYXRpb24vc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBc0U7QUFDdEUscURBQXlEO0FBRXpELHFEQUF5RDtBQUV6RCxvREFBMkI7QUFDM0IsZ0VBQThCO0FBQzlCLGdFQUF1RTtBQVl2RSxNQUFhLHNCQUF1QixTQUFRLElBQUEscUJBQWEsRUFBQztJQUN4RCxlQUFlLEVBQWYsa0NBQWU7Q0FDaEIsQ0FBQztJQUdBLFlBQ0UsU0FBK0IsRUFDL0IsYUFBeUIsRUFDekIsaUJBQTJDO1FBRTNDLEtBQUssQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUE7UUFFbEQsTUFBTSxlQUFlLEdBQUcsaUJBQWlCLEVBQUUsT0FBTyxJQUFJLGFBQWEsSUFBSSxFQUFFLENBQUE7UUFDekUsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFNBQVMsRUFBRSxDQUFDO1lBQ1osVUFBVSxFQUFFLFNBQVM7WUFDckIsZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixXQUFXLEVBQUUsQ0FBQztZQUNkLEdBQUcsZUFBZTtTQUNuQixDQUFBO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCLENBQUMsSUFBZ0I7UUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUF1QixDQUFDLENBQUE7UUFDcEQsK0JBQStCO1FBQy9CLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxzQ0FBc0MsSUFBSSw2QkFBNkIsRUFDdkUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQzFCLENBQUE7UUFDSCxDQUFDO1FB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
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PHONEPASS_PROVIDER_ID = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const service_1 = require("./service");
6
+ exports.PHONEPASS_PROVIDER_ID = "phonepass";
7
+ const services = [service_1.PhonepassAuthService];
8
+ exports.default = (0, utils_1.ModuleProvider)(utils_1.Modules.AUTH, { services });
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3Bob25lcGFzcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBbUU7QUFDbkUsdUNBQWdEO0FBRW5DLFFBQUEscUJBQXFCLEdBQUcsV0FBVyxDQUFBO0FBRWhELE1BQU0sUUFBUSxHQUFHLENBQUMsOEJBQW9CLENBQUMsQ0FBQTtBQUV2QyxrQkFBZSxJQUFBLHNCQUFjLEVBQUMsZUFBTyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUEifQ==
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PhonepassAuthService = void 0;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const scrypt_kdf_1 = __importDefault(require("scrypt-kdf"));
9
+ const PHONE_REGEX = /^\+?[0-9]{8,15}$/;
10
+ class PhonepassAuthService extends utils_1.AbstractAuthModuleProvider {
11
+ constructor({ logger }) {
12
+ // @ts-ignore
13
+ super(...arguments);
14
+ this.logger_ = logger;
15
+ }
16
+ async hashPassword(password) {
17
+ const passwordHash = await scrypt_kdf_1.default.kdf(password, { logN: 14, r: 8, p: 1 });
18
+ return passwordHash.toString("base64");
19
+ }
20
+ async verifyPassword(password, hash) {
21
+ const buf = Buffer.from(hash, "base64");
22
+ return scrypt_kdf_1.default.verify(buf, password);
23
+ }
24
+ async authenticate(userData, authIdentityService) {
25
+ const { phone, password } = (userData.body ?? {});
26
+ if (!phone || typeof phone !== "string") {
27
+ return { success: false, error: "Phone should be a string" };
28
+ }
29
+ if (!password || typeof password !== "string") {
30
+ return { success: false, error: "Password should be a string" };
31
+ }
32
+ const normalizedPhone = phone.trim();
33
+ let authIdentity;
34
+ try {
35
+ authIdentity = await authIdentityService.retrieve({ entity_id: normalizedPhone });
36
+ }
37
+ catch (error) {
38
+ if (error.type === utils_1.MedusaError.Types.NOT_FOUND) {
39
+ return { success: false, error: "Invalid phone or password" };
40
+ }
41
+ return { success: false, error: error.message };
42
+ }
43
+ const providerIdentity = authIdentity.provider_identities?.find((pi) => pi.provider === "phonepass");
44
+ const passwordHash = providerIdentity?.provider_metadata?.password;
45
+ if (typeof passwordHash === "string") {
46
+ const valid = await this.verifyPassword(password, passwordHash);
47
+ if (valid) {
48
+ const copy = JSON.parse(JSON.stringify(authIdentity));
49
+ const pi = copy.provider_identities?.find((p) => p.provider === "phonepass");
50
+ if (pi?.provider_metadata?.password) {
51
+ delete pi.provider_metadata.password;
52
+ }
53
+ return { success: true, authIdentity: copy };
54
+ }
55
+ }
56
+ return { success: false, error: "Invalid phone or password" };
57
+ }
58
+ async register(userData, authIdentityService) {
59
+ const { phone, password } = (userData.body ?? {});
60
+ if (!phone || typeof phone !== "string") {
61
+ return { success: false, error: "Phone should be a string" };
62
+ }
63
+ if (!password || typeof password !== "string") {
64
+ return { success: false, error: "Password should be a string" };
65
+ }
66
+ const normalizedPhone = phone.trim();
67
+ if (!PHONE_REGEX.test(normalizedPhone)) {
68
+ return {
69
+ success: false,
70
+ error: "Invalid phone number format. Must be 8–15 digits, optionally prefixed with +",
71
+ };
72
+ }
73
+ // Check if phone is already registered
74
+ try {
75
+ const existing = await authIdentityService.retrieve({ entity_id: normalizedPhone });
76
+ if (existing?.app_metadata && Object.keys(existing.app_metadata).length > 0) {
77
+ return { success: false, error: "Phone number is already registered" };
78
+ }
79
+ }
80
+ catch (error) {
81
+ if (error.type !== utils_1.MedusaError.Types.NOT_FOUND) {
82
+ return { success: false, error: error.message };
83
+ }
84
+ }
85
+ let authIdentity;
86
+ try {
87
+ const passwordHash = await this.hashPassword(password);
88
+ authIdentity = await authIdentityService.create({
89
+ entity_id: normalizedPhone,
90
+ provider_metadata: { password: passwordHash },
91
+ });
92
+ }
93
+ catch (error) {
94
+ return { success: false, error: error.message };
95
+ }
96
+ const copy = JSON.parse(JSON.stringify(authIdentity));
97
+ const pi = copy.provider_identities?.find((p) => p.provider === "phonepass");
98
+ if (pi?.provider_metadata?.password) {
99
+ delete pi.provider_metadata.password;
100
+ }
101
+ return { success: true, authIdentity: copy };
102
+ }
103
+ async validateCallback(_userData, _authIdentityService) {
104
+ return {
105
+ success: false,
106
+ error: "Callback authentication is not supported for phonepass",
107
+ };
108
+ }
109
+ async update(data, authIdentityService) {
110
+ const { phone, password } = data;
111
+ if (!phone) {
112
+ return { success: false, error: "Cannot update phonepass identity without phone" };
113
+ }
114
+ if (!password || typeof password !== "string") {
115
+ return { success: true };
116
+ }
117
+ let authIdentity;
118
+ try {
119
+ const passwordHash = await this.hashPassword(password);
120
+ authIdentity = await authIdentityService.update(phone, {
121
+ provider_metadata: { password: passwordHash },
122
+ });
123
+ }
124
+ catch (error) {
125
+ return { success: false, error: error.message };
126
+ }
127
+ return { success: true, authIdentity };
128
+ }
129
+ }
130
+ exports.PhonepassAuthService = PhonepassAuthService;
131
+ PhonepassAuthService.identifier = "phonepass";
132
+ PhonepassAuthService.DISPLAY_NAME = "Phone/Password Authentication";
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvcGhvbmVwYXNzL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBTUEscURBQW1GO0FBQ25GLDREQUFrQztBQUVsQyxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQTtBQU10QyxNQUFhLG9CQUFxQixTQUFRLGtDQUEwQjtJQU1sRSxZQUFZLEVBQUUsTUFBTSxFQUF3QjtRQUMxQyxhQUFhO1FBQ2IsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUE7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUE7SUFDdkIsQ0FBQztJQUVPLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBZ0I7UUFDekMsTUFBTSxZQUFZLEdBQUcsTUFBTSxvQkFBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDNUUsT0FBTyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3hDLENBQUM7SUFFTyxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQWdCLEVBQUUsSUFBWTtRQUN6RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUN2QyxPQUFPLG9CQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUN4QyxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FDaEIsUUFBNkIsRUFDN0IsbUJBQWdEO1FBRWhELE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FHL0MsQ0FBQTtRQUVELElBQUksQ0FBQyxLQUFLLElBQUksT0FB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