customer-registration 0.0.112 → 0.0.113
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/api/auth/customer/emailpass/reset-password/route.js +1 -26
- package/.medusa/server/src/api/auth/customer/emailpass/route.js +19 -97
- package/.medusa/server/src/api/auth/customer/phonepass/register/route.js +50 -0
- package/.medusa/server/src/api/auth/customer/phonepass/route.js +105 -0
- package/.medusa/server/src/api/middlewares/{block-pending-customer.js → guard-account-deletion.js} +4 -4
- package/.medusa/server/src/api/middlewares/ip-rate-limit.js +48 -0
- package/.medusa/server/src/api/middlewares/validate-customer-registration.js +60 -0
- package/.medusa/server/src/api/middlewares.js +17 -4
- package/.medusa/server/src/api/store/customers/account-deletion/cancel-request/route.js +16 -6
- package/.medusa/server/src/api/store/customers/account-deletion/validators.js +11 -3
- package/.medusa/server/src/api/store/customers/me/contact/route.js +95 -0
- package/.medusa/server/src/api/store/customers/me/contact/verify/route.js +83 -0
- package/.medusa/server/src/api/store/customers/me/route.js +53 -0
- package/.medusa/server/src/api/store/customers/otp/send/route.js +1 -6
- package/.medusa/server/src/api/store/customers/otp/verify/route.js +95 -3
- package/.medusa/server/src/api/store/customers/route.js +89 -0
- package/.medusa/server/src/config.js +32 -23
- package/.medusa/server/src/modules/otp-verification/service.js +72 -1
- package/.medusa/server/src/providers/phonepass/index.js +9 -0
- package/.medusa/server/src/providers/phonepass/service.js +133 -0
- package/.medusa/server/src/subscribers/password-reset.js +1 -42
- package/.medusa/server/src/workflows/change-password.js +40 -64
- package/.medusa/server/src/workflows/send-contact-change-otp-workflow.js +41 -0
- package/.medusa/server/src/workflows/steps/determine-contact-method-step.js +8 -2
- package/.medusa/server/src/workflows/steps/generate-contact-change-otp-step.js +24 -0
- package/.medusa/server/src/workflows/steps/index.js +6 -2
- package/.medusa/server/src/workflows/steps/send-notification-step.js +1 -11
- package/.medusa/server/src/workflows/steps/sync-phonepass-entity-id-step.js +63 -0
- package/.medusa/server/src/workflows/steps/update-password-step.js +21 -29
- package/.medusa/server/src/workflows/update-contact-workflow.js +100 -0
- package/.medusa/server/src/workflows/verify-phone.js +11 -4
- package/README.md +363 -223
- package/package.json +3 -1
- package/.medusa/server/src/subscribers/customer-updated.js +0 -100
|
@@ -0,0 +1,89 @@
|
|
|
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 core_flows_1 = require("@medusajs/core-flows");
|
|
6
|
+
const config_1 = require("../../../config");
|
|
7
|
+
/**
|
|
8
|
+
* Override of Medusa's built-in POST /store/customers.
|
|
9
|
+
*
|
|
10
|
+
* Medusa's default implementation calls validateCustomerAccountCreation which
|
|
11
|
+
* throws when email is missing. When registration.identifier is "phone" we
|
|
12
|
+
* must bypass that step and create the customer with phone only.
|
|
13
|
+
*
|
|
14
|
+
* For "email" and "both" we delegate to the built-in workflow so that all of
|
|
15
|
+
* Medusa's existing validations (duplicate email check, etc.) are preserved.
|
|
16
|
+
*/
|
|
17
|
+
const POST = async (req, res) => {
|
|
18
|
+
const authContext = req.auth_context;
|
|
19
|
+
if (authContext?.actor_id) {
|
|
20
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Request already authenticated as a customer.");
|
|
21
|
+
}
|
|
22
|
+
const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
23
|
+
const options = (0, config_1.resolveCustomerRegistrationOptions)(configModule);
|
|
24
|
+
const { identifier } = options.registration;
|
|
25
|
+
const authIdentityId = authContext?.auth_identity_id;
|
|
26
|
+
const customerData = (req.body ?? {});
|
|
27
|
+
if (identifier !== "phone") {
|
|
28
|
+
// "email" or "both": delegate to Medusa's built-in workflow which enforces
|
|
29
|
+
// the email requirement and handles duplicate detection.
|
|
30
|
+
const { result } = await (0, core_flows_1.createCustomerAccountWorkflow)(req.scope).run({
|
|
31
|
+
input: {
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
33
|
+
customerData: customerData,
|
|
34
|
+
authIdentityId: authIdentityId ?? "",
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
const customer = await refetchCustomer(result.id, req.scope);
|
|
38
|
+
return res.status(200).json({ customer });
|
|
39
|
+
}
|
|
40
|
+
// "phone": create customer without email validation.
|
|
41
|
+
if (!customerData.phone) {
|
|
42
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Phone is required for registration");
|
|
43
|
+
}
|
|
44
|
+
const customerService = req.scope.resolve(utils_1.Modules.CUSTOMER);
|
|
45
|
+
// Check for duplicate phone
|
|
46
|
+
const knex = req.scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
|
|
47
|
+
const existing = await knex.raw(`SELECT id FROM customer WHERE phone = ? AND has_account = true LIMIT 1`, [customerData.phone]);
|
|
48
|
+
if (existing.rows?.[0] ?? existing[0]?.[0]) {
|
|
49
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.DUPLICATE_ERROR, "A customer with this phone number already has an account");
|
|
50
|
+
}
|
|
51
|
+
const [customer] = await customerService.createCustomers([
|
|
52
|
+
{
|
|
53
|
+
...customerData,
|
|
54
|
+
has_account: !!authIdentityId,
|
|
55
|
+
},
|
|
56
|
+
]);
|
|
57
|
+
// Link the auth identity to the new customer (same as setAuthAppMetadataStep)
|
|
58
|
+
if (authIdentityId) {
|
|
59
|
+
const authService = req.scope.resolve(utils_1.Modules.AUTH);
|
|
60
|
+
await authService.updateAuthIdentities({
|
|
61
|
+
id: authIdentityId,
|
|
62
|
+
app_metadata: { customer_id: customer.id },
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const fullCustomer = await refetchCustomer(customer.id, req.scope);
|
|
66
|
+
return res.status(200).json({ customer: fullCustomer });
|
|
67
|
+
};
|
|
68
|
+
exports.POST = POST;
|
|
69
|
+
async function refetchCustomer(customerId, scope) {
|
|
70
|
+
const remoteQuery = scope.resolve(utils_1.ContainerRegistrationKeys.REMOTE_QUERY);
|
|
71
|
+
const queryObject = (0, utils_1.remoteQueryObjectFromString)({
|
|
72
|
+
entryPoint: "customer",
|
|
73
|
+
variables: { filters: { id: customerId } },
|
|
74
|
+
fields: [
|
|
75
|
+
"id",
|
|
76
|
+
"email",
|
|
77
|
+
"first_name",
|
|
78
|
+
"last_name",
|
|
79
|
+
"phone",
|
|
80
|
+
"has_account",
|
|
81
|
+
"metadata",
|
|
82
|
+
"created_at",
|
|
83
|
+
"updated_at",
|
|
84
|
+
],
|
|
85
|
+
});
|
|
86
|
+
const customers = await remoteQuery(queryObject);
|
|
87
|
+
return customers[0];
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxxREFLa0M7QUFDbEMscURBQW9FO0FBQ3BFLDRDQUd3QjtBQUV4Qjs7Ozs7Ozs7O0dBU0c7QUFDSSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsTUFBTSxXQUFXLEdBQ2YsR0FHRCxDQUFDLFlBQVksQ0FBQTtJQUVkLElBQUksV0FBVyxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDhDQUE4QyxDQUMvQyxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQy9FLE1BQU0sT0FBTyxHQUFHLElBQUEsMkNBQWtDLEVBQUMsWUFBaUMsQ0FBQyxDQUFBO0lBQ3JGLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFBO0lBRTNDLE1BQU0sY0FBYyxHQUFHLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQTtJQUNwRCxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUE0QixDQUFBO0lBRWhFLElBQUksVUFBVSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQzNCLDJFQUEyRTtRQUMzRSx5REFBeUQ7UUFDekQsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSwwQ0FBNkIsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3BFLEtBQUssRUFBRTtnQkFDTCw4REFBOEQ7Z0JBQzlELFlBQVksRUFBRSxZQUFtQjtnQkFDakMsY0FBYyxFQUFFLGNBQWMsSUFBSSxFQUFFO2FBQ3JDO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDNUQsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDM0MsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG9DQUFvQyxDQUNyQyxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUUzRCw0QkFBNEI7SUFDNUIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDdkUsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUM3Qix3RUFBd0UsRUFDeEUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQ3JCLENBQUE7SUFDRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNDLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQ2pDLDBEQUEwRCxDQUMzRCxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLGVBQWUsQ0FBQyxlQUFlLENBQUM7UUFDdkQ7WUFDRSxHQUFJLFlBQXVCO1lBQzNCLFdBQVcsRUFBRSxDQUFDLENBQUMsY0FBYztTQUM5QjtLQUNGLENBQUMsQ0FBQTtJQUVGLDhFQUE4RTtJQUM5RSxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ25CLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuRCxNQUFNLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQztZQUNyQyxFQUFFLEVBQUUsY0FBYztZQUNsQixZQUFZLEVBQUUsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtTQUMzQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDbEUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFBO0FBQ3pELENBQUMsQ0FBQTtBQTdFWSxRQUFBLElBQUksUUE2RWhCO0FBRUQsS0FBSyxVQUFVLGVBQWUsQ0FBQyxVQUFrQixFQUFFLEtBQXNCO0lBQ3ZFLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDekUsTUFBTSxXQUFXLEdBQUcsSUFBQSxtQ0FBMkIsRUFBQztRQUM5QyxVQUFVLEVBQUUsVUFBVTtRQUN0QixTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUU7UUFDMUMsTUFBTSxFQUFFO1lBQ04sSUFBSTtZQUNKLE9BQU87WUFDUCxZQUFZO1lBQ1osV0FBVztZQUNYLE9BQU87WUFDUCxhQUFhO1lBQ2IsVUFBVTtZQUNWLFlBQVk7WUFDWixZQUFZO1NBQ2I7S0FDRixDQUFDLENBQUE7SUFDRixNQUFNLFNBQVMsR0FBRyxNQUFNLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNoRCxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNyQixDQUFDIn0=
|
|
@@ -9,40 +9,49 @@ exports.resolveCustomerRegistrationOptions = resolveCustomerRegistrationOptions;
|
|
|
9
9
|
const utils_1 = require("@medusajs/framework/utils");
|
|
10
10
|
const PLUGIN_NAME = "customer-registration";
|
|
11
11
|
function normalizeCustomerRegistrationOptions(input) {
|
|
12
|
-
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
12
|
+
const base = input ?? {};
|
|
15
13
|
// Password reset template is required if password_reset is configured
|
|
16
|
-
if (
|
|
14
|
+
if (base.password_reset && !base.password_reset.template) {
|
|
17
15
|
throw new Error("customer-registration: password_reset.template is required when password_reset is configured");
|
|
18
16
|
}
|
|
19
|
-
if (
|
|
17
|
+
if (base.password_reset && !base.storefrontUrl) {
|
|
18
|
+
throw new Error("[customer-registration] storefrontUrl is required when password_reset is configured — " +
|
|
19
|
+
"the reset email link will be malformed without it");
|
|
20
|
+
}
|
|
21
|
+
if (base.account_deletion_request && !base.account_deletion_request.template) {
|
|
20
22
|
throw new Error("customer-registration: account_deletion_request.template is required when account_deletion_request is configured");
|
|
21
23
|
}
|
|
22
|
-
if (
|
|
24
|
+
if (base.account_deletion_cancel && !base.account_deletion_cancel.template) {
|
|
23
25
|
throw new Error("customer-registration: account_deletion_cancel.template is required when account_deletion_cancel is configured");
|
|
24
26
|
}
|
|
27
|
+
const registrationIdentifier = base.registration?.identifier ?? "email";
|
|
25
28
|
return {
|
|
26
|
-
storefrontUrl:
|
|
27
|
-
|
|
29
|
+
storefrontUrl: base.storefrontUrl,
|
|
30
|
+
registration: {
|
|
31
|
+
identifier: registrationIdentifier,
|
|
32
|
+
require_verification: base.registration?.require_verification ?? true,
|
|
33
|
+
},
|
|
34
|
+
login: {
|
|
35
|
+
identifier: base.login?.identifier ?? registrationIdentifier,
|
|
36
|
+
},
|
|
37
|
+
password_reset: base.password_reset
|
|
28
38
|
? {
|
|
29
|
-
template:
|
|
30
|
-
subject:
|
|
39
|
+
template: base.password_reset.template,
|
|
40
|
+
subject: base.password_reset.subject || "Reset Your Password",
|
|
31
41
|
}
|
|
32
42
|
: undefined,
|
|
33
|
-
account_deletion_request:
|
|
43
|
+
account_deletion_request: base.account_deletion_request
|
|
34
44
|
? {
|
|
35
|
-
template:
|
|
36
|
-
subject:
|
|
45
|
+
template: base.account_deletion_request.template,
|
|
46
|
+
subject: base.account_deletion_request.subject ||
|
|
37
47
|
"Confirm your account deletion request",
|
|
38
|
-
scheduled_days:
|
|
39
|
-
7,
|
|
48
|
+
scheduled_days: base.account_deletion_request.scheduled_days ?? 7,
|
|
40
49
|
}
|
|
41
50
|
: undefined,
|
|
42
|
-
account_deletion_cancel:
|
|
51
|
+
account_deletion_cancel: base.account_deletion_cancel
|
|
43
52
|
? {
|
|
44
|
-
template:
|
|
45
|
-
subject:
|
|
53
|
+
template: base.account_deletion_cancel.template,
|
|
54
|
+
subject: base.account_deletion_cancel.subject ||
|
|
46
55
|
"Confirm cancellation of account deletion",
|
|
47
56
|
}
|
|
48
57
|
: undefined,
|
|
@@ -57,8 +66,8 @@ function resolveCustomerRegistrationOptions(configModule) {
|
|
|
57
66
|
for (const plugin of plugins) {
|
|
58
67
|
if ((0, utils_1.isString)(plugin)) {
|
|
59
68
|
if (plugin === PLUGIN_NAME) {
|
|
60
|
-
// String plugin without options
|
|
61
|
-
return null;
|
|
69
|
+
// String plugin without options — resolve with all defaults
|
|
70
|
+
return normalizeCustomerRegistrationOptions(null);
|
|
62
71
|
}
|
|
63
72
|
continue;
|
|
64
73
|
}
|
|
@@ -66,7 +75,7 @@ function resolveCustomerRegistrationOptions(configModule) {
|
|
|
66
75
|
return normalizeCustomerRegistrationOptions(plugin.options);
|
|
67
76
|
}
|
|
68
77
|
}
|
|
69
|
-
// Plugin not found
|
|
70
|
-
return null;
|
|
78
|
+
// Plugin not found in config — return all defaults so callers never get null
|
|
79
|
+
return normalizeCustomerRegistrationOptions(null);
|
|
71
80
|
}
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOztBQStESCxvRkFrRUM7QUFFRCxnRkF5QkM7QUExSkQscURBQW9EO0FBS3BELE1BQU0sV0FBVyxHQUFHLHVCQUF1QixDQUFBO0FBd0QzQyxTQUFnQixvQ0FBb0MsQ0FDbEQsS0FBZ0Q7SUFFaEQsTUFBTSxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQTtJQUV4QixzRUFBc0U7SUFDdEUsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6RCxNQUFNLElBQUksS0FBSyxDQUNiLDhGQUE4RixDQUMvRixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMvQyxNQUFNLElBQUksS0FBSyxDQUNiLHdGQUF3RjtZQUN0RixtREFBbUQsQ0FDdEQsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3RSxNQUFNLElBQUksS0FBSyxDQUNiLGtIQUFrSCxDQUNuSCxDQUFBO0lBQ0gsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzNFLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0hBQWdILENBQ2pILENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxzQkFBc0IsR0FBb0IsSUFBSSxDQUFDLFlBQVksRUFBRSxVQUFVLElBQUksT0FBTyxDQUFBO0lBRXhGLE9BQU87UUFDTCxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7UUFDakMsWUFBWSxFQUFFO1lBQ1osVUFBVSxFQUFFLHNCQUFzQjtZQUNsQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLG9CQUFvQixJQUFJLElBQUk7U0FDdEU7UUFDRCxLQUFLLEVBQUU7WUFDTCxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLElBQUksc0JBQXNCO1NBQzdEO1FBQ0QsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ2pDLENBQUMsQ0FBQztnQkFDRSxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRO2dCQUN0QyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLElBQUkscUJBQXFCO2FBQzlEO1lBQ0gsQ0FBQyxDQUFDLFNBQVM7UUFDYix3QkFBd0IsRUFBRSxJQUFJLENBQUMsd0JBQXdCO1lBQ3JELENBQUMsQ0FBQztnQkFDRSxRQUFRLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVE7Z0JBQ2hELE9BQU8sRUFDTCxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTztvQkFDckMsdUNBQXVDO2dCQUN6QyxjQUFjLEVBQ1osSUFBSSxDQUFDLHdCQUF3QixDQUFDLGNBQWMsSUFBSSxDQUFDO2FBQ3BEO1lBQ0gsQ0FBQyxDQUFDLFNBQVM7UUFDYix1QkFBdUIsRUFBRSxJQUFJLENBQUMsdUJBQXVCO1lBQ25ELENBQUMsQ0FBQztnQkFDRSxRQUFRLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVE7Z0JBQy9DLE9BQU8sRUFDTCxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTztvQkFDcEMsMENBQTBDO2FBQzdDO1lBQ0gsQ0FBQyxDQUFDLFNBQVM7S0FDZCxDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQWdCLGtDQUFrQyxDQUNoRCxZQUFnQztJQUVoQyw2REFBNkQ7SUFDN0QsTUFBTSxjQUFjLEdBQUcsWUFBWSxFQUFFLGFBQWEsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ2pFLHNDQUFzQztJQUN0QyxNQUFNLGFBQWEsR0FBRyxZQUFZLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQTtJQUNqRCxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsY0FBYyxFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUE7SUFFckQsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM3QixJQUFJLElBQUEsZ0JBQVEsRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3JCLElBQUksTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUMzQiw0REFBNEQ7Z0JBQzVELE9BQU8sb0NBQW9DLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDbkQsQ0FBQztZQUNELFNBQVE7UUFDVixDQUFDO1FBRUQsSUFBSSxNQUFNLEVBQUUsT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sb0NBQW9DLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLE9BQU8sb0NBQW9DLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDbkQsQ0FBQyJ9
|
|
@@ -305,6 +305,53 @@ class OtpVerificationService extends (0, utils_1.MedusaService)({
|
|
|
305
305
|
type: otp.purpose,
|
|
306
306
|
};
|
|
307
307
|
}
|
|
308
|
+
/**
|
|
309
|
+
* Generate OTP for a contact-change request.
|
|
310
|
+
* Identical to generateOtpWithCode but embeds `new_value` and `contact_type`
|
|
311
|
+
* in the signed JWT so no metadata staging is required.
|
|
312
|
+
*/
|
|
313
|
+
async generateOtpForContactChange(input, jwtSecret, newValue, contactType) {
|
|
314
|
+
const { customer_id, type } = input;
|
|
315
|
+
const purpose = type;
|
|
316
|
+
await this.checkExistingOtp(customer_id, purpose);
|
|
317
|
+
const code = this.generateCode();
|
|
318
|
+
const hashedCode = this.hashCode(code);
|
|
319
|
+
const expiresAt = new Date();
|
|
320
|
+
expiresAt.setMinutes(expiresAt.getMinutes() + (this.config_.otpExpiryMinutes ?? 15));
|
|
321
|
+
const otp = await this.createOtpRecord(customer_id, purpose, hashedCode, expiresAt);
|
|
322
|
+
const token = jsonwebtoken_1.default.sign({
|
|
323
|
+
otp_id: otp.id,
|
|
324
|
+
customer_id: otp.customer_id,
|
|
325
|
+
type,
|
|
326
|
+
purpose: otp.purpose,
|
|
327
|
+
new_value: newValue,
|
|
328
|
+
contact_type: contactType,
|
|
329
|
+
}, jwtSecret, { expiresIn: `${this.config_.otpExpiryMinutes ?? 15}m` });
|
|
330
|
+
return { token, expires_at: expiresAt, code };
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Decode a contact-change OTP token, returning the embedded new_value and contact_type
|
|
334
|
+
* in addition to the standard otp_id / customer_id / type fields.
|
|
335
|
+
*/
|
|
336
|
+
decodeContactChangeToken(token, jwtSecret) {
|
|
337
|
+
try {
|
|
338
|
+
const decoded = jsonwebtoken_1.default.verify(token, jwtSecret);
|
|
339
|
+
const { otp_id, customer_id, type, new_value, contact_type } = decoded;
|
|
340
|
+
if (!otp_id || !customer_id || !type || !new_value || !contact_type) {
|
|
341
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid contact-change token format.");
|
|
342
|
+
}
|
|
343
|
+
return {
|
|
344
|
+
otp_id: otp_id,
|
|
345
|
+
customer_id: customer_id,
|
|
346
|
+
type: type,
|
|
347
|
+
new_value: new_value,
|
|
348
|
+
contact_type: contact_type,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid or expired contact-change token. Please request a new OTP.");
|
|
353
|
+
}
|
|
354
|
+
}
|
|
308
355
|
/**
|
|
309
356
|
* Generate OTP code and return it (for sending via notification)
|
|
310
357
|
* This is a helper that generates code, creates OTP record, and returns both code and token
|
|
@@ -418,6 +465,23 @@ class OtpVerificationService extends (0, utils_1.MedusaService)({
|
|
|
418
465
|
phone_verified: row?.phone_verified ?? false,
|
|
419
466
|
};
|
|
420
467
|
}
|
|
468
|
+
/**
|
|
469
|
+
* Get customer verification status by phone
|
|
470
|
+
*/
|
|
471
|
+
async getCustomerVerificationByPhone(sharedContext, phone) {
|
|
472
|
+
const knex = sharedContext.manager?.getKnex();
|
|
473
|
+
if (!knex) {
|
|
474
|
+
throw new Error("Database connection not available");
|
|
475
|
+
}
|
|
476
|
+
const result = await knex.raw(`SELECT email_verified, phone_verified
|
|
477
|
+
FROM customer
|
|
478
|
+
WHERE phone = ?`, [phone]);
|
|
479
|
+
const row = result.rows?.[0] || result[0]?.[0];
|
|
480
|
+
return {
|
|
481
|
+
email_verified: row?.email_verified ?? false,
|
|
482
|
+
phone_verified: row?.phone_verified ?? false,
|
|
483
|
+
};
|
|
484
|
+
}
|
|
421
485
|
/**
|
|
422
486
|
* Get customer verification status by email
|
|
423
487
|
*/
|
|
@@ -486,6 +550,13 @@ __decorate([
|
|
|
486
550
|
__metadata("design:paramtypes", [Object, String]),
|
|
487
551
|
__metadata("design:returntype", Promise)
|
|
488
552
|
], OtpVerificationService.prototype, "getCustomerVerificationByCustomerId", null);
|
|
553
|
+
__decorate([
|
|
554
|
+
(0, utils_2.InjectManager)(),
|
|
555
|
+
__param(0, (0, utils_3.MedusaContext)()),
|
|
556
|
+
__metadata("design:type", Function),
|
|
557
|
+
__metadata("design:paramtypes", [Object, String]),
|
|
558
|
+
__metadata("design:returntype", Promise)
|
|
559
|
+
], OtpVerificationService.prototype, "getCustomerVerificationByPhone", null);
|
|
489
560
|
__decorate([
|
|
490
561
|
(0, utils_2.InjectManager)(),
|
|
491
562
|
__param(0, (0, utils_3.MedusaContext)()),
|
|
@@ -493,4 +564,4 @@ __decorate([
|
|
|
493
564
|
__metadata("design:paramtypes", [Object, String]),
|
|
494
565
|
__metadata("design:returntype", Promise)
|
|
495
566
|
], OtpVerificationService.prototype, "getCustomerVerificationByEmail", null);
|
|
496
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL290cC12ZXJpZmljYXRpb24vc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBc0U7QUFDdEUscURBQXlEO0FBRXpELHFEQUF5RDtBQUV6RCxvREFBMkI7QUFDM0IsZ0VBQThCO0FBQzlCLGdFQUF1RTtBQVl2RSxNQUFhLHNCQUF1QixTQUFRLElBQUEscUJBQWEsRUFBQztJQUN4RCxlQUFlLEVBQWYsa0NBQWU7Q0FDaEIsQ0FBQztJQUdBLFlBQ0UsU0FBK0IsRUFDL0IsYUFBeUIsRUFDekIsaUJBQTJDO1FBRTNDLEtBQUssQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUE7UUFFbEQsTUFBTSxlQUFlLEdBQUcsaUJBQWlCLEVBQUUsT0FBTyxJQUFJLGFBQWEsSUFBSSxFQUFFLENBQUE7UUFDekUsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFNBQVMsRUFBRSxDQUFDO1lBQ1osVUFBVSxFQUFFLFNBQVM7WUFDckIsZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixXQUFXLEVBQUUsQ0FBQztZQUNkLEdBQUcsZUFBZTtTQUNuQixDQUFBO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCLENBQUMsSUFBZ0I7UUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUF1QixDQUFDLENBQUE7UUFDcEQsK0JBQStCO1FBQy9CLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxzQ0FBc0MsSUFBSSw2QkFBNkIsRUFDdkUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQzFCLENBQUE7UUFDSCxDQUFDO1FB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
|
|
567
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL290cC12ZXJpZmljYXRpb24vc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBc0U7QUFDdEUscURBQXlEO0FBRXpELHFEQUF5RDtBQUV6RCxvREFBMkI7QUFDM0IsZ0VBQThCO0FBQzlCLGdFQUF1RTtBQVl2RSxNQUFhLHNCQUF1QixTQUFRLElBQUEscUJBQWEsRUFBQztJQUN4RCxlQUFlLEVBQWYsa0NBQWU7Q0FDaEIsQ0FBQztJQUdBLFlBQ0UsU0FBK0IsRUFDL0IsYUFBeUIsRUFDekIsaUJBQTJDO1FBRTNDLEtBQUssQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUE7UUFFbEQsTUFBTSxlQUFlLEdBQUcsaUJBQWlCLEVBQUUsT0FBTyxJQUFJLGFBQWEsSUFBSSxFQUFFLENBQUE7UUFDekUsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFNBQVMsRUFBRSxDQUFDO1lBQ1osVUFBVSxFQUFFLFNBQVM7WUFDckIsZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixXQUFXLEVBQUUsQ0FBQztZQUNkLEdBQUcsZUFBZTtTQUNuQixDQUFBO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCLENBQUMsSUFBZ0I7UUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUF1QixDQUFDLENBQUE7UUFDcEQsK0JBQStCO1FBQy9CLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxzQ0FBc0MsSUFBSSw2QkFBNkIsRUFDdkUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQzFCLENBQUE7UUFDSCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlLENBQUMsT0FBYztRQUNwQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssdUJBQXVCLENBQUMsQ0FBQTtJQUN4RSxDQUFDO0lBRUQ7O09BRUc7SUFDSywwQkFBMEIsQ0FDaEMsV0FBZ0IsRUFDaEIsSUFBZ0I7UUFFaEIsSUFDRSxXQUFXO1lBQ1gsT0FBTyxXQUFXLEtBQUssUUFBUTtZQUMvQixXQUFXLENBQUMsT0FBTyxFQUNuQixDQUFDO1lBQ0QsT0FBUSxXQUFXLENBQUMsT0FBZSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ25ELENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSCw0QkFBNEIsQ0FDMUIsSUFBZ0IsRUFDaEIsWUFBaUI7UUFFakIsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFBO1FBRS9DLElBQUksYUFBYSxJQUFLLGFBQXFCLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDckQsT0FBTyxhQUFhLENBQUE7UUFDdEIsQ0FBQztRQUVELGlDQUFpQztRQUNqQyxNQUFNLE9BQU8sR0FBRyxDQUFFLFlBQVksRUFBRSxhQUFxQixFQUFFLE9BQU8sSUFBSSxFQUFFLENBQVUsQ0FBQTtRQUM5RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2pELGFBQWEsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBRWxFLElBQUksYUFBYSxJQUFLLGFBQXFCLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDckQsT0FBTyxhQUFhLENBQUE7UUFDdEIsQ0FBQztRQUVELGlDQUFpQztRQUNqQyxJQUFLLFlBQW9CLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDbkMsTUFBTSxhQUFhLEdBQUcsQ0FBRSxZQUFvQixFQUFFLE9BQU8sSUFBSSxFQUFFLENBQVUsQ0FBQTtZQUNyRSxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUE7WUFDN0QsYUFBYSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUMxRSxDQUFDO1FBRUQsOEZBQThGO1FBQzlGLElBQ0UsYUFBYTtZQUNiLENBQUMsSUFBSSxLQUFLLDZCQUFVLENBQUMsd0JBQXdCO2dCQUMzQyxJQUFJLEtBQUssNkJBQVUsQ0FBQyx1QkFBdUIsQ0FBQztZQUM5QyxDQUFFLGFBQXlDLEVBQUUsT0FBTyxFQUNwRCxDQUFDO1lBQ0QsYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQzNCLEVBQUUsRUFDRixhQUF3QyxFQUN4QyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FDUyxDQUFBO1FBQ2pDLENBQUM7UUFFRCxPQUFPLGFBQWEsQ0FBQTtJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILG1CQUFtQixDQUFDLFFBQWEsRUFBRSxPQUFlO1FBQ2hELE9BQU87WUFDTCxHQUFHLEVBQUUsT0FBTztZQUNaLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLGFBQWEsRUFBRSxRQUFRLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxLQUFLLElBQUksVUFBVTtZQUNsRSxjQUFjLEVBQUUsUUFBUSxDQUFDLEtBQUs7U0FDL0IsQ0FBQTtJQUNILENBQUM7SUFHRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDNUIsV0FBbUIsRUFDbkIsT0FBbUI7UUFFbkIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDO1lBQ3BELFdBQVc7WUFDWCxPQUFPO1lBQ1AsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUU7WUFDL0IsV0FBVyxFQUFFLElBQUk7U0FDbEIsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsT0FBMEIsQ0FBQTtRQUM1QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQzdDLE1BQU0sZUFBZSxHQUNuQixPQUFPLGFBQWEsS0FBSyxRQUFRO1lBQ2pDLGFBQWEsS0FBSyxJQUFJO1lBQ3RCLHVCQUF1QixJQUFJLGFBQWE7WUFDdEMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsSUFBSSxFQUFFO1lBQzNDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFUixNQUFNLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxVQUFVO1lBQzlDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUk7WUFDbEUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUVMLElBQUksaUJBQWlCLEdBQUcsZUFBZSxFQUFFLENBQUM7WUFDeEMsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFDN0IsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUN0QixlQUFlLEdBQUcsaUJBQWlCLENBQ3BDLHVDQUF1QyxDQUN6QyxDQUFBO1FBQ0gsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDO1lBQ2hDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFO1lBQ2hDLElBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFO1NBQ2pDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxlQUFlLENBQzNCLFdBQW1CLEVBQ25CLE9BQW1CLEVBQ25CLFVBQWtCLEVBQ2xCLFNBQWU7UUFFZixPQUFPLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDO1lBQ3ZDLFdBQVc7WUFDWCxPQUFPO1lBQ1AsV0FBVyxFQUFFLFVBQVU7WUFDdkIsVUFBVSxFQUFFLFNBQVM7WUFDckIsUUFBUSxFQUFFLENBQUM7U0FDWixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FDdEIsR0FBUSxFQUNSLElBQWdCLEVBQ2hCLFNBQWlCO1FBRWpCLE9BQU8sc0JBQUcsQ0FBQyxJQUFJLENBQ2I7WUFDRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDZCxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7WUFDNUIsSUFBSTtZQUNKLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztTQUNyQixFQUNELFNBQVMsRUFDVDtZQUNFLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLElBQUksRUFBRSxHQUFHO1NBQ3JELENBQ0YsQ0FBQTtJQUNILENBQUM7SUFHRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxLQUFhLEVBQUUsU0FBaUI7UUFDckQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsc0JBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQzVDLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLE9BQWMsQ0FBQTtZQUVwRCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHVCQUF1QixDQUN4QixDQUFBO1lBQ0gsQ0FBQztZQUVELE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFBO1FBQ3RDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIscURBQXFELENBQ3RELENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLGlCQUFpQixDQUM3QixNQUFjLEVBQ2QsV0FBbUI7UUFFbkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFFN0QsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFDM0IsMENBQTBDLENBQzNDLENBQUE7UUFDSCxDQUFDO1FBRUQsSUFBSSxHQUFHLENBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLGdDQUFnQyxDQUNqQyxDQUFBO1FBQ0gsQ0FBQztRQUVELElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQzdCLGdDQUFnQyxDQUNqQyxDQUFBO1FBQ0gsQ0FBQztRQUVELElBQUksR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFDN0IsNENBQTRDLENBQzdDLENBQUE7UUFDSCxDQUFDO1FBRUQsSUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwRCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUM3QixtRUFBbUUsQ0FDcEUsQ0FBQTtRQUNILENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxhQUFhLENBQ3pCLEdBQVEsRUFDUixJQUFZO1FBRVosTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN2QyxNQUFNLE9BQU8sR0FBRyxXQUFXLEtBQUssR0FBRyxDQUFDLFdBQVcsQ0FBQTtRQUUvQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztnQkFDaEMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hCLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRTthQUNyQyxDQUFDLENBQUE7WUFFRixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixxQkFDRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQ3JELHNCQUFzQixDQUN2QixDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFjO1FBQzVDLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDO1lBQ2hDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUU7WUFDeEIsSUFBSSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUU7U0FDbEMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FDYixLQUFxQixFQUNyQixTQUFpQjtRQUVqQixNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQTtRQUU3QixNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUN2RCxLQUFLLEVBQ0wsU0FBUyxDQUNWLENBQUE7UUFFRCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUE7UUFFN0QsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUVuQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFcEMsT0FBTztZQUNMLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXO1lBQzVCLElBQUksRUFBRSxHQUFHLENBQUMsT0FBcUI7U0FDaEMsQ0FBQTtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQ2hCLFdBQW1CLEVBQ25CLE9BQW1CO1FBRW5CLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUMxQztZQUNFLFdBQVc7WUFDWCxPQUFPO1NBQ1IsRUFDRDtZQUNFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7WUFDN0IsSUFBSSxFQUFFLENBQUM7U0FDUixDQUNGLENBQUE7UUFDRCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUE7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBRVcsQUFBTixLQUFLLENBQUMsbUJBQW1CLENBQ2QsYUFBcUMsRUFDdEQsS0FBYTtRQUViLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUE7UUFDN0MsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBO1FBQ3RELENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQzNCLGlEQUFpRCxFQUNqRCxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUM3QixDQUFBO1FBRUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzlDLE9BQU8sR0FBRyxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUE7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBRUcsQUFBTixLQUFLLENBQUMsZ0JBQWdCLENBQ0gsYUFBcUMsRUFDdEQsS0FBYSxFQUNiLElBQVksRUFDWixPQUFtQjtRQUVuQix5QkFBeUI7UUFDekIsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBRXhFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQiw0Q0FBNEMsQ0FDN0MsQ0FBQTtRQUNILENBQUM7UUFFRCwyREFBMkQ7UUFDM0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQzFDO1lBQ0UsV0FBVztZQUNYLE9BQU87WUFDUCxXQUFXLEVBQUUsSUFBSSxFQUFFLHVCQUF1QjtZQUMxQyxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLGNBQWM7U0FDaEQsRUFDRDtZQUNFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7WUFDN0IsSUFBSSxFQUFFLENBQUM7U0FDUixDQUNGLENBQUE7UUFFRCxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFDM0IsK0NBQStDLENBQ2hELENBQUE7UUFDSCxDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRW5CLHlDQUF5QztRQUN6QyxJQUFJLEdBQUcsQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQzdCLG1FQUFtRSxDQUNwRSxDQUFBO1FBQ0gsQ0FBQztRQUVELDBCQUEwQjtRQUMxQixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBRW5DLHVCQUF1QjtRQUN2QixNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFcEMsT0FBTztZQUNMLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXO1lBQzVCLElBQUksRUFBRSxHQUFHLENBQUMsT0FBcUI7U0FDaEMsQ0FBQTtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLDJCQUEyQixDQUMvQixLQUF1QixFQUN2QixTQUFpQixFQUNqQixRQUFnQixFQUNoQixXQUE4QjtRQUU5QixNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQTtRQUNuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUE7UUFFcEIsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBRWpELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUNoQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXRDLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7UUFDNUIsU0FBUyxDQUFDLFVBQVUsQ0FDbEIsU0FBUyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUMsQ0FDL0QsQ0FBQTtRQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUVuRixNQUFNLEtBQUssR0FBRyxzQkFBRyxDQUFDLElBQUksQ0FDcEI7WUFDRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDZCxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7WUFDNUIsSUFBSTtZQUNKLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztZQUNwQixTQUFTLEVBQUUsUUFBUTtZQUNuQixZQUFZLEVBQUUsV0FBVztTQUMxQixFQUNELFNBQVMsRUFDVCxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FDekQsQ0FBQTtRQUVELE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQTtJQUMvQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsd0JBQXdCLENBQ3RCLEtBQWEsRUFDYixTQUFpQjtRQUVqQixJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxzQkFBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUE0QixDQUFBO1lBQ3ZFLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFBO1lBRXRFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDcEUsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsc0NBQXNDLENBQ3ZDLENBQUE7WUFDSCxDQUFDO1lBRUQsT0FBTztnQkFDTCxNQUFNLEVBQUUsTUFBZ0I7Z0JBQ3hCLFdBQVcsRUFBRSxXQUFxQjtnQkFDbEMsSUFBSSxFQUFFLElBQWtCO2dCQUN4QixTQUFTLEVBQUUsU0FBbUI7Z0JBQzlCLFlBQVksRUFBRSxZQUFpQzthQUNoRCxDQUFBO1FBQ0gsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG9FQUFvRSxDQUNyRSxDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQ3ZCLEtBQXVCLEVBQ3ZCLFNBQWlCO1FBRWpCLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFBO1FBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQTtRQUVwQixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFFakQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ2hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFdEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUM1QixTQUFTLENBQUMsVUFBVSxDQUNsQixTQUFTLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQyxDQUMvRCxDQUFBO1FBRUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUNwQyxXQUFXLEVBQ1gsT0FBTyxFQUNQLFVBQVUsRUFDVixTQUFTLENBQ1YsQ0FBQTtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBRXpELE9BQU87WUFDTCxLQUFLO1lBQ0wsVUFBVSxFQUFFLFNBQVM7WUFDckIsSUFBSTtTQUNMLENBQUE7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxZQUFZO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQTtRQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxTQUFTLENBQUE7UUFFcEQsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQ3BDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNwQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUNyRSxDQUFDO2FBQU0sQ0FBQztZQUNOLGdGQUFnRjtZQUNoRixNQUFNLEtBQUssR0FBRyxpQ0FBaUMsQ0FBQTtZQUMvQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUE7WUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2hDLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1lBQ2hFLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQTtRQUNiLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxRQUFRLENBQUMsSUFBWTtRQUMzQixPQUFPLGdCQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDL0QsQ0FBQztJQUVEOztPQUVHO0lBRUcsQUFBTixLQUFLLENBQUMsbUJBQW1CLENBQ04sYUFBcUMsRUFDdEQsVUFBa0I7UUFFbEIsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQTtRQUM3QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUE7UUFDdEQsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FDWjs7b0JBRWMsRUFDZCxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FDbkIsQ0FBQTtJQUNILENBQUM7SUFFRDs7T0FFRztJQUVHLEFBQU4sS0FBSyxDQUFDLG1CQUFtQixDQUNOLGFBQXFDLEVBQ3RELFVBQWtCO1FBRWxCLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUE7UUFDN0MsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBO1FBQ3RELENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQ1o7O29CQUVjLEVBQ2QsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQ25CLENBQUE7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFFRyxBQUFOLEtBQUssQ0FBQyxxQkFBcUIsQ0FDUixhQUFxQyxFQUN0RCxVQUFrQjtRQUVsQixNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFBO1FBQzdDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtRQUN0RCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUNaOztvQkFFYyxFQUNkLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUNwQixDQUFBO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBRUcsQUFBTixLQUFLLENBQUMscUJBQXFCLENBQ1IsYUFBcUMsRUFDdEQsVUFBa0I7UUFFbEIsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQTtRQUM3QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUE7UUFDdEQsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FDWjs7b0JBRWMsRUFDZCxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FDcEIsQ0FBQTtJQUNILENBQUM7SUFFRDs7T0FFRztJQUVHLEFBQU4sS0FBSyxDQUFDLG1DQUFtQyxDQUN0QixhQUFxQyxFQUN0RCxVQUFrQjtRQUVsQixNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFBO1FBQzdDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtRQUN0RCxDQUFDO1FBRUQsaURBQWlEO1FBQ2pELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FDM0I7O29CQUVjLEVBQ2QsQ0FBQyxVQUFVLENBQUMsQ0FDYixDQUFBO1FBRUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRTlDLE9BQU87WUFDTCxjQUFjLEVBQUUsR0FBRyxFQUFFLGNBQWMsSUFBSSxLQUFLO1lBQzVDLGNBQWMsRUFBRSxHQUFHLEVBQUUsY0FBYyxJQUFJLEtBQUs7U0FDN0MsQ0FBQTtJQUNILENBQUM7SUFFRDs7T0FFRztJQUVHLEFBQU4sS0FBSyxDQUFDLDhCQUE4QixDQUNqQixhQUFxQyxFQUN0RCxLQUFhO1FBRWIsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQTtRQUM3QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUE7UUFDdEQsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FDM0I7O3VCQUVpQixFQUNqQixDQUFDLEtBQUssQ0FBQyxDQUNSLENBQUE7UUFFRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFOUMsT0FBTztZQUNMLGNBQWMsRUFBRSxHQUFHLEVBQUUsY0FBYyxJQUFJLEtBQUs7WUFDNUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxjQUFjLElBQUksS0FBSztTQUM3QyxDQUFBO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBRUcsQUFBTixLQUFLLENBQUMsOEJBQThCLENBQ2pCLGFBQXFDLEVBQ3RELEtBQWE7UUFFYixNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFBO1FBQzdDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtRQUN0RCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUMzQjs7dUJBRWlCLEVBQ2pCLENBQUMsS0FBSyxDQUFDLENBQ1IsQ0FBQTtRQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUU5QyxPQUFPO1lBQ0wsY0FBYyxFQUFFLEdBQUcsRUFBRSxjQUFjLElBQUksS0FBSztZQUM1QyxjQUFjLEVBQUUsR0FBRyxFQUFFLGNBQWMsSUFBSSxLQUFLO1NBQzdDLENBQUE7SUFDSCxDQUFDO0NBQ0Y7QUEzdkJELHdEQTJ2QkM7QUF4WWU7SUFEYixJQUFBLHFCQUFhLEdBQUU7SUFFYixXQUFBLElBQUEscUJBQWEsR0FBRSxDQUFBOzs7O2lFQWVqQjtBQU1LO0lBREwsSUFBQSxxQkFBYSxHQUFFO0lBRWIsV0FBQSxJQUFBLHFCQUFhLEdBQUUsQ0FBQTs7Ozs4REF5RGpCO0FBb0pLO0lBREwsSUFBQSxxQkFBYSxHQUFFO0lBRWIsV0FBQSxJQUFBLHFCQUFhLEdBQUUsQ0FBQTs7OztpRUFjakI7QUFNSztJQURMLElBQUEscUJBQWEsR0FBRTtJQUViLFdBQUEsSUFBQSxxQkFBYSxHQUFFLENBQUE7Ozs7aUVBY2pCO0FBTUs7SUFETCxJQUFBLHFCQUFhLEdBQUU7SUFFYixXQUFBLElBQUEscUJBQWEsR0FBRSxDQUFBOzs7O21FQWNqQjtBQU1LO0lBREwsSUFBQSxxQkFBYSxHQUFFO0lBRWIsV0FBQSxJQUFBLHFCQUFhLEdBQUUsQ0FBQTs7OzttRUFjakI7QUFNSztJQURMLElBQUEscUJBQWEsR0FBRTtJQUViLFdBQUEsSUFBQSxxQkFBYSxHQUFFLENBQUE7Ozs7aUZBc0JqQjtBQU1LO0lBREwsSUFBQSxxQkFBYSxHQUFFO0lBRWIsV0FBQSxJQUFBLHFCQUFhLEdBQUUsQ0FBQTs7Ozs0RUFxQmpCO0FBTUs7SUFETCxJQUFBLHFCQUFhLEdBQUU7SUFFYixXQUFBLElBQUEscUJBQWEsR0FBRSxDQUFBOzs7OzRFQXFCakIifQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PHONEPASS_PROVIDER_ID = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const service_1 = require("./service");
|
|
6
|
+
exports.PHONEPASS_PROVIDER_ID = "phonepass";
|
|
7
|
+
const services = [service_1.PhonepassAuthService];
|
|
8
|
+
exports.default = (0, utils_1.ModuleProvider)(utils_1.Modules.AUTH, { services });
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3Bob25lcGFzcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBbUU7QUFDbkUsdUNBQWdEO0FBRW5DLFFBQUEscUJBQXFCLEdBQUcsV0FBVyxDQUFBO0FBRWhELE1BQU0sUUFBUSxHQUFHLENBQUMsOEJBQW9CLENBQUMsQ0FBQTtBQUV2QyxrQkFBZSxJQUFBLHNCQUFjLEVBQUMsZUFBTyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUEifQ==
|
|
@@ -0,0 +1,133 @@
|
|
|
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.PhonepassAuthService = void 0;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const scrypt_kdf_1 = __importDefault(require("scrypt-kdf"));
|
|
9
|
+
const PHONE_REGEX = /^\+?[0-9]{8,15}$/;
|
|
10
|
+
class PhonepassAuthService extends utils_1.AbstractAuthModuleProvider {
|
|
11
|
+
constructor({ logger }) {
|
|
12
|
+
// @ts-ignore
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.logger_ = logger;
|
|
15
|
+
}
|
|
16
|
+
async hashPassword(password) {
|
|
17
|
+
const passwordHash = await scrypt_kdf_1.default.kdf(password, { logN: 14, r: 8, p: 1 });
|
|
18
|
+
return passwordHash.toString("base64");
|
|
19
|
+
}
|
|
20
|
+
async verifyPassword(password, hash) {
|
|
21
|
+
const buf = Buffer.from(hash, "base64");
|
|
22
|
+
return scrypt_kdf_1.default.verify(buf, password);
|
|
23
|
+
}
|
|
24
|
+
async authenticate(userData, authIdentityService) {
|
|
25
|
+
const { phone, password } = (userData.body ?? {});
|
|
26
|
+
if (!phone || typeof phone !== "string") {
|
|
27
|
+
return { success: false, error: "Phone should be a string" };
|
|
28
|
+
}
|
|
29
|
+
if (!password || typeof password !== "string") {
|
|
30
|
+
return { success: false, error: "Password should be a string" };
|
|
31
|
+
}
|
|
32
|
+
const normalizedPhone = phone.trim();
|
|
33
|
+
let authIdentity;
|
|
34
|
+
try {
|
|
35
|
+
authIdentity = await authIdentityService.retrieve({ entity_id: normalizedPhone });
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (error.type === utils_1.MedusaError.Types.NOT_FOUND) {
|
|
39
|
+
return { success: false, error: "Invalid phone or password" };
|
|
40
|
+
}
|
|
41
|
+
return { success: false, error: error.message };
|
|
42
|
+
}
|
|
43
|
+
const providerIdentity = authIdentity.provider_identities?.find((pi) => pi.provider === "phonepass");
|
|
44
|
+
const passwordHash = providerIdentity?.provider_metadata?.password;
|
|
45
|
+
if (typeof passwordHash === "string") {
|
|
46
|
+
const valid = await this.verifyPassword(password, passwordHash);
|
|
47
|
+
if (valid) {
|
|
48
|
+
const copy = JSON.parse(JSON.stringify(authIdentity));
|
|
49
|
+
const pi = copy.provider_identities?.find((p) => p.provider === "phonepass");
|
|
50
|
+
if (pi?.provider_metadata?.password) {
|
|
51
|
+
delete pi.provider_metadata.password;
|
|
52
|
+
}
|
|
53
|
+
return { success: true, authIdentity: copy };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return { success: false, error: "Invalid phone or password" };
|
|
57
|
+
}
|
|
58
|
+
async register(userData, authIdentityService) {
|
|
59
|
+
const { phone, password } = (userData.body ?? {});
|
|
60
|
+
if (!phone || typeof phone !== "string") {
|
|
61
|
+
return { success: false, error: "Phone should be a string" };
|
|
62
|
+
}
|
|
63
|
+
if (!password || typeof password !== "string") {
|
|
64
|
+
return { success: false, error: "Password should be a string" };
|
|
65
|
+
}
|
|
66
|
+
const normalizedPhone = phone.trim();
|
|
67
|
+
if (!PHONE_REGEX.test(normalizedPhone)) {
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
error: "Invalid phone number format. Must be 8–15 digits, optionally prefixed with +",
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// Check if phone is already registered
|
|
74
|
+
try {
|
|
75
|
+
const existing = await authIdentityService.retrieve({ entity_id: normalizedPhone });
|
|
76
|
+
if (existing?.app_metadata && Object.keys(existing.app_metadata).length > 0) {
|
|
77
|
+
return { success: false, error: "Phone number is already registered" };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (error.type !== utils_1.MedusaError.Types.NOT_FOUND) {
|
|
82
|
+
return { success: false, error: error.message };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
let authIdentity;
|
|
86
|
+
try {
|
|
87
|
+
const passwordHash = await this.hashPassword(password);
|
|
88
|
+
authIdentity = await authIdentityService.create({
|
|
89
|
+
entity_id: normalizedPhone,
|
|
90
|
+
provider_metadata: { password: passwordHash },
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
return { success: false, error: error.message };
|
|
95
|
+
}
|
|
96
|
+
const copy = JSON.parse(JSON.stringify(authIdentity));
|
|
97
|
+
const pi = copy.provider_identities?.find((p) => p.provider === "phonepass");
|
|
98
|
+
if (pi?.provider_metadata?.password) {
|
|
99
|
+
delete pi.provider_metadata.password;
|
|
100
|
+
}
|
|
101
|
+
return { success: true, authIdentity: copy };
|
|
102
|
+
}
|
|
103
|
+
async validateCallback(_userData, _authIdentityService) {
|
|
104
|
+
return {
|
|
105
|
+
success: false,
|
|
106
|
+
error: "Callback authentication is not supported for phonepass",
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
async update(data, authIdentityService) {
|
|
110
|
+
const { phone, password } = data;
|
|
111
|
+
if (!phone) {
|
|
112
|
+
return { success: false, error: "Cannot update phonepass identity without phone" };
|
|
113
|
+
}
|
|
114
|
+
if (!password || typeof password !== "string") {
|
|
115
|
+
return { success: true };
|
|
116
|
+
}
|
|
117
|
+
let authIdentity;
|
|
118
|
+
try {
|
|
119
|
+
const passwordHash = await this.hashPassword(password);
|
|
120
|
+
authIdentity = await authIdentityService.update(phone, {
|
|
121
|
+
provider_metadata: { password: passwordHash },
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
return { success: false, error: error.message };
|
|
126
|
+
}
|
|
127
|
+
return { success: true, authIdentity };
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.PhonepassAuthService = PhonepassAuthService;
|
|
131
|
+
PhonepassAuthService.identifier = "phonepass";
|
|
132
|
+
PhonepassAuthService.DISPLAY_NAME = "Phone/Password Authentication";
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvcGhvbmVwYXNzL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBTUEscURBQW1GO0FBQ25GLDREQUFrQztBQUVsQyxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQTtBQU10QyxNQUFhLG9CQUFxQixTQUFRLGtDQUEwQjtJQU1sRSxZQUFZLEVBQUUsTUFBTSxFQUF3QjtRQUMxQyxhQUFhO1FBQ2IsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUE7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUE7SUFDdkIsQ0FBQztJQUVPLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBZ0I7UUFDekMsTUFBTSxZQUFZLEdBQUcsTUFBTSxvQkFBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDNUUsT0FBTyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3hDLENBQUM7SUFFTyxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQWdCLEVBQUUsSUFBWTtRQUN6RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUN2QyxPQUFPLG9CQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUN4QyxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FDaEIsUUFBNkIsRUFDN0IsbUJBQWdEO1FBRWhELE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FHL0MsQ0FBQTtRQUVELElBQUksQ0FBQyxLQUFLLElBQUksT0FB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
|