customer-registration 0.0.23 → 0.0.47

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 (32) hide show
  1. package/.medusa/server/src/api/auth/customer/emailpass/route.js +58 -0
  2. package/.medusa/server/src/api/store/customers/email/otp/resend/route.js +78 -0
  3. package/.medusa/server/src/api/store/customers/email/otp/verify/route.js +54 -40
  4. package/.medusa/server/src/api/store/customers/forget-password/otp/resend/route.js +52 -0
  5. package/.medusa/server/src/api/store/customers/forget-password/otp/verify/route.js +42 -0
  6. package/.medusa/server/src/api/store/customers/phone/otp/resend/route.js +81 -0
  7. package/.medusa/server/src/api/store/customers/phone/otp/verify/route.js +60 -41
  8. package/.medusa/server/src/errors/otp-errors.js +29 -0
  9. package/.medusa/server/src/loaders/index.js +29 -9
  10. package/.medusa/server/src/modules/customer-registration/index.js +43 -9
  11. package/.medusa/server/src/modules/customer-registration/migrations/Migration20251122112915AddEmailPhoneVerifiedColumns.js +67 -0
  12. package/.medusa/server/src/modules/customer-registration/migrations/Migration20251122112916CreateCustomerOtpTable.js +56 -0
  13. package/.medusa/server/src/modules/customer-registration/models/customer-otp.js +65 -32
  14. package/.medusa/server/src/modules/customer-registration/services/otp-service.js +226 -0
  15. package/.medusa/server/src/services/notification-service.js +81 -0
  16. package/.medusa/server/src/subscribers/customer-created.js +42 -0
  17. package/.medusa/server/src/types/plugin-options.js +30 -0
  18. package/.medusa/server/src/utils/crypto.js +52 -0
  19. package/.medusa/server/src/utils/customer-update.js +48 -0
  20. package/.medusa/server/src/utils/otp-generator.js +27 -0
  21. package/.medusa/server/src/utils/token-generator.js +11 -0
  22. package/README.md +156 -32
  23. package/package.json +3 -1
  24. package/.medusa/server/src/api/store/customers/phone/otp/send/route.js +0 -48
  25. package/.medusa/server/src/api/store/customers/route.js +0 -77
  26. package/.medusa/server/src/modules/customer-registration/__tests__/config.spec.js +0 -61
  27. package/.medusa/server/src/modules/customer-registration/config.js +0 -73
  28. package/.medusa/server/src/modules/customer-registration/constants.js +0 -5
  29. package/.medusa/server/src/modules/customer-registration/migrations/Migration20250118000000AddEmailVerifiedColumn.js +0 -21
  30. package/.medusa/server/src/modules/customer-registration/migrations/Migration20250118001000CreateCustomerOtpTable.js +0 -48
  31. package/.medusa/server/src/modules/customer-registration/service.js +0 -242
  32. package/.medusa/server/src/modules/customer-registration/types.js +0 -3
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = exports.GET = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const generate_jwt_token_1 = require("@medusajs/medusa/api/auth/utils/generate-jwt-token");
6
+ const GET = async (req, res) => {
7
+ const config = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
8
+ const service = req.scope.resolve(utils_1.Modules.AUTH);
9
+ const authData = {
10
+ url: req.url,
11
+ headers: req.headers,
12
+ query: req.query,
13
+ body: req.body,
14
+ protocol: req.protocol,
15
+ };
16
+ const { success, error, authIdentity, location } = await service.authenticate("emailpass", authData);
17
+ if (location) {
18
+ return res.status(200).json({ location });
19
+ }
20
+ if (success && authIdentity) {
21
+ const email = authIdentity.provider_identities?.[0]?.entity_id ?? "";
22
+ await enforceEmailAndPhoneVerification({
23
+ email,
24
+ req,
25
+ });
26
+ const { http } = config.projectConfig;
27
+ const token = (0, generate_jwt_token_1.generateJwtTokenForAuthIdentity)({
28
+ authIdentity,
29
+ actorType: "customer",
30
+ authProvider: "emailpass",
31
+ }, {
32
+ secret: http.jwtSecret,
33
+ expiresIn: http.jwtExpiresIn,
34
+ options: http.jwtOptions,
35
+ });
36
+ return res.status(200).json({ token });
37
+ }
38
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, error || "Authentication failed");
39
+ };
40
+ exports.GET = GET;
41
+ const POST = async (req, res) => {
42
+ await (0, exports.GET)(req, res);
43
+ };
44
+ exports.POST = POST;
45
+ const enforceEmailAndPhoneVerification = async ({ email, req, }) => {
46
+ const customerService = req.scope.resolve(utils_1.Modules.CUSTOMER);
47
+ const customers = await customerService.listCustomers({
48
+ email: email,
49
+ });
50
+ if (customers.length === 0) {
51
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, "Please verify your email before logging in.");
52
+ }
53
+ const customer = customers[0];
54
+ if (!customer.email_verified) {
55
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, "Please verify your email before logging in.");
56
+ }
57
+ };
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2F1dGgvY3VzdG9tZXIvZW1haWxwYXNzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1BLHFEQUlrQztBQUNsQywyRkFBb0c7QUFFN0YsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUM5QixpQ0FBeUIsQ0FBQyxhQUFhLENBQ3hDLENBQUE7SUFFRCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFL0MsTUFBTSxRQUFRLEdBQUc7UUFDZixHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUc7UUFDWixPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87UUFDcEIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1FBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtRQUNkLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtLQUNBLENBQUE7SUFFeEIsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxHQUM5QyxNQUFNLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBRW5ELElBQUksUUFBUSxFQUFFLENBQUM7UUFDYixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUMzQyxDQUFDO0lBRUQsSUFBSSxPQUFPLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUIsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQTtRQUVwRSxNQUFNLGdDQUFnQyxDQUFDO1lBQ3JDLEtBQUs7WUFDTCxHQUFHO1NBQ0osQ0FBQyxDQUFBO1FBRUYsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUE7UUFDckMsTUFBTSxLQUFLLEdBQUcsSUFBQSxvREFBK0IsRUFDM0M7WUFDRSxZQUFZO1lBQ1osU0FBUyxFQUFFLFVBQVU7WUFDckIsWUFBWSxFQUFFLFdBQVc7U0FDMUIsRUFDRDtZQUNFLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBVTtZQUN2QixTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDNUIsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQ3pCLENBQ0YsQ0FBQTtRQUVELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3hDLENBQUM7SUFFRCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixLQUFLLElBQUksdUJBQXVCLENBQ2pDLENBQUE7QUFDSCxDQUFDLENBQUE7QUFuRFksUUFBQSxHQUFHLE9BbURmO0FBRU0sTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ3BFLE1BQU0sSUFBQSxXQUFHLEVBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBQ3JCLENBQUMsQ0FBQTtBQUZZLFFBQUEsSUFBSSxRQUVoQjtBQU9ELE1BQU0sZ0NBQWdDLEdBQUcsS0FBSyxFQUFFLEVBQzlDLEtBQUssRUFDTCxHQUFHLEdBSUosRUFBRSxFQUFFO0lBRUgsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ3ZDLGVBQU8sQ0FBQyxRQUFRLENBQ1MsQ0FBQTtJQUUzQixNQUFNLFNBQVMsR0FBRyxNQUFNLGVBQWUsQ0FBQyxhQUFhLENBQUM7UUFDcEQsS0FBSyxFQUFFLEtBQUs7S0FDYixDQUFDLENBQUE7SUFFRixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsNkNBQTZDLENBQzlDLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBNkIsQ0FBQTtJQUV6RCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzdCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDZDQUE2QyxDQUM5QyxDQUFBO0lBQ0gsQ0FBQztBQUNILENBQUMsQ0FBQSJ9
@@ -0,0 +1,78 @@
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 index_js_1 = require("../../../../../../modules/customer-registration/index.js");
6
+ const notification_service_js_1 = require("../../../../../../services/notification-service.js");
7
+ const POST = async (req, res) => {
8
+ const { email, customer_id, token } = req.body;
9
+ const customerService = req.scope.resolve(utils_1.Modules.CUSTOMER);
10
+ const notificationService = req.scope.resolve(utils_1.Modules.NOTIFICATION);
11
+ const otpService = req.scope.resolve(index_js_1.CUSTOMER_REGISTRATION_MODULE);
12
+ const config = req.scope.resolve("pluginOptions");
13
+ // Resolve customer
14
+ let customer;
15
+ if (customer_id) {
16
+ customer = await customerService.retrieveCustomer(customer_id);
17
+ }
18
+ else if (email) {
19
+ const customers = await customerService.listCustomers({ email });
20
+ if (customers.length === 0) {
21
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found");
22
+ }
23
+ customer = customers[0];
24
+ }
25
+ else {
26
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Either email or customer_id is required");
27
+ }
28
+ if (!customer.email) {
29
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Customer email is required");
30
+ }
31
+ // Resend OTP
32
+ let verifyToken = token;
33
+ if (!verifyToken) {
34
+ // Find latest OTP token
35
+ const manager = otpService.getManager();
36
+ const { CustomerOtp } = await import("../../../../../../modules/customer-registration/models/customer-otp.js");
37
+ const otpRecord = await manager.findOne(CustomerOtp, {
38
+ customer_id: customer.id,
39
+ channel_type: "email",
40
+ address: customer.email,
41
+ otp_type: "email_verification",
42
+ }, { orderBy: { created_at: "DESC" } });
43
+ verifyToken = otpRecord?.token || undefined;
44
+ }
45
+ if (!verifyToken) {
46
+ // Create new OTP if no token found
47
+ const result = await otpService.createOTP(customer.id, "email", customer.email, "email_verification", config);
48
+ verifyToken = result.token;
49
+ // Send notification
50
+ await (0, notification_service_js_1.sendOTP)(notificationService, {
51
+ otp: result.otp,
52
+ channelType: "email",
53
+ address: customer.email,
54
+ otpType: "email_verification",
55
+ customerName: `${customer.first_name || ""} ${customer.last_name || ""}`.trim() || undefined,
56
+ config,
57
+ });
58
+ }
59
+ else {
60
+ // Resend existing OTP
61
+ const result = await otpService.resendOTP(verifyToken, config);
62
+ // Send notification
63
+ await (0, notification_service_js_1.sendOTP)(notificationService, {
64
+ otp: result.otp,
65
+ channelType: "email",
66
+ address: customer.email,
67
+ otpType: "email_verification",
68
+ customerName: `${customer.first_name || ""} ${customer.last_name || ""}`.trim() || undefined,
69
+ config,
70
+ });
71
+ }
72
+ res.status(200).json({
73
+ sent: true,
74
+ token: verifyToken,
75
+ });
76
+ };
77
+ exports.POST = POST;
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9lbWFpbC9vdHAvcmVzZW5kL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFnRTtBQUloRSx1RkFBdUc7QUFDdkcsZ0dBQTRFO0FBU3JFLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNwRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBcUIsQ0FBQTtJQUUvRCxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDdkMsZUFBTyxDQUFDLFFBQVEsQ0FDUyxDQUFBO0lBQzNCLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQzNDLGVBQU8sQ0FBQyxZQUFZLENBQ1MsQ0FBQTtJQUMvQixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDbEMsdUNBQTRCLENBQ2YsQ0FBQTtJQUNmLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUM5QixlQUFlLENBQ1csQ0FBQTtJQUU1QixtQkFBbUI7SUFDbkIsSUFBSSxRQUFRLENBQUE7SUFDWixJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2hCLFFBQVEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNoRSxDQUFDO1NBQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNqQixNQUFNLFNBQVMsR0FBRyxNQUFNLGVBQWUsQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ2hFLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMzQixN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
@@ -1,49 +1,63 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.POST = POST;
3
+ exports.POST = void 0;
4
4
  const utils_1 = require("@medusajs/framework/utils");
