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
@@ -3,42 +3,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.updatePasswordStep = void 0;
4
4
  const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
5
  const utils_1 = require("@medusajs/framework/utils");
6
- exports.updatePasswordStep = (0, workflows_sdk_1.createStep)("update-password", async ({ customer_id, password_hash }, { container }) => {
6
+ exports.updatePasswordStep = (0, workflows_sdk_1.createStep)("update-password", async ({ customer_id, new_password }, { container }) => {
7
7
  if (!customer_id) {
8
8
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Customer ID is required");
9
9
  }
10
- if (!password_hash) {
11
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Password hash is required");
10
+ if (!new_password) {
11
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "New password is required");
12
12
  }
13
- // Get customer to retrieve email
14
13
  const customerService = container.resolve(utils_1.Modules.CUSTOMER);
15
14
  const customer = await customerService.retrieveCustomer(customer_id);
16
- if (!customer || !customer.email) {
17
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found or email missing");
15
+ if (!customer) {
16
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found");
18
17
  }
19
- // Get PostgreSQL connection (Knex instance) from container
20
- const knex = container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
21
- // Find provider_identity by entity_id (customer email) and provider
22
- const providerIdentityResult = await knex.raw(`SELECT id, provider_metadata
23
- FROM provider_identity
24
- WHERE entity_id = ? AND provider = 'emailpass'
25
- LIMIT 1`, [customer.email.toLowerCase()]);
26
- const providerIdentity = providerIdentityResult.rows?.[0] || providerIdentityResult[0]?.[0];
27
- if (!providerIdentity) {
28
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Provider identity not found for customer");
18
+ // Resolve provider and entity_id supports both emailpass and phonepass
19
+ const provider = customer.email ? "emailpass" : "phonepass";
20
+ const entity_id = customer.email
21
+ ? customer.email.toLowerCase()
22
+ : customer.phone;
23
+ if (!entity_id) {
24
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer has no email or phone — cannot update password");
29
25
  }
30
- // Update password hash in provider_metadata
31
- await knex.raw(`UPDATE provider_identity
32
- SET provider_metadata = jsonb_set(
33
- COALESCE(provider_metadata, '{}'::jsonb),
34
- '{password}',
35
- to_jsonb(?::text)
36
- ),
37
- updated_at = NOW()
38
- WHERE id = ?`, [password_hash, providerIdentity.id]);
39
- return new workflows_sdk_1.StepResponse({
40
- customer_id,
41
- success: true,
26
+ const authService = container.resolve(utils_1.Modules.AUTH);
27
+ const updateResult = await authService.updateProvider(provider, {
28
+ entity_id,
29
+ password: new_password,
42
30
  });
31
+ if (!updateResult.success) {
32
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, updateResult.error || "Failed to update password");
33
+ }
34
+ return new workflows_sdk_1.StepResponse({ customer_id, success: true });
43
35
  });
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXBhc3N3b3JkLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3VwZGF0ZS1wYXNzd29yZC1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSxxREFBMkY7QUFhOUUsUUFBQSxrQkFBa0IsR0FBRyxJQUFBLDBCQUFVLEVBQzFDLGlCQUFpQixFQUNqQixLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUF1QixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUMzRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIseUJBQXlCLENBQzFCLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDJCQUEyQixDQUM1QixDQUFBO0lBQ0gsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUN2QyxlQUFPLENBQUMsUUFBUSxDQUNqQixDQUFBO0lBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFFcEUsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQixxQ0FBcUMsQ0FDdEMsQ0FBQTtJQUNILENBQUM7SUFFRCwyREFBMkQ7SUFDM0QsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUV2RSxvRUFBb0U7SUFDcEUsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQzNDOzs7ZUFHUyxFQUNULENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUMvQixDQUFBO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRTNGLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQzNCLDBDQUEwQyxDQUMzQyxDQUFBO0lBQ0gsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQ1o7Ozs7Ozs7b0JBT2MsRUFDZCxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FDckMsQ0FBQTtJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUF1QjtRQUM1QyxXQUFXO1FBQ1gsT0FBTyxFQUFFLElBQUk7S0FDZCxDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQSJ9
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXBhc3N3b3JkLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3VwZGF0ZS1wYXNzd29yZC1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSxxREFBZ0U7QUFjbkQsUUFBQSxrQkFBa0IsR0FBRyxJQUFBLDBCQUFVLEVBQzFDLGlCQUFpQixFQUNqQixLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUF1QixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUMxRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIseUJBQXlCLENBQzFCLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDBCQUEwQixDQUMzQixDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQXlCLGVBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNuRixNQUFNLFFBQVEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUVwRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksbUJBQVcsQ0FBQyxtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFBO0lBQzNELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxLQUFLO1FBQzlCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtRQUM5QixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQTtJQUVsQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQix5REFBeUQsQ0FDMUQsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNuRCxNQUFNLFlBQVksR0FBRyxNQUFNLFdBQVcsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO1FBQzlELFNBQVM7UUFDVCxRQUFRLEVBQUUsWUFBWTtLQUN2QixDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsWUFBWSxDQUFDLEtBQUssSUFBSSwyQkFBMkIsQ0FDbEQsQ0FBQTtJQUNILENBQUM7SUFFRCxPQUFPLElBQUksNEJBQVksQ0FBdUIsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7QUFDL0UsQ0FBQyxDQUNGLENBQUEifQ==
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateContactWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const steps_1 = require("./steps");
7
+ /**
8
+ * Writes the new phone/email to the customer record and marks the
9
+ * corresponding field as verified.
10
+ */
11
+ const updateContactStep = (0, workflows_sdk_1.createStep)("update-contact", async (input, { container }) => {
12
+ const { customer_id, new_value, contact_type } = input;
13
+ const customerService = container.resolve(utils_1.Modules.CUSTOMER);
14
+ const knex = container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
15
+ const customer = await customerService.retrieveCustomer(customer_id);
16
+ const oldValue = contact_type === "phone"
17
+ ? (customer.phone ?? null)
18
+ : (customer.email ?? null);
19
+ if (contact_type === "phone") {
20
+ await customerService.updateCustomers(customer_id, { phone: new_value });
21
+ await knex.raw(`UPDATE customer SET phone_verified = ?, updated_at = NOW() WHERE id = ?`, [true, customer_id]);
22
+ }
23
+ else {
24
+ await customerService.updateCustomers(customer_id, { email: new_value });
25
+ await knex.raw(`UPDATE customer SET email_verified = ?, updated_at = NOW() WHERE id = ?`, [true, customer_id]);
26
+ }
27
+ return new workflows_sdk_1.StepResponse({ customer_id, contact_type }, { ...input, old_value: oldValue });
28
+ }, async (compensationData, { container }) => {
29
+ if (!compensationData)
30
+ return;
31
+ const customerService = container.resolve(utils_1.Modules.CUSTOMER);
32
+ const knex = container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
33
+ const { customer_id, contact_type, old_value } = compensationData;
34
+ if (contact_type === "phone") {
35
+ // Restore to old value — explicitly passes null when phone was not set before
36
+ await customerService.updateCustomers(customer_id, { phone: old_value });
37
+ await knex.raw(`UPDATE customer SET phone_verified = ?, updated_at = NOW() WHERE id = ?`, [false, customer_id]);
38
+ }
39
+ else {
40
+ await customerService.updateCustomers(customer_id, { email: old_value });
41
+ await knex.raw(`UPDATE customer SET email_verified = ?, updated_at = NOW() WHERE id = ?`, [false, customer_id]);
42
+ }
43
+ });
44
+ /**
45
+ * Updates provider_identity.entity_id so login continues to work after a
46
+ * phone or email change.
47
+ *
48
+ * - phone change + login = "phone" | "both" → updates phonepass identity
49
+ * - email change + login = "email" | "both" → updates emailpass identity
50
+ * - all other combinations → no-op
51
+ */
52
+ const syncProviderIdentityStep = (0, workflows_sdk_1.createStep)("sync-provider-identity", async (input, { container }) => {
53
+ const { customer_id, new_value, contact_type, login_identifier } = input;
54
+ const needsPhoneSync = contact_type === "phone" &&
55
+ (login_identifier === "phone" || login_identifier === "both");
56
+ const needsEmailSync = contact_type === "email" &&
57
+ (login_identifier === "email" || login_identifier === "both");
58
+ if (!needsPhoneSync && !needsEmailSync) {
59
+ return new workflows_sdk_1.StepResponse({ synced: false }, null);
60
+ }
61
+ const provider = needsPhoneSync ? "phonepass" : "emailpass";
62
+ const knex = container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
63
+ const authRow = await knex.raw(`SELECT id FROM auth_identity WHERE app_metadata->>'customer_id' = ? LIMIT 1`, [customer_id]);
64
+ const authIdentityId = (authRow.rows?.[0] ?? authRow[0]?.[0])?.id ?? null;
65
+ if (!authIdentityId) {
66
+ return new workflows_sdk_1.StepResponse({ synced: false }, null);
67
+ }
68
+ const piRow = await knex.raw(`SELECT id, entity_id FROM provider_identity WHERE auth_identity_id = ? AND provider = ? LIMIT 1`, [authIdentityId, provider]);
69
+ const pi = piRow.rows?.[0] ?? piRow[0]?.[0] ?? null;
70
+ if (!pi) {
71
+ return new workflows_sdk_1.StepResponse({ synced: false }, null);
72
+ }
73
+ if (pi.entity_id === new_value) {
74
+ return new workflows_sdk_1.StepResponse({ synced: false }, null);
75
+ }
76
+ await knex.raw(`UPDATE provider_identity SET entity_id = ?, updated_at = NOW() WHERE id = ?`, [new_value, pi.id]);
77
+ return new workflows_sdk_1.StepResponse({ synced: true }, { provider_identity_id: pi.id, old_entity_id: pi.entity_id });
78
+ }, async (compensationData, { container }) => {
79
+ if (!compensationData)
80
+ return;
81
+ const knex = container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
82
+ await knex.raw(`UPDATE provider_identity SET entity_id = ?, updated_at = NOW() WHERE id = ?`, [compensationData.old_entity_id, compensationData.provider_identity_id]);
83
+ });
84
+ exports.updateContactWorkflow = (0, workflows_sdk_1.createWorkflow)("update-contact", (input) => {
85
+ const updateResult = updateContactStep(input);
86
+ const syncInput = (0, workflows_sdk_1.transform)({ updateResult, input }, (data) => ({
87
+ customer_id: data.updateResult.customer_id,
88
+ new_value: data.input.new_value,
89
+ contact_type: data.updateResult.contact_type,
90
+ login_identifier: data.input.login_identifier,
91
+ }));
92
+ syncProviderIdentityStep(syncInput);
93
+ const { customer } = (0, steps_1.retrieveCustomerStep)(updateResult);
94
+ return new workflows_sdk_1.WorkflowResponse({
95
+ customer_id: updateResult.customer_id,
96
+ customer,
97
+ });
98
+ });
99
+ exports.default = exports.updateContactWorkflow;
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWNvbnRhY3Qtd29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3VwZGF0ZS1jb250YWN0LXdvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQU0wQztBQUMxQyxxREFBOEU7QUFFOUUsbUNBQThDO0FBYzlDOzs7R0FHRztBQUNILE1BQU0saUJBQWlCLEdBQUcsSUFBQSwwQkFBVSxFQUNsQyxnQkFBZ0IsRUFDaEIsS0FBSyxFQUFFLEtBQXlCLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBaUcsRUFBRTtJQUNoSixNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsR0FBRyxLQUFLLENBQUE7SUFDdEQsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBeUIsZUFBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ25GLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFdkUsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDcEUsTUFBTSxRQUFRLEdBQUcsWUFBWSxLQUFLLE9BQU87UUFDdkMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQTtJQUU1QixJQUFJLFlBQVksS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUM3QixNQUFNLGVBQWUsQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUE7UUFDeEUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUNaLHlFQUF5RSxFQUN6RSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FDcEIsQ0FB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
@@ -5,15 +5,22 @@ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
5
  const steps_1 = require("./steps");
6
6
  const otp_verification_1 = require("../modules/otp-verification");
7
7
  const updatePhoneVerifiedStep = (0, workflows_sdk_1.createStep)("update-phone-verified", async ({ customer_id }, context) => {
8
- // Get OTP verification service from container
9
8
  const otpService = context.container.resolve(otp_verification_1.OTP_VERIFICATION_MODULE);
10
- // Update customer phone_verified field using service method
11
9
  await otpService.updatePhoneVerified(context, customer_id);
12
10
  return new workflows_sdk_1.StepResponse({ customer_id, phone_verified: true });
13
11
  });
14
12
  exports.verifyPhoneWorkflow = (0, workflows_sdk_1.createWorkflow)("verify-phone", (input) => {
15
13
  const updateResult = updatePhoneVerifiedStep(input);
16
- // Retrieve customer after update to get the latest data
14
+ // Keep the phonepass provider_identity.entity_id in sync with the
15
+ // customer's current phone. This handles the case where the customer
16
+ // updated their phone number — without this step, login would fail
17
+ // because phonepass looks up identities by entity_id (the old phone).
18
+ // Skipped when login.identifier is not "phone" or "both".
19
+ const syncInput = (0, workflows_sdk_1.transform)({ updateResult, input }, (data) => ({
20
+ customer_id: data.updateResult.customer_id,
21
+ login_identifier: data.input.login_identifier,
22
+ }));
23
+ (0, steps_1.syncPhonepassEntityIdStep)(syncInput);
17
24
  const customer = (0, steps_1.retrieveCustomerStep)(updateResult);
18
25
  return new workflows_sdk_1.WorkflowResponse({
19
26
  customer_id: updateResult.customer_id,
@@ -22,4 +29,4 @@ exports.verifyPhoneWorkflow = (0, workflows_sdk_1.createWorkflow)("verify-phone"
22
29
  });
23
30
  });
24
31
  exports.default = exports.verifyPhoneWorkflow;
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5LXBob25lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy92ZXJpZnktcGhvbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBSzBDO0FBQzFDLG1DQUE4QztBQUM5QyxrRUFBcUU7QUFPckUsTUFBTSx1QkFBdUIsR0FBRyxJQUFBLDBCQUFVLEVBQ3hDLHVCQUF1QixFQUN2QixLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQW9CLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkQsOENBQThDO0lBQzlDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUMxQywwQ0FBdUIsQ0FDRSxDQUFBO0lBRTNCLDREQUE0RDtJQUM1RCxNQUFNLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFFMUQsT0FBTyxJQUFJLDRCQUFZLENBQUMsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7QUFDaEUsQ0FBQyxDQUNGLENBQUE7QUFRWSxRQUFBLG1CQUFtQixHQUFHLElBQUEsOEJBQWMsRUFDL0MsY0FBYyxFQUNkLENBQUMsS0FBdUIsRUFBdUMsRUFBRTtJQUMvRCxNQUFNLFlBQVksR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNuRCx3REFBd0Q7SUFDeEQsTUFBTSxRQUFRLEdBQUcsSUFBQSw0QkFBb0IsRUFBQyxZQUFZLENBQUMsQ0FBQTtJQUVuRCxPQUFPLElBQUksZ0NBQWdCLENBQUM7UUFDMUIsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXO1FBQ3JDLGNBQWMsRUFBRSxZQUFZLENBQUMsY0FBYztRQUMzQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7S0FDNUIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUNGLENBQUE7QUFFRCxrQkFBZSwyQkFBbUIsQ0FBQSJ9
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5LXBob25lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy92ZXJpZnktcGhvbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBTTBDO0FBQzFDLG1DQUF5RTtBQUN6RSxrRUFBcUU7QUFRckUsTUFBTSx1QkFBdUIsR0FBRyxJQUFBLDBCQUFVLEVBQ3hDLHVCQUF1QixFQUN2QixLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQW9CLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQzFDLDBDQUF1QixDQUNFLENBQUE7SUFFM0IsTUFBTSxVQUFVLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBRTFELE9BQU8sSUFBSSw0QkFBWSxDQUFDLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQ2hFLENBQUMsQ0FDRixDQUFBO0FBUVksUUFBQSxtQkFBbUIsR0FBRyxJQUFBLDhCQUFjLEVBQy9DLGNBQWMsRUFDZCxDQUFDLEtBQXVCLEVBQXVDLEVBQUU7SUFDL0QsTUFBTSxZQUFZLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFbkQsa0VBQWtFO0lBQ2xFLHFFQUFxRTtJQUNyRSxtRUFBbUU7SUFDbkUsc0VBQXNFO0lBQ3RFLDBEQUEwRDtJQUMxRCxNQUFNLFNBQVMsR0FBRyxJQUFBLHlCQUFTLEVBQUMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUQsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVztRQUMxQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQjtLQUM5QyxDQUFDLENBQUMsQ0FBQTtJQUNILElBQUEsaUNBQXlCLEVBQUMsU0FBUyxDQUFDLENBQUE7SUFFcEMsTUFBTSxRQUFRLEdBQUcsSUFBQSw0QkFBb0IsRUFBQyxZQUFZLENBQUMsQ0FBQTtJQUVuRCxPQUFPLElBQUksZ0NBQWdCLENBQUM7UUFDMUIsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXO1FBQ3JDLGNBQWMsRUFBRSxZQUFZLENBQUMsY0FBYztRQUMzQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7S0FDNUIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUNGLENBQUE7QUFFRCxrQkFBZSwyQkFBbUIsQ0FBQSJ9