customer-registration 0.0.128 → 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/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/workflows/steps/resolve-or-create-phone-auth-customer-step.js +7 -46
- package/README.md +5 -3
- package/package.json +1 -1
|
@@ -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==
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createPhoneOnlyCustomer = createPhoneOnlyCustomer;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
function firstKnexRow(result) {
|
|
6
|
+
const fromRows = result.rows?.[0];
|
|
7
|
+
if (fromRows && typeof fromRows === "object" && !Array.isArray(fromRows)) {
|
|
8
|
+
return fromRows;
|
|
9
|
+
}
|
|
10
|
+
const batch = result[0];
|
|
11
|
+
if (Array.isArray(batch)) {
|
|
12
|
+
const first = batch[0];
|
|
13
|
+
if (first && typeof first === "object" && !Array.isArray(first)) {
|
|
14
|
+
return first;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Creates a customer with phone only (no email), blocking duplicate registered phones.
|
|
21
|
+
* Used for phone-only password registration and phone_auth OTP signup.
|
|
22
|
+
*/
|
|
23
|
+
async function createPhoneOnlyCustomer(scope, data) {
|
|
24
|
+
const phoneNormalized = data.phone.trim();
|
|
25
|
+
if (!phoneNormalized) {
|
|
26
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Phone is required for registration");
|
|
27
|
+
}
|
|
28
|
+
const knex = scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
|
|
29
|
+
const existingPhoneAccount = await knex.raw(`SELECT id FROM customer WHERE phone = ? AND has_account = true LIMIT 1`, [phoneNormalized]);
|
|
30
|
+
if (firstKnexRow(existingPhoneAccount)?.id) {
|
|
31
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.DUPLICATE_ERROR, "A customer with this phone number already has an account");
|
|
32
|
+
}
|
|
33
|
+
const customerService = scope.resolve(utils_1.Modules.CUSTOMER);
|
|
34
|
+
const [customer] = await customerService.createCustomers([
|
|
35
|
+
{
|
|
36
|
+
...data,
|
|
37
|
+
phone: phoneNormalized,
|
|
38
|
+
has_account: data.has_account ?? false,
|
|
39
|
+
},
|
|
40
|
+
]);
|
|
41
|
+
return customer;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBob25lLW9ubHktY3VzdG9tZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9zaGFyZWQvY3JlYXRlLXBob25lLW9ubHktY3VzdG9tZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEwQ0EsMERBcUNDO0FBMUVELHFEQUlrQztBQUVsQyxTQUFTLFlBQVksQ0FDbkIsTUFBbUM7SUFFbkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pDLElBQUksUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN6RSxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3ZCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN0QixJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEUsT0FBTyxLQUFVLENBQUE7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBWUQ7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLHVCQUF1QixDQUMzQyxLQUFzQixFQUN0QixJQUFrQztJQUVsQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO0lBRXpDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixvQ0FBb0MsQ0FDckMsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ25FLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUN6Qyx3RUFBd0UsRUFDeEUsQ0FBQyxlQUFlLENBQUMsQ0FDbEIsQ0FBQTtJQUVELElBQUksWUFBWSxDQUFrQixvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQzVELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQ2pDLDBEQUEwRCxDQUMzRCxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQXlCLGVBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUUvRSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxlQUFlLENBQUMsZUFBZSxDQUFDO1FBQ3ZEO1lBQ0UsR0FBRyxJQUFJO1lBQ1AsS0FBSyxFQUFFLGVBQWU7WUFDdEIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksS0FBSztTQUN2QztLQUNGLENBQUMsQ0FBQTtJQUVGLE9BQU8sUUFBUSxDQUFBO0FBQ2pCLENBQUMifQ==
|
|
@@ -3,16 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.resolveOrCreatePhoneAuthCustomerStep = void 0;
|
|
4
4
|
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
5
|
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
-
const
|
|
7
|
-
const config_1 = require("../../config");
|
|
6
|
+
const create_phone_only_customer_1 = require("../../api/store/customers/shared/create-phone-only-customer");
|
|
8
7
|
const phone_auth_helpers_1 = require("../../api/store/customers/otp/shared/phone-auth-helpers");
|
|
9
8
|
const otp_verification_1 = require("../../modules/otp-verification");
|
|
10
9
|
exports.resolveOrCreatePhoneAuthCustomerStep = (0, workflows_sdk_1.createStep)("resolve-or-create-phone-auth-customer", async (input, stepContext) => {
|
|
11
10
|
const { container } = stepContext;
|
|
12
11
|
const normalizedPhone = (0, phone_auth_helpers_1.normalizeAuthPhone)(input.phone);
|
|
13
|
-
const configModule = container.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
14
|
-
const registrationOptions = (0, config_1.resolveCustomerRegistrationOptions)(configModule);
|
|
15
|
-
const registrationIdentifier = registrationOptions.registration.identifier;
|
|
16
12
|
const otpService = container.resolve(otp_verification_1.OTP_VERIFICATION_MODULE);
|
|
17
13
|
const authService = container.resolve(utils_1.Modules.AUTH);
|
|
18
14
|
const existingCustomer = await (0, phone_auth_helpers_1.lookupCustomerByPhone)(container, normalizedPhone);
|
|
@@ -81,6 +77,7 @@ exports.resolveOrCreatePhoneAuthCustomerStep = (0, workflows_sdk_1.createStep)("
|
|
|
81
77
|
}
|
|
82
78
|
const customerPayload = {
|
|
83
79
|
phone: normalizedPhone,
|
|
80
|
+
has_account: true,
|
|
84
81
|
};
|
|
85
82
|
if (input.first_name) {
|
|
86
83
|
customerPayload.first_name = input.first_name;
|
|
@@ -91,49 +88,13 @@ exports.resolveOrCreatePhoneAuthCustomerStep = (0, workflows_sdk_1.createStep)("
|
|
|
91
88
|
let customerId;
|
|
92
89
|
let isNewUser = true;
|
|
93
90
|
if (existingCustomer && !existingCustomer.has_account) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const [created] = await customerService.createCustomers([
|
|
97
|
-
{
|
|
98
|
-
...customerPayload,
|
|
99
|
-
has_account: true,
|
|
100
|
-
},
|
|
101
|
-
]);
|
|
102
|
-
customerId = created.id;
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
const { result } = await (0, core_flows_1.createCustomerAccountWorkflow)(container).run({
|
|
106
|
-
input: {
|
|
107
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
108
|
-
customerData: customerPayload,
|
|
109
|
-
authIdentityId,
|
|
110
|
-
},
|
|
111
|
-
});
|
|
112
|
-
customerId = result.id;
|
|
113
|
-
}
|
|
91
|
+
const created = await (0, create_phone_only_customer_1.createPhoneOnlyCustomer)(container, customerPayload);
|
|
92
|
+
customerId = created.id;
|
|
114
93
|
isNewUser = false;
|
|
115
94
|
}
|
|
116
95
|
else if (!existingCustomer) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const [created] = await customerService.createCustomers([
|
|
120
|
-
{
|
|
121
|
-
...customerPayload,
|
|
122
|
-
has_account: true,
|
|
123
|
-
},
|
|
124
|
-
]);
|
|
125
|
-
customerId = created.id;
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
const { result } = await (0, core_flows_1.createCustomerAccountWorkflow)(container).run({
|
|
129
|
-
input: {
|
|
130
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
131
|
-
customerData: customerPayload,
|
|
132
|
-
authIdentityId,
|
|
133
|
-
},
|
|
134
|
-
});
|
|
135
|
-
customerId = result.id;
|
|
136
|
-
}
|
|
96
|
+
const created = await (0, create_phone_only_customer_1.createPhoneOnlyCustomer)(container, customerPayload);
|
|
97
|
+
customerId = created.id;
|
|
137
98
|
}
|
|
138
99
|
else {
|
|
139
100
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Unable to resolve customer for phone authentication");
|
|
@@ -148,4 +109,4 @@ exports.resolveOrCreatePhoneAuthCustomerStep = (0, workflows_sdk_1.createStep)("
|
|
|
148
109
|
is_new_user: isNewUser,
|
|
149
110
|
});
|
|
150
111
|
});
|
|
151
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1vci1jcmVhdGUtcGhvbmUtYXV0aC1jdXN0b21lci1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9yZXNvbHZlLW9yLWNyZWF0ZS1waG9uZS1hdXRoLWN1c3RvbWVyLXN0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQTRFO0FBRTVFLHFEQUtrQztBQUNsQyw0R0FHb0U7QUFDcEUsZ0dBS2dFO0FBQ2hFLHFFQUF3RTtBQWdCM0QsUUFBQSxvQ0FBb0MsR0FBRyxJQUFBLDBCQUFVLEVBQzVELHVDQUF1QyxFQUN2QyxLQUFLLEVBQUUsS0FBb0MsRUFBRSxXQUFXLEVBQUUsRUFBRTtJQUMxRCxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsV0FBVyxDQUFBO0lBQ2pDLE1BQU0sZUFBZSxHQUFHLElBQUEsdUNBQWtCLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRXZELE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQ2xDLDBDQUF1QixDQUN4QixDQUFBO0lBQ0QsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsSUFBSSxDQWNqRCxDQUFBO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUEsMENBQXFCLEVBQ2xELFNBQVMsRUFDVCxlQUFlLENBQ2hCLENBQUE7SUFFRCxNQUFNLGtCQUFrQixHQUFHLEtBQUssRUFDOUIsY0FBc0IsRUFDdEIsVUFBa0IsRUFDbEIsRUFBRTtRQUNGLE1BQU0sV0FBVyxDQUFDLG9CQUFvQixDQUFDO1lBQ3JDLEVBQUUsRUFBRSxjQUFjO1lBQ2xCLFlBQVksRUFBRSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUU7U0FDMUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFBO0lBRUQsTUFBTSxlQUFlLEdBQUcsS0FBSyxFQUFFLFVBQWtCLEVBQUUsRUFBRTtRQUNuRCxN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
|
package/README.md
CHANGED
|
@@ -314,13 +314,15 @@ Response:
|
|
|
314
314
|
**Storefront flows**
|
|
315
315
|
|
|
316
316
|
- **Password (unchanged):** `POST /auth/customer/emailpass/register` → `POST /store/customers` → optional `POST /store/customers/otp/send` + `verify` with `type: "email_verification"`.
|
|
317
|
-
- **Email OTP (unified):** `POST /store/customers/otp/send` (`type: "email_auth"`) → `POST /store/customers/otp/verify` → customer is logged in immediately.
|
|
318
|
-
- **Phone OTP (unified):** `POST /store/customers/otp/send` (`type: "phone_auth"`) → `POST /store/customers/otp/verify` → logged in immediately.
|
|
317
|
+
- **Email OTP (unified):** `POST /store/customers/otp/send` (`type: "email_auth"`) → `POST /store/customers/otp/verify` → customer is logged in immediately (creates account with **email only**).
|
|
318
|
+
- **Phone OTP (unified):** `POST /store/customers/otp/send` (`type: "phone_auth"`) → `POST /store/customers/otp/verify` → logged in immediately (creates account with **phone only**).
|
|
319
319
|
- **Both methods:** Show a toggle such as “Continue with password” vs “Continue with email/SMS code” when `auth.email.methods` or `auth.phone.methods` includes `"otp"`.
|
|
320
320
|
|
|
321
|
+
> **OTP auth vs password registration:** `registration.identifier: "both"` still requires **email and phone** on password registration (`POST /auth/customer/emailpass/register` → `POST /store/customers`). OTP login/register is **channel-scoped**: whichever channel the user verifies (`email_auth` or `phone_auth`) is the only identifier required to create the account.
|
|
322
|
+
|
|
321
323
|
> **Breaking change:** `/auth/customer/emailotp/*` and `/auth/customer/phoneotp/*` were removed. Use `/store/customers/otp/*` with `type: "email_auth"` or `type: "phone_auth"` instead.
|
|
322
324
|
|
|
323
|
-
For
|
|
325
|
+
For dual OTP stores use `registration.identifier: "both"`, `login.identifier: "both"`, `auth.email.methods` / `auth.phone.methods` including `"otp"`, plus `email_auth` and `phone_auth` channel config.
|
|
324
326
|
|
|
325
327
|
### Store routes
|
|
326
328
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "customer-registration",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.129",
|
|
4
4
|
"description": "Medusa plugin that overrides store customer registration, enforces email/phone verification flags, and provides OTP management module.",
|
|
5
5
|
"author": "Medusa (https://medusajs.com)",
|
|
6
6
|
"license": "MIT",
|