customer-registration 0.0.127 → 0.0.129
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/middlewares.js +2 -7
- package/.medusa/server/src/api/store/customers/otp/__tests__/send-route.test.js +240 -0
- package/.medusa/server/src/api/store/customers/otp/__tests__/verify-route.test.js +240 -0
- package/.medusa/server/src/api/store/customers/otp/send/route.js +45 -7
- package/.medusa/server/src/api/store/customers/otp/shared/email-auth-helpers.js +62 -0
- package/.medusa/server/src/api/store/customers/otp/shared/handle-send-email-auth-otp.js +45 -0
- package/.medusa/server/src/api/store/customers/otp/shared/handle-send-phone-auth-otp.js +45 -0
- package/.medusa/server/src/api/store/customers/otp/shared/handle-verify-email-auth-otp.js +54 -0
- package/.medusa/server/src/api/store/customers/otp/shared/handle-verify-phone-auth-otp.js +54 -0
- package/.medusa/server/src/api/{auth/customer/phoneotp → store/customers/otp}/shared/phone-auth-helpers.js +1 -1
- package/.medusa/server/src/api/store/customers/otp/shared/resolve-otp-token-purpose.js +27 -0
- package/.medusa/server/src/api/store/customers/otp/verify/route.js +22 -28
- package/.medusa/server/src/api/store/customers/route.js +10 -14
- package/.medusa/server/src/api/store/customers/shared/__tests__/create-phone-only-customer.test.js +67 -0
- package/.medusa/server/src/api/store/customers/shared/create-phone-only-customer.js +43 -0
- package/.medusa/server/src/config.js +3 -3
- package/.medusa/server/src/providers/emailotp/service.js +2 -2
- package/.medusa/server/src/providers/phoneotp/service.js +2 -2
- package/.medusa/server/src/workflows/steps/resolve-or-create-email-auth-customer-step.js +2 -2
- package/.medusa/server/src/workflows/steps/resolve-or-create-phone-auth-customer-step.js +8 -47
- package/README.md +76 -114
- package/package.json +1 -1
- package/.medusa/server/src/api/auth/customer/emailotp/__tests__/send-route.test.js +0 -151
- package/.medusa/server/src/api/auth/customer/emailotp/__tests__/verify-route.test.js +0 -171
- package/.medusa/server/src/api/auth/customer/emailotp/send/route.js +0 -51
- package/.medusa/server/src/api/auth/customer/emailotp/shared/email-auth-helpers.js +0 -62
- package/.medusa/server/src/api/auth/customer/emailotp/verify/route.js +0 -54
- package/.medusa/server/src/api/auth/customer/phoneotp/__tests__/send-route.test.js +0 -153
- package/.medusa/server/src/api/auth/customer/phoneotp/__tests__/verify-route.test.js +0 -158
- package/.medusa/server/src/api/auth/customer/phoneotp/send/route.js +0 -51
- package/.medusa/server/src/api/auth/customer/phoneotp/verify/route.js +0 -54
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeAuthEmail = normalizeAuthEmail;
|
|
4
|
+
exports.lookupCustomerByEmail = lookupCustomerByEmail;
|
|
5
|
+
exports.findAnyAuthIdentityIdByEmail = findAnyAuthIdentityIdByEmail;
|
|
6
|
+
exports.findAuthIdentityIdByEmail = findAuthIdentityIdByEmail;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
function firstKnexRow(result) {
|
|
9
|
+
const fromRows = result.rows?.[0];
|
|
10
|
+
if (fromRows && typeof fromRows === "object" && !Array.isArray(fromRows)) {
|
|
11
|
+
return fromRows;
|
|
12
|
+
}
|
|
13
|
+
const batch = result[0];
|
|
14
|
+
if (Array.isArray(batch)) {
|
|
15
|
+
const first = batch[0];
|
|
16
|
+
if (first && typeof first === "object" && !Array.isArray(first)) {
|
|
17
|
+
return first;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
function normalizeAuthEmail(email) {
|
|
23
|
+
return email.toLowerCase().trim();
|
|
24
|
+
}
|
|
25
|
+
async function lookupCustomerByEmail(scope, email) {
|
|
26
|
+
const knex = scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
|
|
27
|
+
const normalized = normalizeAuthEmail(email);
|
|
28
|
+
const result = await knex.raw(`SELECT id, email, has_account, first_name, last_name
|
|
29
|
+
FROM customer
|
|
30
|
+
WHERE lower(email) = lower(?)
|
|
31
|
+
ORDER BY created_at DESC
|
|
32
|
+
LIMIT 1`, [normalized]);
|
|
33
|
+
const row = firstKnexRow(result);
|
|
34
|
+
if (!row?.id) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
return row;
|
|
38
|
+
}
|
|
39
|
+
async function findAnyAuthIdentityIdByEmail(scope, email) {
|
|
40
|
+
const knex = scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
|
|
41
|
+
const normalized = normalizeAuthEmail(email);
|
|
42
|
+
const result = await knex.raw(`SELECT pi.auth_identity_id
|
|
43
|
+
FROM provider_identity pi
|
|
44
|
+
WHERE lower(pi.entity_id) = lower(?)
|
|
45
|
+
ORDER BY pi.created_at DESC
|
|
46
|
+
LIMIT 1`, [normalized]);
|
|
47
|
+
const row = firstKnexRow(result);
|
|
48
|
+
return row?.auth_identity_id ?? null;
|
|
49
|
+
}
|
|
50
|
+
async function findAuthIdentityIdByEmail(scope, email) {
|
|
51
|
+
const knex = scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
|
|
52
|
+
const normalized = normalizeAuthEmail(email);
|
|
53
|
+
const result = await knex.raw(`SELECT pi.auth_identity_id
|
|
54
|
+
FROM provider_identity pi
|
|
55
|
+
WHERE lower(pi.entity_id) = lower(?)
|
|
56
|
+
AND pi.provider IN ('emailpass', 'emailotp')
|
|
57
|
+
ORDER BY pi.created_at DESC
|
|
58
|
+
LIMIT 1`, [normalized]);
|
|
59
|
+
const row = firstKnexRow(result);
|
|
60
|
+
return row?.auth_identity_id ?? null;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwtYXV0aC1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwaS9zdG9yZS9jdXN0b21lcnMvb3RwL3NoYXJlZC9lbWFpbC1hdXRoLWhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE0QkEsZ0RBRUM7QUFFRCxzREEwQkM7QUFFRCxvRUF1QkM7QUFFRCw4REF3QkM7QUE1R0QscURBQXFFO0FBVXJFLFNBQVMsWUFBWSxDQUNuQixNQUFtQztJQUVuQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDakMsSUFBSSxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3pFLE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDdkIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3RCLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNoRSxPQUFPLEtBQVUsQ0FBQTtRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRCxTQUFnQixrQkFBa0IsQ0FBQyxLQUFhO0lBQzlDLE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ25DLENBQUM7QUFFTSxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLEtBQXNCLEVBQ3RCLEtBQWE7SUFFYixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLGFBQWEsQ0FLakUsQ0FBQTtJQUVELE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FDM0I7Ozs7YUFJUyxFQUNULENBQUMsVUFBVSxDQUFDLENBQ2IsQ0FBQTtJQUVELE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBc0IsTUFBTSxDQUFDLENBQUE7SUFDckQsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNiLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFBO0FBQ1osQ0FBQztBQUVNLEtBQUssVUFBVSw0QkFBNEIsQ0FDaEQsS0FBc0IsRUFDdEIsS0FBYTtJQUViLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsYUFBYSxDQUtqRSxDQUFBO0lBRUQsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUMzQjs7OzthQUlTLEVBQ1QsQ0FBQyxVQUFVLENBQUMsQ0FDYixDQUFBO0lBRUQsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFnQyxNQUFNLENBQUMsQ0FBQTtJQUMvRCxPQUFPLEdBQUcsRUFBRSxnQkFBZ0IsSUFBSSxJQUFJLENBQUE7QUFDdEMsQ0FBQztBQUVNLEtBQUssVUFBVSx5QkFBeUIsQ0FDN0MsS0FBc0IsRUFDdEIsS0FBYTtJQUViLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsYUFBYSxDQUtqRSxDQUFBO0lBRUQsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUMzQjs7Ozs7YUFLUyxFQUNULENBQUMsVUFBVSxDQUFDLENBQ2IsQ0FBQTtJQUVELE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBZ0MsTUFBTSxDQUFDLENBQUE7SUFDL0QsT0FBTyxHQUFHLEVBQUUsZ0JBQWdCLElBQUksSUFBSSxDQUFBO0FBQ3RDLENBQUMifQ==
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.handleSendEmailAuthOtp = handleSendEmailAuthOtp;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const config_1 = require("../../../../../config");
|
|
9
|
+
const account_deletion_request_1 = require("../../../../../modules/account-deletion-request");
|
|
10
|
+
const send_email_auth_otp_workflow_1 = __importDefault(require("../../../../../workflows/send-email-auth-otp-workflow"));
|
|
11
|
+
const email_validation_1 = require("../../../../../utils/email-validation");
|
|
12
|
+
const email_auth_helpers_1 = require("./email-auth-helpers");
|
|
13
|
+
async function handleSendEmailAuthOtp(req, res, rawEmail) {
|
|
14
|
+
const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
15
|
+
const options = (0, config_1.resolveCustomerRegistrationOptions)(configModule);
|
|
16
|
+
if (!(0, config_1.isEmailOtpAuthEnabled)(options)) {
|
|
17
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Email OTP authentication is not enabled");
|
|
18
|
+
}
|
|
19
|
+
(0, email_validation_1.validateEmailFormat)(rawEmail);
|
|
20
|
+
const email = (0, email_auth_helpers_1.normalizeAuthEmail)(rawEmail);
|
|
21
|
+
const existingCustomer = await (0, email_auth_helpers_1.lookupCustomerByEmail)(req.scope, email);
|
|
22
|
+
const isNewUser = !existingCustomer?.has_account;
|
|
23
|
+
if (existingCustomer?.id) {
|
|
24
|
+
const accountDeletionService = req.scope.resolve(account_deletion_request_1.ACCOUNT_DELETION_REQUEST_MODULE);
|
|
25
|
+
if (await accountDeletionService.hasPendingRequest(existingCustomer.id)) {
|
|
26
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "This account has a pending deletion request");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const customerName = existingCustomer?.first_name ||
|
|
30
|
+
existingCustomer?.email ||
|
|
31
|
+
email;
|
|
32
|
+
const { result } = await (0, send_email_auth_otp_workflow_1.default)(req.scope).run({
|
|
33
|
+
input: {
|
|
34
|
+
email,
|
|
35
|
+
customer_id: existingCustomer?.id ?? null,
|
|
36
|
+
customer_name: customerName,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
res.status(200).json({
|
|
40
|
+
token: result.token,
|
|
41
|
+
expires_at: result.expires_at,
|
|
42
|
+
is_new_user: isNewUser,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLXNlbmQtZW1haWwtYXV0aC1vdHAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9vdHAvc2hhcmVkL2hhbmRsZS1zZW5kLWVtYWlsLWF1dGgtb3RwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBZ0JBLHdEQXNEQztBQXJFRCxxREFBa0Y7QUFDbEYsa0RBSThCO0FBQzlCLDhGQUFpRztBQUVqRyx5SEFBNEY7QUFDNUYsNEVBQTJFO0FBQzNFLDZEQUc2QjtBQUV0QixLQUFLLFVBQVUsc0JBQXNCLENBQzFDLEdBQWtCLEVBQ2xCLEdBQW1CLEVBQ25CLFFBQWdCO0lBRWhCLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQy9FLE1BQU0sT0FBTyxHQUFHLElBQUEsMkNBQWtDLEVBQ2hELFlBQWlDLENBQ2xDLENBQUE7SUFFRCxJQUFJLENBQUMsSUFBQSw4QkFBcUIsRUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQzdCLHlDQUF5QyxDQUMxQyxDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUEsc0NBQW1CLEVBQUMsUUFBUSxDQUFDLENBQUE7SUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBQSx1Q0FBa0IsRUFBQyxRQUFRLENBQUMsQ0FBQTtJQUUxQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBQSwwQ0FBcUIsRUFBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3RFLE1BQU0sU0FBUyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFBO0lBRWhELElBQUksZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDekIsTUFBTSxzQkFBc0IsR0FDMUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ2YsMERBQStCLENBQ2hDLENBQUE7UUFDSCxJQUFJLE1BQU0sc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN4RSxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUM3Qiw2Q0FBNkMsQ0FDOUMsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQ2hCLGdCQUFnQixFQUFFLFVBQVU7UUFDNUIsZ0JBQWdCLEVBQUUsS0FBSztRQUN2QixLQUFLLENBQUE7SUFFUCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLHNDQUF3QixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDL0QsS0FBSyxFQUFFO1lBQ0wsS0FBSztZQUNMLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLElBQUksSUFBSTtZQUN6QyxhQUFhLEVBQUUsWUFBWTtTQUM1QjtLQUNGLENBQUMsQ0FBQTtJQUVGLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25CLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztRQUNuQixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7UUFDN0IsV0FBVyxFQUFFLFNBQVM7S0FDdkIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyJ9
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.handleSendPhoneAuthOtp = handleSendPhoneAuthOtp;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const config_1 = require("../../../../../config");
|
|
9
|
+
const account_deletion_request_1 = require("../../../../../modules/account-deletion-request");
|
|
10
|
+
const send_phone_auth_otp_workflow_1 = __importDefault(require("../../../../../workflows/send-phone-auth-otp-workflow"));
|
|
11
|
+
const phone_validation_1 = require("../../../../../utils/phone-validation");
|
|
12
|
+
const phone_auth_helpers_1 = require("./phone-auth-helpers");
|
|
13
|
+
async function handleSendPhoneAuthOtp(req, res, rawPhone) {
|
|
14
|
+
const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
15
|
+
const options = (0, config_1.resolveCustomerRegistrationOptions)(configModule);
|
|
16
|
+
if (!(0, config_1.isPhoneOtpAuthEnabled)(options)) {
|
|
17
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Phone OTP authentication is not enabled");
|
|
18
|
+
}
|
|
19
|
+
(0, phone_validation_1.validatePhoneFormat)(rawPhone);
|
|
20
|
+
const phone = (0, phone_auth_helpers_1.normalizeAuthPhone)(rawPhone);
|
|
21
|
+
const existingCustomer = await (0, phone_auth_helpers_1.lookupCustomerByPhone)(req.scope, phone);
|
|
22
|
+
const isNewUser = !existingCustomer?.has_account;
|
|
23
|
+
if (existingCustomer?.id) {
|
|
24
|
+
const accountDeletionService = req.scope.resolve(account_deletion_request_1.ACCOUNT_DELETION_REQUEST_MODULE);
|
|
25
|
+
if (await accountDeletionService.hasPendingRequest(existingCustomer.id)) {
|
|
26
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "This account has a pending deletion request");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const customerName = existingCustomer?.first_name ||
|
|
30
|
+
existingCustomer?.phone ||
|
|
31
|
+
phone;
|
|
32
|
+
const { result } = await (0, send_phone_auth_otp_workflow_1.default)(req.scope).run({
|
|
33
|
+
input: {
|
|
34
|
+
phone,
|
|
35
|
+
customer_id: existingCustomer?.id ?? null,
|
|
36
|
+
customer_name: customerName,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
res.status(200).json({
|
|
40
|
+
token: result.token,
|
|
41
|
+
expires_at: result.expires_at,
|
|
42
|
+
is_new_user: isNewUser,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLXNlbmQtcGhvbmUtYXV0aC1vdHAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9vdHAvc2hhcmVkL2hhbmRsZS1zZW5kLXBob25lLWF1dGgtb3RwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBZ0JBLHdEQXNEQztBQXJFRCxxREFBa0Y7QUFDbEYsa0RBSThCO0FBQzlCLDhGQUFpRztBQUVqRyx5SEFBNEY7QUFDNUYsNEVBQTJFO0FBQzNFLDZEQUc2QjtBQUV0QixLQUFLLFVBQVUsc0JBQXNCLENBQzFDLEdBQWtCLEVBQ2xCLEdBQW1CLEVBQ25CLFFBQWdCO0lBRWhCLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQy9FLE1BQU0sT0FBTyxHQUFHLElBQUEsMkNBQWtDLEVBQ2hELFlBQWlDLENBQ2xDLENBQUE7SUFFRCxJQUFJLENBQUMsSUFBQSw4QkFBcUIsRUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQzdCLHlDQUF5QyxDQUMxQyxDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUEsc0NBQW1CLEVBQUMsUUFBUSxDQUFDLENBQUE7SUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBQSx1Q0FBa0IsRUFBQyxRQUFRLENBQUMsQ0FBQTtJQUUxQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBQSwwQ0FBcUIsRUFBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3RFLE1BQU0sU0FBUyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFBO0lBRWhELElBQUksZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDekIsTUFBTSxzQkFBc0IsR0FDMUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ2YsMERBQStCLENBQ2hDLENBQUE7UUFDSCxJQUFJLE1BQU0sc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN4RSxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUM3Qiw2Q0FBNkMsQ0FDOUMsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQ2hCLGdCQUFnQixFQUFFLFVBQVU7UUFDNUIsZ0JBQWdCLEVBQUUsS0FBSztRQUN2QixLQUFLLENBQUE7SUFFUCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLHNDQUF3QixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDL0QsS0FBSyxFQUFFO1lBQ0wsS0FBSztZQUNMLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLElBQUksSUFBSTtZQUN6QyxhQUFhLEVBQUUsWUFBWTtTQUM1QjtLQUNGLENBQUMsQ0FBQTtJQUVGLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25CLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztRQUNuQixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7UUFDN0IsV0FBVyxFQUFFLFNBQVM7S0FDdkIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyJ9
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.handleVerifyEmailAuthOtp = handleVerifyEmailAuthOtp;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const config_1 = require("../../../../../config");
|
|
9
|
+
const otp_verification_1 = require("../../../../../modules/otp-verification");
|
|
10
|
+
const verify_email_auth_otp_workflow_1 = __importDefault(require("../../../../../workflows/verify-email-auth-otp-workflow"));
|
|
11
|
+
const complete_customer_login_1 = require("../../../../auth/customer/shared/complete-customer-login");
|
|
12
|
+
const referral_code_1 = require("../../shared/referral-code");
|
|
13
|
+
async function handleVerifyEmailAuthOtp(req, res, body) {
|
|
14
|
+
const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
15
|
+
const config = configModule;
|
|
16
|
+
const options = (0, config_1.resolveCustomerRegistrationOptions)(config);
|
|
17
|
+
if (!(0, config_1.isEmailOtpAuthEnabled)(options)) {
|
|
18
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Email OTP authentication is not enabled");
|
|
19
|
+
}
|
|
20
|
+
if (!body?.token) {
|
|
21
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "token is required");
|
|
22
|
+
}
|
|
23
|
+
if (!body?.code) {
|
|
24
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "code is required");
|
|
25
|
+
}
|
|
26
|
+
await (0, referral_code_1.assertReferralCodeReferrerExists)(req);
|
|
27
|
+
const jwtSecret = config.projectConfig?.http?.jwtSecret || "supersecret";
|
|
28
|
+
const otpService = req.scope.resolve(otp_verification_1.OTP_VERIFICATION_MODULE);
|
|
29
|
+
const verifyResult = await otpService.verifyEmailAuthOtp({ token: body.token, code: body.code }, jwtSecret);
|
|
30
|
+
const { result } = await (0, verify_email_auth_otp_workflow_1.default)(req.scope).run({
|
|
31
|
+
input: {
|
|
32
|
+
email: verifyResult.email,
|
|
33
|
+
customer_id: verifyResult.customer_id,
|
|
34
|
+
first_name: body.first_name,
|
|
35
|
+
last_name: body.last_name,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
const customerId = typeof result.customer.id === "string" ? result.customer.id : "";
|
|
39
|
+
if (!customerId) {
|
|
40
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Customer id missing after email OTP verification");
|
|
41
|
+
}
|
|
42
|
+
if (result.is_new_user) {
|
|
43
|
+
await (0, referral_code_1.maybeCreateReferralLinkFromRequest)(req, customerId);
|
|
44
|
+
}
|
|
45
|
+
const token = await (0, complete_customer_login_1.issueCustomerJwtToken)(req, config, result.auth_identity, customerId);
|
|
46
|
+
res.status(200).json({
|
|
47
|
+
verified: true,
|
|
48
|
+
customer: result.customer,
|
|
49
|
+
is_new_user: result.is_new_user,
|
|
50
|
+
token,
|
|
51
|
+
needs_login: false,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLXZlcmlmeS1lbWFpbC1hdXRoLW90cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvc3RvcmUvY3VzdG9tZXJzL290cC9zaGFyZWQvaGFuZGxlLXZlcmlmeS1lbWFpbC1hdXRoLW90cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQTJCQSw0REEyRUM7QUFyR0QscURBQWtGO0FBQ2xGLGtEQUk4QjtBQUM5Qiw4RUFBaUY7QUFFakYsNkhBQWdHO0FBQ2hHLHNHQUdpRTtBQUNqRSw4REFHbUM7QUFVNUIsS0FBSyxVQUFVLHdCQUF3QixDQUM1QyxHQUFrQixFQUNsQixHQUFtQixFQUNuQixJQUE0QjtJQUU1QixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUMvRSxNQUFNLE1BQU0sR0FBRyxZQUFzRCxDQUFBO0lBQ3JFLE1BQU0sT0FBTyxHQUFHLElBQUEsMkNBQWtDLEVBQUMsTUFBTSxDQUFDLENBQUE7SUFFMUQsSUFBSSxDQUFDLElBQUEsOEJBQXFCLEVBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUM3Qix5Q0FBeUMsQ0FDMUMsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxtQkFBVyxDQUFDLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFBO0lBQzVFLENBQUM7SUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxtQkFBVyxDQUFDLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBQzNFLENBQUM7SUFFRCxNQUFNLElBQUEsZ0RBQWdDLEVBQUMsR0FBRyxDQUFDLENBQUE7SUFFM0MsTUFBTSxTQUFTLEdBQ1osTUFBTSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsU0FBZ0MsSUFBSSxhQUFhLENBQUE7SUFFaEYsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ2xDLDBDQUF1QixDQUN4QixDQUFBO0lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxVQUFVLENBQUMsa0JBQWtCLENBQ3RELEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFDdEMsU0FBUyxDQUNWLENBQUE7SUFFRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLHdDQUEwQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDakUsS0FBSyxFQUFFO1lBQ0wsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLO1lBQ3pCLFdBQVcsRUFBRSxZQUFZLENBQUMsV0FBVztZQUNyQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzFCO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsTUFBTSxVQUFVLEdBQ2QsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFFbEUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsa0RBQWtELENBQ25ELENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFBLGtEQUFrQyxFQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUMzRCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFBLCtDQUFxQixFQUN2QyxHQUFHLEVBQ0gsTUFBTSxFQUNOLE1BQU0sQ0FBQyxhQUFhLEVBQ3BCLFVBQVUsQ0FDWCxDQUFBO0lBRUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbkIsUUFBUSxFQUFFLElBQUk7UUFDZCxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7UUFDekIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1FBQy9CLEtBQUs7UUFDTCxXQUFXLEVBQUUsS0FBSztLQUNuQixDQUFDLENBQUE7QUFDSixDQUFDIn0=
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.handleVerifyPhoneAuthOtp = handleVerifyPhoneAuthOtp;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const config_1 = require("../../../../../config");
|
|
9
|
+
const otp_verification_1 = require("../../../../../modules/otp-verification");
|
|
10
|
+
const verify_phone_auth_otp_workflow_1 = __importDefault(require("../../../../../workflows/verify-phone-auth-otp-workflow"));
|
|
11
|
+
const complete_customer_login_1 = require("../../../../auth/customer/shared/complete-customer-login");
|
|
12
|
+
const referral_code_1 = require("../../shared/referral-code");
|
|
13
|
+
async function handleVerifyPhoneAuthOtp(req, res, body) {
|
|
14
|
+
const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
15
|
+
const config = configModule;
|
|
16
|
+
const options = (0, config_1.resolveCustomerRegistrationOptions)(config);
|
|
17
|
+
if (!(0, config_1.isPhoneOtpAuthEnabled)(options)) {
|
|
18
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Phone OTP authentication is not enabled");
|
|
19
|
+
}
|
|
20
|
+
if (!body?.token) {
|
|
21
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "token is required");
|
|
22
|
+
}
|
|
23
|
+
if (!body?.code) {
|
|
24
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "code is required");
|
|
25
|
+
}
|
|
26
|
+
await (0, referral_code_1.assertReferralCodeReferrerExists)(req);
|
|
27
|
+
const jwtSecret = config.projectConfig?.http?.jwtSecret || "supersecret";
|
|
28
|
+
const otpService = req.scope.resolve(otp_verification_1.OTP_VERIFICATION_MODULE);
|
|
29
|
+
const verifyResult = await otpService.verifyPhoneAuthOtp({ token: body.token, code: body.code }, jwtSecret);
|
|
30
|
+
const { result } = await (0, verify_phone_auth_otp_workflow_1.default)(req.scope).run({
|
|
31
|
+
input: {
|
|
32
|
+
phone: verifyResult.phone,
|
|
33
|
+
customer_id: verifyResult.customer_id,
|
|
34
|
+
first_name: body.first_name,
|
|
35
|
+
last_name: body.last_name,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
const customerId = typeof result.customer.id === "string" ? result.customer.id : "";
|
|
39
|
+
if (!customerId) {
|
|
40
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Customer id missing after phone OTP verification");
|
|
41
|
+
}
|
|
42
|
+
if (result.is_new_user) {
|
|
43
|
+
await (0, referral_code_1.maybeCreateReferralLinkFromRequest)(req, customerId);
|
|
44
|
+
}
|
|
45
|
+
const token = await (0, complete_customer_login_1.issueCustomerJwtToken)(req, config, result.auth_identity, customerId);
|
|
46
|
+
res.status(200).json({
|
|
47
|
+
verified: true,
|
|
48
|
+
customer: result.customer,
|
|
49
|
+
is_new_user: result.is_new_user,
|
|
50
|
+
token,
|
|
51
|
+
needs_login: false,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLXZlcmlmeS1waG9uZS1hdXRoLW90cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvc3RvcmUvY3VzdG9tZXJzL290cC9zaGFyZWQvaGFuZGxlLXZlcmlmeS1waG9uZS1hdXRoLW90cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQTJCQSw0REEyRUM7QUFyR0QscURBQWtGO0FBQ2xGLGtEQUk4QjtBQUM5Qiw4RUFBaUY7QUFFakYsNkhBQWdHO0FBQ2hHLHNHQUdpRTtBQUNqRSw4REFHbUM7QUFVNUIsS0FBSyxVQUFVLHdCQUF3QixDQUM1QyxHQUFrQixFQUNsQixHQUFtQixFQUNuQixJQUE0QjtJQUU1QixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUMvRSxNQUFNLE1BQU0sR0FBRyxZQUFzRCxDQUFBO0lBQ3JFLE1BQU0sT0FBTyxHQUFHLElBQUEsMkNBQWtDLEVBQUMsTUFBTSxDQUFDLENBQUE7SUFFMUQsSUFBSSxDQUFDLElBQUEsOEJBQXFCLEVBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUM3Qix5Q0FBeUMsQ0FDMUMsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxtQkFBVyxDQUFDLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFBO0lBQzVFLENBQUM7SUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxtQkFBVyxDQUFDLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBQzNFLENBQUM7SUFFRCxNQUFNLElBQUEsZ0RBQWdDLEVBQUMsR0FBRyxDQUFDLENBQUE7SUFFM0MsTUFBTSxTQUFTLEdBQ1osTUFBTSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsU0FBZ0MsSUFBSSxhQUFhLENBQUE7SUFFaEYsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ2xDLDBDQUF1QixDQUN4QixDQUFBO0lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxVQUFVLENBQUMsa0JBQWtCLENBQ3RELEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFDdEMsU0FBUyxDQUNWLENBQUE7SUFFRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLHdDQUEwQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDakUsS0FBSyxFQUFFO1lBQ0wsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLO1lBQ3pCLFdBQVcsRUFBRSxZQUFZLENBQUMsV0FBVztZQUNyQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzFCO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsTUFBTSxVQUFVLEdBQ2QsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFFbEUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsa0RBQWtELENBQ25ELENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFBLGtEQUFrQyxFQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUMzRCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFBLCtDQUFxQixFQUN2QyxHQUFHLEVBQ0gsTUFBTSxFQUNOLE1BQU0sQ0FBQyxhQUFhLEVBQ3BCLFVBQVUsQ0FDWCxDQUFBO0lBRUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbkIsUUFBUSxFQUFFLElBQUk7UUFDZCxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7UUFDekIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1FBQy9CLEtBQUs7UUFDTCxXQUFXLEVBQUUsS0FBSztLQUNuQixDQUFDLENBQUE7QUFDSixDQUFDIn0=
|
|
@@ -60,4 +60,4 @@ async function findAuthIdentityIdByPhone(scope, phone) {
|
|
|
60
60
|
const row = firstKnexRow(result);
|
|
61
61
|
return row?.auth_identity_id ?? null;
|
|
62
62
|
}
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtYXV0aC1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwaS9zdG9yZS9jdXN0b21lcnMvb3RwL3NoYXJlZC9waG9uZS1hdXRoLWhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4QkEsZ0RBRUM7QUFFRCxzREEwQkM7QUFFRCxvRUF1QkM7QUFFRCw4REF3QkM7QUE5R0QscURBQXFFO0FBQ3JFLDRFQUE0RTtBQVc1RSxTQUFTLFlBQVksQ0FDbkIsTUFBbUM7SUFFbkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pDLElBQUksUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN6RSxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3ZCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN0QixJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEUsT0FBTyxLQUFVLENBQUE7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsS0FBYTtJQUM5QyxPQUFPLElBQUEsdUNBQW9CLEVBQUMsS0FBSyxDQUFDLENBQUE7QUFDcEMsQ0FBQztBQUVNLEtBQUssVUFBVSxxQkFBcUIsQ0FDekMsS0FBc0IsRUFDdEIsS0FBYTtJQUViLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsYUFBYSxDQUtqRSxDQUFBO0lBRUQsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUMzQjs7OzthQUlTLEVBQ1QsQ0FBQyxVQUFVLENBQUMsQ0FDYixDQUFBO0lBRUQsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFzQixNQUFNLENBQUMsQ0FBQTtJQUNyRCxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2IsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUE7QUFDWixDQUFDO0FBRU0sS0FBSyxVQUFVLDRCQUE0QixDQUNoRCxLQUFzQixFQUN0QixLQUFhO0lBRWIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxhQUFhLENBS2pFLENBQUE7SUFFRCxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQzNCOzs7O2FBSVMsRUFDVCxDQUFDLFVBQVUsQ0FBQyxDQUNiLENBQUE7SUFFRCxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQWdDLE1BQU0sQ0FBQyxDQUFBO0lBQy9ELE9BQU8sR0FBRyxFQUFFLGdCQUFnQixJQUFJLElBQUksQ0FBQTtBQUN0QyxDQUFDO0FBRU0sS0FBSyxVQUFVLHlCQUF5QixDQUM3QyxLQUFzQixFQUN0QixLQUFhO0lBRWIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxhQUFhLENBS2pFLENBQUE7SUFFRCxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQzNCOzs7OzthQUtTLEVBQ1QsQ0FBQyxVQUFVLENBQUMsQ0FDYixDQUFBO0lBRUQsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFnQyxNQUFNLENBQUMsQ0FBQTtJQUMvRCxPQUFPLEdBQUcsRUFBRSxnQkFBZ0IsSUFBSSxJQUFJLENBQUE7QUFDdEMsQ0FBQyJ9
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.resolveOtpTokenPurpose = resolveOtpTokenPurpose;
|
|
7
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
9
|
+
const otp_verification_1 = require("../../../../../modules/otp-verification/models/otp-verification");
|
|
10
|
+
function resolveOtpTokenPurpose(token, jwtSecret) {
|
|
11
|
+
try {
|
|
12
|
+
const decoded = jsonwebtoken_1.default.verify(token, jwtSecret);
|
|
13
|
+
const type = decoded.type;
|
|
14
|
+
if (typeof type !== "string" ||
|
|
15
|
+
!Object.values(otp_verification_1.OtpPurpose).includes(type)) {
|
|
16
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid token format.");
|
|
17
|
+
}
|
|
18
|
+
return type;
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (error instanceof utils_1.MedusaError) {
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid or expired token. Please request a new OTP.");
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1vdHAtdG9rZW4tcHVycG9zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvc3RvcmUvY3VzdG9tZXJzL290cC9zaGFyZWQvcmVzb2x2ZS1vdHAtdG9rZW4tcHVycG9zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUlBLHdEQTZCQztBQWpDRCxnRUFBOEI7QUFDOUIscURBQXVEO0FBQ3ZELHNHQUE0RjtBQUU1RixTQUFnQixzQkFBc0IsQ0FDcEMsS0FBYSxFQUNiLFNBQWlCO0lBRWpCLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLHNCQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQTRCLENBQUE7UUFDdkUsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQTtRQUV6QixJQUNFLE9BQU8sSUFBSSxLQUFLLFFBQVE7WUFDeEIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLDZCQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBa0IsQ0FBQyxFQUN2RCxDQUFDO1lBQ0QsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsdUJBQXVCLENBQ3hCLENBQUE7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFrQixDQUFBO0lBQzNCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxLQUFLLFlBQVksbUJBQVcsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sS0FBSyxDQUFBO1FBQ2IsQ0FBQztRQUVELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHFEQUFxRCxDQUN0RCxDQUFBO0lBQ0gsQ0FBQztBQUNILENBQUMifQ==
|
|
@@ -11,27 +11,35 @@ const otp_verification_2 = require("../../../../../modules/otp-verification/mode
|
|
|
11
11
|
const verify_email_1 = __importDefault(require("../../../../../workflows/verify-email"));
|
|
12
12
|
const verify_phone_1 = __importDefault(require("../../../../../workflows/verify-phone"));
|
|
13
13
|
const config_1 = require("../../../../../config");
|
|
14
|
+
const handle_verify_email_auth_otp_1 = require("../shared/handle-verify-email-auth-otp");
|
|
15
|
+
const handle_verify_phone_auth_otp_1 = require("../shared/handle-verify-phone-auth-otp");
|
|
16
|
+
const resolve_otp_token_purpose_1 = require("../shared/resolve-otp-token-purpose");
|
|
17
|
+
function customerIdFromRecord(customer) {
|
|
18
|
+
const id = customer.id;
|
|
19
|
+
return typeof id === "string" ? id : "";
|
|
20
|
+
}
|
|
14
21
|
const POST = async (req, res) => {
|
|
15
|
-
const
|
|
22
|
+
const body = (req.body ?? {});
|
|
23
|
+
const { token, code } = body;
|
|
16
24
|
if (!token) {
|
|
17
25
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Token is required");
|
|
18
26
|
}
|
|
19
27
|
if (!code) {
|
|
20
28
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "OTP code is required");
|
|
21
29
|
}
|
|
22
|
-
// Get OTP service from module
|
|
23
|
-
const otpService = req.scope.resolve(otp_verification_1.OTP_VERIFICATION_MODULE);
|
|
24
|
-
// Get JWT secret from config
|
|
25
30
|
const config = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
26
31
|
const { http } = config.projectConfig;
|
|
27
32
|
const jwtSecret = http?.jwtSecret || "supersecret";
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
const purpose = (0, resolve_otp_token_purpose_1.resolveOtpTokenPurpose)(token, jwtSecret);
|
|
34
|
+
if (purpose === otp_verification_2.OtpPurpose.EMAIL_AUTH) {
|
|
35
|
+
return (0, handle_verify_email_auth_otp_1.handleVerifyEmailAuthOtp)(req, res, body);
|
|
36
|
+
}
|
|
37
|
+
if (purpose === otp_verification_2.OtpPurpose.PHONE_AUTH) {
|
|
38
|
+
return (0, handle_verify_phone_auth_otp_1.handleVerifyPhoneAuthOtp)(req, res, body);
|
|
39
|
+
}
|
|
40
|
+
const otpService = req.scope.resolve(otp_verification_1.OTP_VERIFICATION_MODULE);
|
|
41
|
+
const verifyResult = await otpService.verifyOtp({ token, code }, jwtSecret);
|
|
33
42
|
const loginOptions = (0, config_1.resolveCustomerRegistrationOptions)(config);
|
|
34
|
-
// Execute workflow based on type
|
|
35
43
|
let result;
|
|
36
44
|
if (verifyResult.type === otp_verification_2.OtpPurpose.EMAIL_VERIFICATION) {
|
|
37
45
|
const { result: workflowResult } = await (0, verify_email_1.default)(req.scope).run({
|
|
@@ -61,17 +69,14 @@ const POST = async (req, res) => {
|
|
|
61
69
|
else {
|
|
62
70
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid verification type");
|
|
63
71
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
// either provider without a separate registration step.
|
|
67
|
-
await ensureComplementaryAuthIdentity(result.customer?.id ?? "", result.customer ?? {}, verifyResult.type, loginOptions.login.identifier, req.scope).catch(() => {
|
|
72
|
+
const customerId = customerIdFromRecord(result.customer);
|
|
73
|
+
await ensureComplementaryAuthIdentity(customerId, result.customer, verifyResult.type, loginOptions.login.identifier, req.scope).catch(() => {
|
|
68
74
|
// Non-fatal — customer can still log in with their original provider.
|
|
69
|
-
// The next successful OTP verification will retry.
|
|
70
75
|
});
|
|
71
76
|
let loginToken;
|
|
72
77
|
try {
|
|
73
78
|
const knex = req.scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
|
|
74
|
-
const authRow = await knex.raw(`SELECT id FROM auth_identity WHERE app_metadata->>'customer_id' = ? LIMIT 1`, [
|
|
79
|
+
const authRow = await knex.raw(`SELECT id FROM auth_identity WHERE app_metadata->>'customer_id' = ? LIMIT 1`, [customerId]);
|
|
75
80
|
const authIdentityId = (authRow.rows?.[0] ?? authRow[0]?.[0])?.id;
|
|
76
81
|
if (authIdentityId && jwtSecret) {
|
|
77
82
|
const authService = req.scope.resolve(utils_1.Modules.AUTH);
|
|
@@ -93,11 +98,6 @@ exports.POST = POST;
|
|
|
93
98
|
* When `login.identifier` is "both", a customer who registered with one
|
|
94
99
|
* provider (emailpass or phonepass) needs the complementary provider identity
|
|
95
100
|
* created so both login methods work.
|
|
96
|
-
*
|
|
97
|
-
* Strategy: attach a new provider_identity to the EXISTING auth identity
|
|
98
|
-
* (rather than creating a second auth identity) and copy the scrypt password
|
|
99
|
-
* hash. Both emailpass and phonepass use the same scrypt-kdf format, so the
|
|
100
|
-
* hash is portable between them as long as this plugin controls both providers.
|
|
101
101
|
*/
|
|
102
102
|
async function ensureComplementaryAuthIdentity(customerId, customer, otpType, loginIdentifier, scope) {
|
|
103
103
|
if (loginIdentifier !== "both")
|
|
@@ -106,19 +106,15 @@ async function ensureComplementaryAuthIdentity(customerId, customer, otpType, lo
|
|
|
106
106
|
return;
|
|
107
107
|
const knex = scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
|
|
108
108
|
const authService = scope.resolve(utils_1.Modules.AUTH);
|
|
109
|
-
// Find the customer's primary auth identity ID (used as the anchor for the
|
|
110
|
-
// new provider identity).
|
|
111
109
|
const authRow = await knex.raw(`SELECT id FROM auth_identity WHERE app_metadata->>'customer_id' = ? LIMIT 1`, [customerId]);
|
|
112
110
|
const authIdentityId = (authRow.rows?.[0] ?? authRow[0]?.[0])?.id;
|
|
113
111
|
if (!authIdentityId)
|
|
114
112
|
return;
|
|
115
113
|
if (otpType === otp_verification_2.OtpPurpose.PHONE_VERIFICATION && customer.phone) {
|
|
116
|
-
// Check if phonepass provider identity already exists for this customer.
|
|
117
114
|
const existing = await knex.raw(`SELECT pi.id FROM provider_identity pi
|
|
118
115
|
WHERE pi.auth_identity_id = ? AND pi.provider = 'phonepass' LIMIT 1`, [authIdentityId]);
|
|
119
116
|
if (existing.rows?.[0] ?? existing[0]?.[0])
|
|
120
117
|
return;
|
|
121
|
-
// Copy password hash from emailpass identity (same scrypt format).
|
|
122
118
|
const hashRow = await knex.raw(`SELECT pi.provider_metadata FROM provider_identity pi
|
|
123
119
|
WHERE pi.auth_identity_id = ? AND pi.provider = 'emailpass' LIMIT 1`, [authIdentityId]);
|
|
124
120
|
const hash = (hashRow.rows?.[0] ?? hashRow[0]?.[0])?.provider_metadata?.password;
|
|
@@ -132,12 +128,10 @@ async function ensureComplementaryAuthIdentity(customerId, customer, otpType, lo
|
|
|
132
128
|
});
|
|
133
129
|
}
|
|
134
130
|
if (otpType === otp_verification_2.OtpPurpose.EMAIL_VERIFICATION && customer.email) {
|
|
135
|
-
// Check if emailpass provider identity already exists.
|
|
136
131
|
const existing = await knex.raw(`SELECT pi.id FROM provider_identity pi
|
|
137
132
|
WHERE pi.auth_identity_id = ? AND pi.provider = 'emailpass' LIMIT 1`, [authIdentityId]);
|
|
138
133
|
if (existing.rows?.[0] ?? existing[0]?.[0])
|
|
139
134
|
return;
|
|
140
|
-
// Copy password hash from phonepass identity.
|
|
141
135
|
const hashRow = await knex.raw(`SELECT pi.provider_metadata FROM provider_identity pi
|
|
142
136
|
WHERE pi.auth_identity_id = ? AND pi.provider = 'phonepass' LIMIT 1`, [authIdentityId]);
|
|
143
137
|
const hash = (hashRow.rows?.[0] ?? hashRow[0]?.[0])?.provider_metadata?.password;
|
|
@@ -151,4 +145,4 @@ async function ensureComplementaryAuthIdentity(customerId, customer, otpType, lo
|
|
|
151
145
|
});
|
|
152
146
|
}
|
|
153
147
|
}
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9vdHAvdmVyaWZ5L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLHFEQUlrQztBQUNsQywyRkFBb0c7QUFDcEcsOEVBQWlGO0FBRWpGLHNHQUE0RjtBQUM1Rix5RkFBdUU7QUFDdkUseUZBQXVFO0FBQ3ZFLGtEQUc4QjtBQUM5Qix5RkFBaUY7QUFDakYseUZBQWlGO0FBQ2pGLG1GQUE0RTtBQVM1RSxTQUFTLG9CQUFvQixDQUFDLFFBQWlDO0lBQzdELE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUE7SUFDdEIsT0FBTyxPQUFPLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0FBQ3pDLENBQUM7QUFFTSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FNM0IsQ0FBQTtJQUVELE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFBO0lBRTVCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG1CQUFtQixDQUNwQixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHNCQUFzQixDQUN2QixDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlD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
|
|
@@ -5,6 +5,7 @@ const utils_1 = require("@medusajs/framework/utils");
|
|
|
5
5
|
const core_flows_1 = require("@medusajs/core-flows");
|
|
6
6
|
const config_1 = require("../../../config");
|
|
7
7
|
const is_social_pending_customer_registration_1 = require("./shared/is-social-pending-customer-registration");
|
|
8
|
+
const create_phone_only_customer_1 = require("./shared/create-phone-only-customer");
|
|
8
9
|
const referral_code_1 = require("./shared/referral-code");
|
|
9
10
|
/** Medusa / Knex raw results may use `rows` (node-pg) or `result[0]` batch shape. */
|
|
10
11
|
function firstKnexRow(result) {
|
|
@@ -98,25 +99,20 @@ const POST = async (req, res) => {
|
|
|
98
99
|
const customer = await refetchCustomer(result.id, req.scope);
|
|
99
100
|
return res.status(200).json({ customer });
|
|
100
101
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
phone: phoneNormalized,
|
|
107
|
-
has_account: !!authIdentityId,
|
|
108
|
-
},
|
|
109
|
-
]);
|
|
110
|
-
// Link the auth identity to the new customer (same as setAuthAppMetadataStep)
|
|
102
|
+
const created = await (0, create_phone_only_customer_1.createPhoneOnlyCustomer)(req.scope, {
|
|
103
|
+
...customerDataForCreate,
|
|
104
|
+
phone: phoneNormalized,
|
|
105
|
+
has_account: !!authIdentityId,
|
|
106
|
+
});
|
|
111
107
|
if (authIdentityId) {
|
|
112
108
|
const authService = req.scope.resolve(utils_1.Modules.AUTH);
|
|
113
109
|
await authService.updateAuthIdentities({
|
|
114
110
|
id: authIdentityId,
|
|
115
|
-
app_metadata: { customer_id:
|
|
111
|
+
app_metadata: { customer_id: created.id },
|
|
116
112
|
});
|
|
117
113
|
}
|
|
118
|
-
await (0, referral_code_1.maybeCreateReferralLinkFromRequest)(req,
|
|
119
|
-
const fullCustomer = await refetchCustomer(
|
|
114
|
+
await (0, referral_code_1.maybeCreateReferralLinkFromRequest)(req, created.id);
|
|
115
|
+
const fullCustomer = await refetchCustomer(created.id, req.scope);
|
|
120
116
|
return res.status(200).json({ customer: fullCustomer });
|
|
121
117
|
};
|
|
122
118
|
exports.POST = POST;
|
|
@@ -140,4 +136,4 @@ async function refetchCustomer(customerId, scope) {
|
|
|
140
136
|
const customers = await remoteQuery(queryObject);
|
|
141
137
|
return customers[0];
|
|
142
138
|
}
|
|
143
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxxREFLa0M7QUFDbEMscURBQW9FO0FBQ3BFLDRDQUd3QjtBQUN4Qiw4R0FBc0c7QUFDdEcsb0ZBQTZFO0FBQzdFLDBEQUcrQjtBQUUvQixxRkFBcUY7QUFDckYsU0FBUyxZQUFZLENBQ25CLE1BQW1DO0lBRW5DLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNqQyxJQUFJLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDekUsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN2QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdEIsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hFLE9BQU8sS0FBVSxDQUFBO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0ksTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ3BFLE1BQU0sV0FBVyxHQUNmLEdBR0QsQ0FBQyxZQUFZLENBQUE7SUFFZCxJQUFJLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FB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
|
package/.medusa/server/src/api/store/customers/shared/__tests__/create-phone-only-customer.test.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const vitest_1 = require("vitest");
|
|
5
|
+
const create_phone_only_customer_1 = require("../create-phone-only-customer");
|
|
6
|
+
(0, vitest_1.describe)("createPhoneOnlyCustomer table-driven tests", () => {
|
|
7
|
+
const cases = [
|
|
8
|
+
{
|
|
9
|
+
title: "rejects empty phone",
|
|
10
|
+
input: { phone: " " },
|
|
11
|
+
shouldThrow: true,
|
|
12
|
+
errorType: utils_1.MedusaError.Types.INVALID_DATA,
|
|
13
|
+
errorMessage: "Phone is required",
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
title: "rejects duplicate registered phone",
|
|
17
|
+
input: { phone: "+15551234567", has_account: true },
|
|
18
|
+
existingAccountId: "cus_existing",
|
|
19
|
+
shouldThrow: true,
|
|
20
|
+
errorType: utils_1.MedusaError.Types.DUPLICATE_ERROR,
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
title: "creates customer with phone only",
|
|
24
|
+
input: { phone: "+15559876543", has_account: true, first_name: "A" },
|
|
25
|
+
createdId: "cus_new",
|
|
26
|
+
shouldThrow: false,
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
vitest_1.it.each(cases)("$title", async ({ input, existingAccountId, createdId, shouldThrow, errorType, errorMessage, }) => {
|
|
30
|
+
const createCustomers = vitest_1.vi.fn().mockResolvedValue([
|
|
31
|
+
{ id: createdId ?? "cus_new", phone: input.phone },
|
|
32
|
+
]);
|
|
33
|
+
const scope = {
|
|
34
|
+
resolve: (token) => {
|
|
35
|
+
if (String(token).includes("pg_connection")) {
|
|
36
|
+
return {
|
|
37
|
+
raw: vitest_1.vi.fn().mockResolvedValue({
|
|
38
|
+
rows: existingAccountId ? [{ id: existingAccountId }] : [],
|
|
39
|
+
}),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (String(token).includes("customer")) {
|
|
43
|
+
return { createCustomers };
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
const exec = () => (0, create_phone_only_customer_1.createPhoneOnlyCustomer)(scope, input);
|
|
49
|
+
if (shouldThrow) {
|
|
50
|
+
await (0, vitest_1.expect)(exec()).rejects.toMatchObject({ type: errorType });
|
|
51
|
+
if (errorMessage) {
|
|
52
|
+
await (0, vitest_1.expect)(exec()).rejects.toThrow(errorMessage);
|
|
53
|
+
}
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const customer = await exec();
|
|
57
|
+
(0, vitest_1.expect)(customer.id).toBe(createdId);
|
|
58
|
+
(0, vitest_1.expect)(createCustomers).toHaveBeenCalledWith([
|
|
59
|
+
vitest_1.expect.objectContaining({
|
|
60
|
+
phone: input.phone,
|
|
61
|
+
has_account: true,
|
|
62
|
+
first_name: "A",
|
|
63
|
+
}),
|
|
64
|
+
]);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBob25lLW9ubHktY3VzdG9tZXIudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvc3RvcmUvY3VzdG9tZXJzL3NoYXJlZC9fX3Rlc3RzX18vY3JlYXRlLXBob25lLW9ubHktY3VzdG9tZXIudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFEQUF1RDtBQUN2RCxtQ0FBaUQ7QUFDakQsOEVBQXVFO0FBWXZFLElBQUEsaUJBQVEsRUFBQyw0Q0FBNEMsRUFBRSxHQUFHLEVBQUU7SUFDMUQsTUFBTSxLQUFLLEdBQXNDO1FBQy9DO1lBQ0UsS0FBSyxFQUFFLHFCQUFxQjtZQUM1QixLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQ3ZCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZO1lBQ3pDLFlBQVksRUFBRSxtQkFBbUI7U0FDbEM7UUFDRDtZQUNFLEtBQUssRUFBRSxvQ0FBb0M7WUFDM0MsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO1lBQ25ELGlCQUFpQixFQUFFLGNBQWM7WUFDakMsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLG1CQUFXLENBQUMsS0FBSyxDQUFDLGVBQWU7U0FDN0M7UUFDRDtZQUNFLEtBQUssRUFBRSxrQ0FBa0M7WUFDekMsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUU7WUFDcEUsU0FBUyxFQUFFLFNBQVM7WUFDcEIsV0FBVyxFQUFFLEtBQUs7U0FDbkI7S0FDRixDQUFBO0lBRUQsV0FBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FDWixRQUFRLEVBQ1IsS0FBSyxFQUFFLEVBQ0wsS0FBSyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEdBQ2IsRUFBRSxFQUFFO1FBQ0gsTUFBTSxlQUFlLEdBQUcsV0FBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDO1lBQ2hELEVBQUUsRUFBRSxFQUFFLFNBQVMsSUFBSSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUU7U0FDbkQsQ0FBQyxDQUFBO1FBRUYsTUFBTSxLQUFLLEdBQUc7WUFDWixPQUFPLEVBQUUsQ0FBQyxLQUFjLEVBQUUsRUFBRTtnQkFDMUIsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7b0JBQzVDLE9BQU87d0JBQ0wsR0FBRyxFQUFFLFdBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQzs0QkFDN0IsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTt5QkFDM0QsQ0FBQztxQkFDSCxDQUFBO2dCQUNILENBQUM7Z0JBQ0QsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7b0JBQ3ZDLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQTtnQkFDNUIsQ0FBQztnQkFDRCxPQUFPLFNBQVMsQ0FBQTtZQUNsQixDQUFDO1NBQ0YsQ0FBQTtRQUVELE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUNoQixJQUFBLG9EQUF1QixFQUFDLEtBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUVoRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBQSxlQUFNLEVBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUE7WUFDL0QsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxJQUFBLGVBQU0sRUFBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDcEQsQ0FBQztZQUNELE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQTtRQUM3QixJQUFBLGVBQU0sRUFBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ25DLElBQUEsZUFBTSxFQUFDLGVBQWUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDO1lBQzNDLGVBQU0sQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDdEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO2dCQUNsQixXQUFXLEVBQUUsSUFBSTtnQkFDakIsVUFBVSxFQUFFLEdBQUc7YUFDaEIsQ0FBQztTQUNILENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FDRixDQUFBO0FBQ0gsQ0FBQyxDQUFDLENBQUEifQ==
|