customer-registration 0.0.24 → 0.0.48
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.
- package/.medusa/server/src/api/auth/customer/emailpass/route.js +58 -0
- package/.medusa/server/src/api/store/customers/email/otp/resend/route.js +78 -0
- package/.medusa/server/src/api/store/customers/email/otp/verify/route.js +54 -40
- package/.medusa/server/src/api/store/customers/forget-password/otp/resend/route.js +52 -0
- package/.medusa/server/src/api/store/customers/forget-password/otp/verify/route.js +42 -0
- package/.medusa/server/src/api/store/customers/phone/otp/resend/route.js +81 -0
- package/.medusa/server/src/api/store/customers/phone/otp/verify/route.js +60 -41
- package/.medusa/server/src/errors/otp-errors.js +29 -0
- package/.medusa/server/src/loaders/index.js +29 -9
- package/.medusa/server/src/modules/customer-registration/index.js +44 -9
- package/.medusa/server/src/modules/customer-registration/migrations/Migration20251122112915AddEmailPhoneVerifiedColumns.js +67 -0
- package/.medusa/server/src/modules/customer-registration/migrations/Migration20251122112916CreateCustomerOtpTable.js +56 -0
- package/.medusa/server/src/modules/customer-registration/models/customer-otp.js +65 -32
- package/.medusa/server/src/modules/customer-registration/services/otp-service.js +226 -0
- package/.medusa/server/src/services/notification-service.js +81 -0
- package/.medusa/server/src/subscribers/customer-created.js +42 -0
- package/.medusa/server/src/types/plugin-options.js +30 -0
- package/.medusa/server/src/utils/crypto.js +52 -0
- package/.medusa/server/src/utils/customer-update.js +48 -0
- package/.medusa/server/src/utils/otp-generator.js +27 -0
- package/.medusa/server/src/utils/token-generator.js +11 -0
- package/README.md +156 -32
- package/package.json +5 -1
- package/.medusa/server/src/api/store/customers/phone/otp/send/route.js +0 -48
- package/.medusa/server/src/api/store/customers/route.js +0 -77
- package/.medusa/server/src/modules/customer-registration/__tests__/config.spec.js +0 -61
- package/.medusa/server/src/modules/customer-registration/config.js +0 -73
- package/.medusa/server/src/modules/customer-registration/constants.js +0 -5
- package/.medusa/server/src/modules/customer-registration/migrations/Migration20250118000000AddEmailVerifiedColumn.js +0 -21
- package/.medusa/server/src/modules/customer-registration/migrations/Migration20250118001000CreateCustomerOtpTable.js +0 -48
- package/.medusa/server/src/modules/customer-registration/service.js +0 -242
- 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 =
|
|
3
|
+
exports.POST = void 0;
|
|
4
4
|
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
33
|
-
message: error?.message ?? "Failed to verify email OTP",
|
|
34
|
-
type: "unknown_error",
|
|
35
|
-
});
|
|
25
|
+
customer = customers[0];
|
|
36
26
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
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 =
|
|
3
|
+
exports.POST = void 0;
|
|
4
4
|
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
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==
|