5
- const customer_registration_1 = require("../../../../../../modules/customer-registration");
6
- async function POST(req, res) {
7
- const { email, customer_id, code } = req.body;
8
- if (!code || (!email && !customer_id)) {
9
- res.status(400).json({
10
- message: "Both code and either email or customer_id are required.",
11
- type: "invalid_data",
12
- });
13
- return;
5
+ const index_js_1 = require("../../../../../../modules/customer-registration/index.js");
6
+ const customer_update_js_1 = require("../../../../../../utils/customer-update.js");
7
+ const POST = async (req, res) => {
8
+ const { email, customer_id, code, token } = req.body;
9
+ if (!code) {
10
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "OTP code is required");
14
11
  }
15
- const customerRegistrationService = req.scope.resolve(customer_registration_1.CUSTOMER_REGISTRATION_MODULE);
16
- try {
17
- const customer = await customerRegistrationService.verifyEmailOtp({
18
- customerId: customer_id,
19
- email,
20
- code,
21
- });
22
- res.status(200).json({ customer });
12
+ const customerService = req.scope.resolve(utils_1.Modules.CUSTOMER);
13
+ const otpService = req.scope.resolve(index_js_1.CUSTOMER_REGISTRATION_MODULE);
14
+ const config = req.scope.resolve("pluginOptions");
15
+ // Resolve customer
16
+ let customer;
17
+ if (customer_id) {
18
+ customer = await customerService.retrieveCustomer(customer_id);
23
19
  }
24
- catch (error) {
25
- if (utils_1.MedusaError.isMedusaError?.(error)) {
26
- res.status(mapMedusaErrorToStatus(error.type)).json({
27
- message: error.message,
28
- type: error.type,
29
- });
30
- return;
20
+ else if (email) {
21
+ const customers = await customerService.listCustomers({ email });
22
+ if (customers.length === 0) {
23
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found");
31
24
  }
32
- res.status(500).json({
33
- message: error?.message ?? "Failed to verify email OTP",
34
- type: "unknown_error",
35
- });
25
+ customer = customers[0];
36
26
  }
37
- }
38
- const mapMedusaErrorToStatus = (type) => {
39
- switch (type) {
40
- case utils_1.MedusaError.Types.NOT_FOUND:
41
- return 404;
42
- case utils_1.MedusaError.Types.NOT_ALLOWED:
43
- case utils_1.MedusaError.Types.INVALID_DATA:
44
- return 400;
45
- default:
46
- return 500;
27
+ else {
28
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Either email or customer_id is required");
29
+ }
30
+ // Verify OTP
31
+ const verifyToken = token || (await findLatestOTPToken(otpService, customer.id, "email", customer.email, "email_verification"));
32
+ if (!verifyToken) {
33
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "No OTP found for this customer");
47
34
  }
35
+ await otpService.verifyOTPByToken(verifyToken, code, "email_verification", config);
36
+ // Update customer email_verified flag using EntityManager for custom fields
37
+ const manager = req.scope.resolve("manager");
38
+ await (0, customer_update_js_1.updateCustomerVerificationFields)(manager, customer.id, {
39
+ email_verified: true,
40
+ });
41
+ // Return updated customer
42
+ const updatedCustomer = await customerService.retrieveCustomer(customer.id);
43
+ res.status(200).json({ customer: updatedCustomer });
48
44
  };
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9lbWFpbC9vdHAvdmVyaWZ5L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsb0JBcUNDO0FBakRELHFEQUF1RDtBQUN2RCwyRkFFd0Q7QUFTakQsS0FBSyxVQUFVLElBQUksQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQ2hFLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUEwQixDQUFBO0lBRW5FLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDdEMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLHlEQUF5RDtZQUNsRSxJQUFJLEVBQUUsY0FBYztTQUNyQixDQUFDLENBQUE7UUFDRixPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ25ELG9EQUE0QixDQUNRLENBQUE7SUFFdEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSwyQkFBMkIsQ0FBQyxjQUFjLENBQUM7WUFDaEUsVUFBVSxFQUFFLFdBQVc7WUFDdkIsS0FBSztZQUNMLElBQUk7U0FDTCxDQUFDLENBQUE7UUFFRixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDcEMsQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsSUFBSSxtQkFBVyxDQUFDLGFBQWEsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xELE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztnQkFDdEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2FBQ2pCLENBQUMsQ0FBQTtZQUNGLE9BQU07UUFDUixDQUFDO1FBRUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksNEJBQTRCO1lBQ3ZELElBQUksRUFBRSxlQUFlO1NBQ3RCLENBQUMsQ0FBQTtJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFO0lBQzlDLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDYixLQUFLLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVM7WUFDOUIsT0FBTyxHQUFHLENBQUE7UUFDWixLQUFLLG1CQUFXLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNuQyxLQUFLLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVk7WUFDakMsT0FBTyxHQUFHLENBQUE7UUFDWjtZQUNFLE9BQU8sR0FBRyxDQUFBO0lBQ2QsQ0FBQztBQUNILENBQUMsQ0FBQSJ9
45
+ exports.POST = POST;
46
+ async function findLatestOTPToken(otpService, customerId, channelType, address, otpType) {
47
+ try {
48
+ const manager = otpService.getManager();
49
+ const { CustomerOtp } = await import("../../../../../../modules/customer-registration/models/customer-otp.js");
50
+ const otpRecord = await manager.findOne(CustomerOtp, {
51
+ customer_id: customerId,
52
+ channel_type: channelType,
53
+ address,
54
+ otp_type: otpType,
55
+ }, { orderBy: { created_at: "DESC" } });
56
+ return otpRecord?.token || null;
57
+ }
58
+ catch (error) {
59
+ console.error("[customer-registration] Error finding latest OTP token:", error);
60
+ return null;
61
+ }
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9lbWFpbC9vdHAvdmVyaWZ5L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFnRTtBQUloRSx1RkFBdUc7QUFFdkcsbUZBQTZGO0FBU3RGLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNwRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQXFCLENBQUE7SUFFckUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsc0JBQXNCLENBQ3ZCLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ3ZDLGVBQU8sQ0FBQyxRQUFRLENBQ1MsQ0FBQTtJQUMzQixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDbEMsdUNBQTRCLENBQ2YsQ0FBQTtJQUNmLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUM5QixlQUFlLENBQ1csQ0FBQTtJQUU1QixtQkFBbUI7SUFDbkIsSUFBSSxRQUFRLENBQUE7SUFDWixJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2hCLFFBQVEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNoRSxDQUFDO1NBQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNqQixNQUFNLFNBQVMsR0FBRyxNQUFNLGVBQWUsQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ2hF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
@@ -0,0 +1,52 @@
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 index_js_1 = require("../../../../../../modules/customer-registration/index.js");
6
+ const notification_service_js_1 = require("../../../../../../services/notification-service.js");
7
+ const POST = async (req, res) => {
8
+ const { email, customer_id, token } = req.body;
9
+ if (!token) {
10
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Token is required");
11
+ }
12
+ const customerService = req.scope.resolve(utils_1.Modules.CUSTOMER);
13
+ const notificationService = req.scope.resolve(utils_1.Modules.NOTIFICATION);
14
+ const otpService = req.scope.resolve(index_js_1.CUSTOMER_REGISTRATION_MODULE);
15
+ const config = req.scope.resolve("pluginOptions");
16
+ // Resolve customer
17
+ let customer;
18
+ if (customer_id) {
19
+ customer = await customerService.retrieveCustomer(customer_id);
20
+ }
21
+ else if (email) {
22
+ const customers = await customerService.listCustomers({ email });
23
+ if (customers.length === 0) {
24
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found");
25
+ }
26
+ customer = customers[0];
27
+ }
28
+ else {
29
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Either email or customer_id is required");
30
+ }
31
+ if (!customer.email) {
32
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Customer email is required");
33
+ }
34
+ // Resend OTP
35
+ const result = await otpService.resendOTP(token, config);
36
+ // Send notification
37
+ await (0, notification_service_js_1.sendOTP)(notificationService, {
38
+ otp: result.otp,
39
+ channelType: "email",
40
+ address: customer.email,
41
+ otpType: "forget_password",
42
+ customerName: `${customer.first_name || ""} ${customer.last_name || ""}`.trim() || undefined,
43
+ config,
44
+ });
45
+ res.status(200).json({
46
+ sent: true,
47
+ token: result.token,
48
+ expires_at: result.expiresAt,
49
+ });
50
+ };
51
+ exports.POST = POST;
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9mb3JnZXQtcGFzc3dvcmQvb3RwL3Jlc2VuZC9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBZ0U7QUFHaEUsdUZBQXVHO0FBQ3ZHLGdHQUE0RTtBQVNyRSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQXFCLENBQUE7SUFFL0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsbUJBQW1CLENBQ3BCLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ3ZDLGVBQU8sQ0FBQyxRQUFRLENBQ1MsQ0FBQTtJQUMzQixNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUMzQyxlQUFPLENBQUMsWUFBWSxDQUNTLENBQUE7SUFDL0IsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ2xDLHVDQUE0QixDQUNmLENBQUE7SUFDZixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDOUIsZUFBZSxDQUNXLENBQUE7SUFFNUIsbUJBQW1CO0lBQ25CLElBQUksUUFBUSxDQUFBO0lBQ1osSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQixRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDaEUsQ0FBQztTQUFNLElBQUksS0FBSyxFQUFFLENBQUM7UUFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxlQUFlLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUNoRSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFDM0Isb0JBQW9CLENBQ3JCLENBQUE7UUFDSCxDQUFDO1FBQ0QsUUFBUSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN6QixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHlDQUF5QyxDQUMxQyxDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsNEJBQTRCLENBQzdCLENBQUE7SUFDSCxDQUFDO0lBRUQsYUFBYTtJQUNiLE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFFeEQsb0JBQW9CO0lBQ3BCLE1BQU0sSUFBQSxpQ0FBTyxFQUFDLG1CQUFtQixFQUFFO1FBQ2pDLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztRQUNmLFdBQVcsRUFBRSxPQUFPO1FBQ3BCLE9BQU8sRUFBRSxRQUFRLENBQUMsS0FBSztRQUN2QixPQUFPLEVBQUUsaUJBQWlCO1FBQzFCLFlBQVksRUFBRSxHQUFHLFFBQVEsQ0FBQyxVQUFVLElBQUksRUFBRSxJQUFJLFFBQVEsQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksU0FBUztRQUM1RixNQUFNO0tBQ1AsQ0FBQyxDQUFBO0lBRUYsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbkIsSUFBSSxFQUFFLElBQUk7UUFDVixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7UUFDbkIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxTQUFTO0tBQzdCLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQTtBQXBFWSxRQUFBLElBQUksUUFvRWhCIn0=
@@ -0,0 +1,42 @@
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 index_js_1 = require("../../../../../../modules/customer-registration/index.js");
6
+ const POST = async (req, res) => {
7
+ const { email, customer_id, code, token } = req.body;
8
+ if (!code || !token) {
9
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "OTP code and token are required");
10
+ }
11
+ const customerService = req.scope.resolve(utils_1.Modules.CUSTOMER);
12
+ const otpService = req.scope.resolve(index_js_1.CUSTOMER_REGISTRATION_MODULE);
13
+ const config = req.scope.resolve("pluginOptions");
14
+ // Resolve customer
15
+ let customer;
16
+ if (customer_id) {
17
+ customer = await customerService.retrieveCustomer(customer_id);
18
+ }
19
+ else if (email) {
20
+ const customers = await customerService.listCustomers({ email });
21
+ if (customers.length === 0) {
22
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found");
23
+ }
24
+ customer = customers[0];
25
+ }
26
+ else {
27
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Either email or customer_id is required");
28
+ }
29
+ if (!customer.email) {
30
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Customer email is required");
31
+ }
32
+ // Verify OTP
33
+ await otpService.verifyOTPByToken(token, code, "forget_password", config);
34
+ // Return success with token for password reset
35
+ res.status(200).json({
36
+ verified: true,
37
+ token,
38
+ customer_id: customer.id,
39
+ });
40
+ };
41
+ exports.POST = POST;
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9mb3JnZXQtcGFzc3dvcmQvb3RwL3ZlcmlmeS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBZ0U7QUFHaEUsdUZBQXVHO0FBVWhHLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNwRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQXFCLENBQUE7SUFFckUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLGlDQUFpQyxDQUNsQyxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUN2QyxlQUFPLENBQUMsUUFBUSxDQUNTLENBQUE7SUFDM0IsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ2xDLHVDQUE0QixDQUNmLENBQUE7SUFDZixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDOUIsZUFBZSxDQUNXLENBQUE7SUFFNUIsbUJBQW1CO0lBQ25CLElBQUksUUFBUSxDQUFBO0lBQ1osSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQixRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDaEUsQ0FBQztTQUFNLElBQUksS0FBSyxFQUFFLENBQUM7UUFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxlQUFlLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUNoRSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFDM0Isb0JBQW9CLENBQ3JCLENBQUE7UUFDSCxDQUFDO1FBQ0QsUUFBUSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN6QixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHlDQUF5QyxDQUMxQyxDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsNEJBQTRCLENBQzdCLENBQUE7SUFDSCxDQUFDO0lBRUQsYUFBYTtJQUNiLE1BQU0sVUFBVSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFFekUsK0NBQStDO0lBQy9DLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25CLFFBQVEsRUFBRSxJQUFJO1FBQ2QsS0FBSztRQUNMLFdBQVcsRUFBRSxRQUFRLENBQUMsRUFBRTtLQUN6QixDQUFDLENBQUE7QUFDSixDQUFDLENBQUE7QUF4RFksUUFBQSxJQUFJLFFBd0RoQiJ9
@@ -0,0 +1,81 @@
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 index_js_1 = require("../../../../../../modules/customer-registration/index.js");
6
+ const notification_service_js_1 = require("../../../../../../services/notification-service.js");
7
+ const customer_update_js_1 = require("../../../../../../utils/customer-update.js");
8
+ const POST = async (req, res) => {
9
+ const { phone, customer_id, token } = req.body;
10
+ const customerService = req.scope.resolve(utils_1.Modules.CUSTOMER);
11
+ const notificationService = req.scope.resolve(utils_1.Modules.NOTIFICATION);
12
+ const otpService = req.scope.resolve(index_js_1.CUSTOMER_REGISTRATION_MODULE);
13
+ const config = req.scope.resolve("pluginOptions");
14
+ // Resolve customer
15
+ let customer;
16
+ if (customer_id) {
17
+ customer = await customerService.retrieveCustomer(customer_id);
18
+ }
19
+ else if (phone) {
20
+ // Use EntityManager to find customer by phone since listCustomers may not support phone filter
21
+ const manager = req.scope.resolve("manager");
22
+ const customerRecord = await (0, customer_update_js_1.findCustomerByPhone)(manager, phone);
23
+ if (!customerRecord) {
24
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found");
25
+ }
26
+ customer = await customerService.retrieveCustomer(customerRecord.id);
27
+ }
28
+ else {
29
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Either phone or customer_id is required");
30
+ }
31
+ if (!customer.phone) {
32
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Customer phone is required");
33
+ }
34
+ // Resend OTP
35
+ let verifyToken = token;
36
+ if (!verifyToken) {
37
+ // Find latest OTP token
38
+ const manager = otpService.getManager();
39
+ const { CustomerOtp } = await import("../../../../../../modules/customer-registration/models/customer-otp.js");
40
+ const otpRecord = await manager.findOne(CustomerOtp, {
41
+ customer_id: customer.id,
42
+ channel_type: "phone",
43
+ address: customer.phone,
44
+ otp_type: "phone_verification",
45
+ }, { orderBy: { created_at: "DESC" } });
46
+ verifyToken = otpRecord?.token || undefined;
47
+ }
48
+ if (!verifyToken) {
49
+ // Create new OTP if no token found
50
+ const result = await otpService.createOTP(customer.id, "phone", customer.phone, "phone_verification", config);
51
+ verifyToken = result.token;
52
+ // Send notification
53
+ await (0, notification_service_js_1.sendOTP)(notificationService, {
54
+ otp: result.otp,
55
+ channelType: "phone",
56
+ address: customer.phone,
57
+ otpType: "phone_verification",
58
+ customerName: `${customer.first_name || ""} ${customer.last_name || ""}`.trim() || undefined,
59
+ config,
60
+ });
61
+ }
62
+ else {
63
+ // Resend existing OTP
64
+ const result = await otpService.resendOTP(verifyToken, config);
65
+ // Send notification
66
+ await (0, notification_service_js_1.sendOTP)(notificationService, {
67
+ otp: result.otp,
68
+ channelType: "phone",
69
+ address: customer.phone,
70
+ otpType: "phone_verification",
71
+ customerName: `${customer.first_name || ""} ${customer.last_name || ""}`.trim() || undefined,
72
+ config,
73
+ });
74
+ }
75
+ res.status(200).json({
76
+ sent: true,
77
+ token: verifyToken,
78
+ });
79
+ };
80
+ exports.POST = POST;
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9waG9uZS9vdHAvcmVzZW5kL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFnRTtBQUloRSx1RkFBdUc7QUFDdkcsZ0dBQTRFO0FBRTVFLG1GQUFnRjtBQVF6RSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQXFCLENBQUE7SUFFL0QsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ3ZDLGVBQU8sQ0FBQyxRQUFRLENBQ1MsQ0FBQTtJQUMzQixNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUMzQyxlQUFPLENBQUMsWUFBWSxDQUNTLENBQUE7SUFDL0IsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ2xDLHVDQUE0QixDQUNmLENBQUE7SUFDZixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDOUIsZUFBZSxDQUNXLENBQUE7SUFFNUIsbUJBQW1CO0lBQ25CLElBQUksUUFBUSxDQUFBO0lBQ1osSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQixRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDaEUsQ0FBQztTQUFNLElBQUksS0FBSyxFQUFFLENBQUM7UUFDakIsK0ZBQStGO1FBQy9GLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBa0IsQ0FBQTtRQUM3RCxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUEs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
@@ -1,49 +1,68 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.POST = POST;
3
+ exports.POST = void 0;
4
4
  const utils_1 = require("@medusajs/framework/utils");
5
- const customer_registration_1 = require("../../../../../../modules/customer-registration");
6
- async function POST(req, res) {
7
- const { customer_id, email, code } = req.body;
8
- if (!code || (!customer_id && !email)) {
9
- res.status(400).json({
10
- message: "Both code and either customer_id or email are required.",
11
- type: "invalid_data",
12
- });
13
- return;
14
- }
15
- const customerRegistrationService = req.scope.resolve(customer_registration_1.CUSTOMER_REGISTRATION_MODULE);
16
- try {
17
- const customer = await customerRegistrationService.verifyPhoneOtp({
18
- customerId: customer_id,
19
- email,
20
- code,
21
- });
22
- res.status(200).json({ customer });
5
+ const index_js_1 = require("../../../../../../modules/customer-registration/index.js");
6
+ const customer_update_js_1 = require("../../../../../../utils/customer-update.js");
7
+ const POST = async (req, res) => {
8
+ const { phone, customer_id, code, token } = req.body;
9
+ if (!code) {
10
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "OTP code is required");
23
11
  }
24
- catch (error) {
25
- if (utils_1.MedusaError.isMedusaError?.(error)) {
26
- res.status(mapMedusaErrorToStatus(error.type)).json({
27
- message: error.message,
28
- type: error.type,
29
- });
30
- return;
12
+ const customerService = req.scope.resolve(utils_1.Modules.CUSTOMER);
13
+ const otpService = req.scope.resolve(index_js_1.CUSTOMER_REGISTRATION_MODULE);
14
+ const config = req.scope.resolve("pluginOptions");
15
+ // Resolve customer
16
+ let customer;
17
+ if (customer_id) {
18
+ customer = await customerService.retrieveCustomer(customer_id);
19
+ }
20
+ else if (phone) {
21
+ // Use EntityManager to find customer by phone since listCustomers may not support phone filter
22
+ const manager = req.scope.resolve("manager");
23
+ const customerRecord = await (0, customer_update_js_1.findCustomerByPhone)(manager, phone);
24
+ if (!customerRecord) {
25
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found");
31
26
  }
32
- res.status(500).json({
33
- message: error?.message ?? "Failed to verify phone OTP",
34
- type: "unknown_error",
35
- });
27
+ customer = await customerService.retrieveCustomer(customerRecord.id);
36
28
  }
37
- }
38
- const mapMedusaErrorToStatus = (type) => {
39
- switch (type) {
40
- case utils_1.MedusaError.Types.NOT_FOUND:
41
- return 404;
42
- case utils_1.MedusaError.Types.NOT_ALLOWED:
43
- case utils_1.MedusaError.Types.INVALID_DATA:
44
- return 400;
45
- default:
46
- return 500;
29
+ else {
30
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Either phone or customer_id is required");
31
+ }
32
+ if (!customer.phone) {
33
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Customer phone is required");
34
+ }
35
+ // Verify OTP
36
+ const verifyToken = token || (await findLatestOTPToken(otpService, customer.id, "phone", customer.phone, "phone_verification"));
37
+ if (!verifyToken) {
38
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "No OTP found for this customer");
47
39
  }
40
+ await otpService.verifyOTPByToken(verifyToken, code, "phone_verification", config);
41
+ // Update customer phone_verified flag using EntityManager for custom fields
42
+ const manager = req.scope.resolve("manager");
43
+ await (0, customer_update_js_1.updateCustomerVerificationFields)(manager, customer.id, {
44
+ phone_verified: true,
45
+ });
46
+ // Return updated customer
47
+ const updatedCustomer = await customerService.retrieveCustomer(customer.id);
48
+ res.status(200).json({ customer: updatedCustomer });
48
49
  };
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9waG9uZS9vdHAvdmVyaWZ5L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsb0JBcUNDO0FBakRELHFEQUF1RDtBQUN2RCwyRkFFd0Q7QUFTakQsS0FBSyxVQUFVLElBQUksQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQ2hFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUEwQixDQUFBO0lBRW5FLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdEMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLHlEQUF5RDtZQUNsRSxJQUFJLEVBQUUsY0FBYztTQUNyQixDQUFDLENBQUE7UUFDRixPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ25ELG9EQUE0QixDQUNRLENBQUE7SUFFdEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSwyQkFBMkIsQ0FBQyxjQUFjLENBQUM7WUFDaEUsVUFBVSxFQUFFLFdBQVc7WUFDdkIsS0FBSztZQUNMLElBQUk7U0FDTCxDQUFDLENBQUE7UUFFRixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDcEMsQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsSUFBSSxtQkFBVyxDQUFDLGFBQWEsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xELE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztnQkFDdEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2FBQ2pCLENBQUMsQ0FBQTtZQUNGLE9BQU07UUFDUixDQUFDO1FBRUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksNEJBQTRCO1lBQ3ZELElBQUksRUFBRSxlQUFlO1NBQ3RCLENBQUMsQ0FBQTtJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFO0lBQzlDLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDYixLQUFLLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVM7WUFDOUIsT0FBTyxHQUFHLENBQUE7UUFDWixLQUFLLG1CQUFXLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNuQyxLQUFLLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVk7WUFDakMsT0FBTyxHQUFHLENBQUE7UUFDWjtZQUNFLE9BQU8sR0FBRyxDQUFBO0lBQ2QsQ0FBQztBQUNILENBQUMsQ0FBQSJ9
50
+ exports.POST = POST;
51
+ async function findLatestOTPToken(otpService, customerId, channelType, address, otpType) {
52
+ try {
53
+ const manager = otpService.getManager();
54
+ const { CustomerOtp } = await import("../../../../../../modules/customer-registration/models/customer-otp.js");
55
+ const otpRecord = await manager.findOne(CustomerOtp, {
56
+ customer_id: customerId,
57
+ channel_type: channelType,
58
+ address,
59
+ otp_type: otpType,
60
+ }, { orderBy: { created_at: "DESC" } });
61
+ return otpRecord?.token || null;
62
+ }
63
+ catch (error) {
64
+ console.error("[customer-registration] Error finding latest OTP token:", error);
65
+ return null;
66
+ }
67
+ }
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9waG9uZS9vdHAvdmVyaWZ5L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFnRTtBQUloRSx1RkFBdUc7QUFFdkcsbUZBQWtIO0FBUzNHLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNwRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQXFCLENBQUE7SUFFckUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsc0JBQXNCLENBQ3ZCLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ3ZDLGVBQU8sQ0FBQyxRQUFRLENBQ1MsQ0FBQTtJQUMzQixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDbEMsdUNBQTRCLENBQ2YsQ0FBQTtJQUNmLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUM5QixlQUFlLENBQ1csQ0FBQTtJQUU1QixtQkFBbUI7SUFDbkIsSUFBSSxRQUFRLENBQUE7SUFDWixJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2hCLFFBQVEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNoRSxDQUFDO1NBQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNqQiwrRkFBK0Y7UUFDL0YsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFrQixD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
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OTPThrottleError = exports.OTPMaxAttemptsError = exports.OTPInvalidError = exports.OTPExpiredError = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ class OTPExpiredError extends utils_1.MedusaError {
6
+ constructor(message = "OTP has expired") {
7
+ super(utils_1.MedusaError.Types.INVALID_DATA, message);
8
+ }
9
+ }
10
+ exports.OTPExpiredError = OTPExpiredError;
11
+ class OTPInvalidError extends utils_1.MedusaError {
12
+ constructor(message = "Invalid OTP code") {
13
+ super(utils_1.MedusaError.Types.INVALID_DATA, message);
14
+ }
15
+ }
16
+ exports.OTPInvalidError = OTPInvalidError;
17
+ class OTPMaxAttemptsError extends utils_1.MedusaError {
18
+ constructor(message = "Maximum verification attempts exceeded. Please request a new OTP") {
19
+ super(utils_1.MedusaError.Types.INVALID_DATA, message);
20
+ }
21
+ }
22
+ exports.OTPMaxAttemptsError = OTPMaxAttemptsError;
23
+ class OTPThrottleError extends utils_1.MedusaError {
24
+ constructor(message = "Please wait before requesting a new OTP") {
25
+ super(utils_1.MedusaError.Types.INVALID_DATA, message);
26
+ }
27
+ }
28
+ exports.OTPThrottleError = OTPThrottleError;
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RwLWVycm9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9lcnJvcnMvb3RwLWVycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBdUQ7QUFFdkQsTUFBYSxlQUFnQixTQUFRLG1CQUFXO0lBQzlDLFlBQVksT0FBTyxHQUFHLGlCQUFpQjtRQUNyQyxLQUFLLENBQUMsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ2hELENBQUM7Q0FDRjtBQUpELDBDQUlDO0FBRUQsTUFBYSxlQUFnQixTQUFRLG1CQUFXO0lBQzlDLFlBQVksT0FBTyxHQUFHLGtCQUFrQjtRQUN0QyxLQUFLLENBQUMsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ2hELENBQUM7Q0FDRjtBQUpELDBDQUlDO0FBRUQsTUFBYSxtQkFBb0IsU0FBUSxtQkFBVztJQUNsRCxZQUFZLE9BQU8sR0FBRyxrRUFBa0U7UUFDdEYsS0FBSyxDQUFDLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNoRCxDQUFDO0NBQ0Y7QUFKRCxrREFJQztBQUVELE1BQWEsZ0JBQWlCLFNBQVEsbUJBQVc7SUFDL0MsWUFBWSxPQUFPLEdBQUcseUNBQXlDO1FBQzdELEtBQUssQ0FBQyxtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDaEQsQ0FBQztDQUNGO0FBSkQsNENBSUMifQ==