customer-registration 0.0.111 → 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/admin/index.js +3249 -2
- package/.medusa/server/src/admin/index.mjs +3232 -2
- package/.medusa/server/src/api/admin/account-deletion-requests/route.js +30 -0
- package/.medusa/server/src/api/admin/account-deletion-requests/validators.js +12 -0
- package/.medusa/server/src/api/auth/customer/emailpass/reset-password/route.js +1 -26
- package/.medusa/server/src/api/auth/customer/emailpass/route.js +24 -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/guard-account-deletion.js +29 -0
- 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 +30 -0
- package/.medusa/server/src/api/store/customers/account-deletion/cancel-confirm/route.js +36 -0
- package/.medusa/server/src/api/store/customers/account-deletion/cancel-request/route.js +55 -0
- package/.medusa/server/src/api/store/customers/account-deletion/confirm/route.js +43 -0
- package/.medusa/server/src/api/store/customers/account-deletion/request/route.js +40 -0
- package/.medusa/server/src/api/store/customers/account-deletion/validators.js +27 -0
- 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 +44 -13
- package/.medusa/server/src/jobs/process-account-deletions.js +69 -0
- package/.medusa/server/src/modules/account-deletion-request/index.js +17 -0
- package/.medusa/server/src/modules/account-deletion-request/migrations/Migration20250221000000CreateAccountDeletionRequestTable.js +42 -0
- package/.medusa/server/src/modules/account-deletion-request/migrations/Migration20250221100000AddCompletedStatusToAccountDeletionRequest.js +30 -0
- package/.medusa/server/src/modules/account-deletion-request/models/account-deletion-request.js +26 -0
- package/.medusa/server/src/modules/account-deletion-request/service.js +90 -0
- package/.medusa/server/src/modules/otp-verification/migrations/Migration20250221000000AddAccountDeletionOtpPurposes.js +35 -0
- package/.medusa/server/src/modules/otp-verification/models/otp-verification.js +9 -2
- package/.medusa/server/src/modules/otp-verification/service.js +79 -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/resolve-channel-config-step.js +10 -1
- 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 +389 -147
- package/package.json +12 -3
- package/.medusa/server/src/subscribers/customer-updated.js +0 -100
|
@@ -6,15 +6,12 @@ const utils_1 = require("@medusajs/framework/utils");
|
|
|
6
6
|
const password_validation_1 = require("../utils/password-validation");
|
|
7
7
|
const password_hashing_1 = require("../utils/password-hashing");
|
|
8
8
|
const validatePasswordStep = (0, workflows_sdk_1.createStep)("validate-password", async ({ new_password, confirm_password }) => {
|
|
9
|
-
// Validate password strength
|
|
10
9
|
(0, password_validation_1.validatePasswordStrength)(new_password);
|
|
11
|
-
// Validate passwords match
|
|
12
10
|
(0, password_validation_1.validatePasswordMatch)(new_password, confirm_password);
|
|
13
11
|
return new workflows_sdk_1.StepResponse({ validated: true });
|
|
14
12
|
});
|
|
15
13
|
const verifyCustomerStep = (0, workflows_sdk_1.createStep)("verify-customer", async ({ customer_id }, { container }) => {
|
|
16
14
|
const customerService = container.resolve(utils_1.Modules.CUSTOMER);
|
|
17
|
-
// Verify customer exists
|
|
18
15
|
const customer = await customerService.retrieveCustomer(customer_id);
|
|
19
16
|
if (!customer) {
|
|
20
17
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found");
|
|
@@ -22,96 +19,75 @@ const verifyCustomerStep = (0, workflows_sdk_1.createStep)("verify-customer", as
|
|
|
22
19
|
return new workflows_sdk_1.StepResponse({ customer_id, verified: true });
|
|
23
20
|
});
|
|
24
21
|
const verifyOldPasswordStep = (0, workflows_sdk_1.createStep)("verify-old-password", async ({ customer_id, old_password }, { container }) => {
|
|
25
|
-
// Get customer to retrieve email
|
|
26
22
|
const customerService = container.resolve(utils_1.Modules.CUSTOMER);
|
|
27
23
|
const customer = await customerService.retrieveCustomer(customer_id);
|
|
28
|
-
if (!customer
|
|
29
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found
|
|
24
|
+
if (!customer) {
|
|
25
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found");
|
|
26
|
+
}
|
|
27
|
+
// Resolve provider and entity_id — supports both emailpass and phonepass
|
|
28
|
+
const provider = customer.email ? "emailpass" : "phonepass";
|
|
29
|
+
const entity_id = customer.email
|
|
30
|
+
? customer.email.toLowerCase()
|
|
31
|
+
: customer.phone;
|
|
32
|
+
if (!entity_id) {
|
|
33
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer has no email or phone — cannot verify password");
|
|
30
34
|
}
|
|
31
|
-
// Get PostgreSQL connection (Knex instance) from container
|
|
32
35
|
const knex = container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
|
|
33
|
-
|
|
34
|
-
const providerIdentityResult = await knex.raw(`SELECT id, provider_metadata
|
|
36
|
+
const result = await knex.raw(`SELECT provider_metadata
|
|
35
37
|
FROM provider_identity
|
|
36
|
-
WHERE entity_id = ? AND provider =
|
|
37
|
-
LIMIT 1`, [
|
|
38
|
-
const providerIdentity =
|
|
38
|
+
WHERE entity_id = ? AND provider = ?
|
|
39
|
+
LIMIT 1`, [entity_id, provider]);
|
|
40
|
+
const providerIdentity = result.rows?.[0] ?? result[0]?.[0];
|
|
39
41
|
if (!providerIdentity) {
|
|
40
42
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Provider identity not found for customer");
|
|
41
43
|
}
|
|
42
|
-
|
|
43
|
-
const providerMetadata = providerIdentity.provider_metadata || {};
|
|
44
|
-
const passwordHash = providerMetadata.password;
|
|
44
|
+
const passwordHash = providerIdentity.provider_metadata?.password;
|
|
45
45
|
if (!passwordHash) {
|
|
46
46
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "No password set for this account");
|
|
47
47
|
}
|
|
48
|
-
// Verify old password using scrypt (matching Medusa's format)
|
|
49
48
|
const isValid = await (0, password_hashing_1.verifyPassword)(old_password, passwordHash);
|
|
50
49
|
if (!isValid) {
|
|
51
50
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Current password is incorrect");
|
|
52
51
|
}
|
|
53
52
|
return new workflows_sdk_1.StepResponse({ verified: true });
|
|
54
53
|
});
|
|
55
|
-
const
|
|
56
|
-
// Use scrypt to match Medusa's password hashing format
|
|
57
|
-
const passwordHash = await (0, password_hashing_1.hashPassword)(password);
|
|
58
|
-
return new workflows_sdk_1.StepResponse({ password_hash: passwordHash });
|
|
59
|
-
});
|
|
60
|
-
const updatePasswordStep = (0, workflows_sdk_1.createStep)("update-password", async ({ customer_id, password_hash }, { container }) => {
|
|
61
|
-
// Get customer to retrieve email
|
|
54
|
+
const changePasswordUpdateStep = (0, workflows_sdk_1.createStep)("change-password-update", async ({ customer_id, new_password }, { container }) => {
|
|
62
55
|
const customerService = container.resolve(utils_1.Modules.CUSTOMER);
|
|
63
56
|
const customer = await customerService.retrieveCustomer(customer_id);
|
|
64
|
-
if (!customer
|
|
65
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found
|
|
57
|
+
if (!customer) {
|
|
58
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found");
|
|
66
59
|
}
|
|
67
|
-
//
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
60
|
+
// Resolve provider and entity_id — supports both emailpass and phonepass
|
|
61
|
+
const provider = customer.email ? "emailpass" : "phonepass";
|
|
62
|
+
const entity_id = customer.email
|
|
63
|
+
? customer.email.toLowerCase()
|
|
64
|
+
: customer.phone;
|
|
65
|
+
if (!entity_id) {
|
|
66
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer has no email or phone — cannot update password");
|
|
67
|
+
}
|
|
68
|
+
// Delegate to AUTH module — it handles hashing internally
|
|
69
|
+
const authService = container.resolve(utils_1.Modules.AUTH);
|
|
70
|
+
const updateResult = await authService.updateProvider(provider, {
|
|
71
|
+
entity_id,
|
|
72
|
+
password: new_password,
|
|
73
|
+
});
|
|
74
|
+
if (!updateResult.success) {
|
|
75
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, updateResult.error || "Failed to update password");
|
|
77
76
|
}
|
|
78
|
-
// Update password hash in provider_metadata
|
|
79
|
-
await knex.raw(`UPDATE provider_identity
|
|
80
|
-
SET provider_metadata = jsonb_set(
|
|
81
|
-
COALESCE(provider_metadata, '{}'::jsonb),
|
|
82
|
-
'{password}',
|
|
83
|
-
to_jsonb(?::text)
|
|
84
|
-
),
|
|
85
|
-
updated_at = NOW()
|
|
86
|
-
WHERE id = ?`, [password_hash, providerIdentity.id]);
|
|
87
77
|
return new workflows_sdk_1.StepResponse({ customer_id, success: true });
|
|
88
78
|
});
|
|
89
79
|
exports.changePasswordWorkflow = (0, workflows_sdk_1.createWorkflow)("change-password", (input) => {
|
|
90
|
-
// Validate password strength and match (runs during execution)
|
|
91
80
|
validatePasswordStep({
|
|
92
81
|
new_password: input.new_password,
|
|
93
82
|
confirm_password: input.confirm_password,
|
|
94
83
|
});
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
});
|
|
99
|
-
// Verify old password
|
|
100
|
-
verifyOldPasswordStep({
|
|
84
|
+
const { customer_id } = verifyCustomerStep({ customer_id: input.customer_id });
|
|
85
|
+
verifyOldPasswordStep({ customer_id, old_password: input.old_password });
|
|
86
|
+
const { customer_id: updated_customer_id } = changePasswordUpdateStep({
|
|
101
87
|
customer_id,
|
|
102
|
-
|
|
103
|
-
});
|
|
104
|
-
// Hash the new password
|
|
105
|
-
const { password_hash } = hashPasswordStep({ password: input.new_password });
|
|
106
|
-
// Update password hash in database
|
|
107
|
-
const { customer_id: updated_customer_id } = updatePasswordStep({
|
|
108
|
-
customer_id,
|
|
109
|
-
password_hash,
|
|
110
|
-
});
|
|
111
|
-
return new workflows_sdk_1.WorkflowResponse({
|
|
112
|
-
customer_id: updated_customer_id,
|
|
113
|
-
success: true,
|
|
88
|
+
new_password: input.new_password,
|
|
114
89
|
});
|
|
90
|
+
return new workflows_sdk_1.WorkflowResponse({ customer_id: updated_customer_id, success: true });
|
|
115
91
|
});
|
|
116
92
|
exports.default = exports.changePasswordWorkflow;
|
|
117
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlLXBhc3N3b3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9jaGFuZ2UtcGFzc3dvcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBSzBDO0FBQzFDLHFEQUlrQztBQUVsQyxzRUFBOEY7QUFDOUYsZ0VBQTBEO0FBUzFELE1BQU0sb0JBQW9CLEdBQUcsSUFBQSwwQkFBVSxFQUNyQyxtQkFBbUIsRUFDbkIsS0FBSyxFQUNILEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFzRCxFQUN0RixFQUFFO0lBQ0YsSUFBQSw4Q0FBd0IsRUFBQyxZQUFZLENBQUMsQ0FBQTtJQUN0QyxJQUFBLDJDQUFxQixFQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO0lBQ3JELE9BQU8sSUFBSSw0QkFBWSxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7QUFDOUMsQ0FBQyxDQUNGLENBQUE7QUFFRCxNQUFNLGtCQUFrQixHQUFHLElBQUEsMEJBQVUsRUFDbkMsaUJBQWlCLEVBQ2pCLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBMkIsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDaEUsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBeUIsZUFBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ25GLE1BQU0sUUFBUSxHQUFHLE1BQU0sZUFBZSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3BFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSxtQkFBVyxDQUFDLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO0lBQzFFLENBQUM7SUFDRCxPQUFPLElBQUksNEJBQVksQ0FBQyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtBQUMxRCxDQUFDLENBQ0YsQ0FBQTtBQUVELE1BQU0scUJBQXFCLEdBQUcsSUFBQSwwQkFBVSxFQUN0QyxxQkFBcUIsRUFDckIsS0FBSyxFQUNILEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBaUQsRUFDNUUsRUFBRSxTQUFTLEVBQUUsRUFDYixFQUFFO0lBQ0YsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBeUIsZUFBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ25GLE1BQU0sUUFBUSxHQUFHLE1BQU0sZUFBZSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBRXBFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSxtQkFBVyxDQUFDLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO0lBQzFFLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUE7SUFDM0QsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUs7UUFDOUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFO1FBQzlCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFBO0lBRWxCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQzNCLHlEQUF5RCxDQUMxRCxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDdkUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUMzQjs7O2VBR1MsRUFDVCxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FDdEIsQ0FBQTtJQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRTNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQzNCLDBDQUEwQyxDQUMzQyxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQTtJQUVqRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsa0NBQWtDLENBQ25DLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFBLGlDQUFjLEVBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFBO0lBQ2hFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLCtCQUErQixDQUNoQyxDQUFBO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7QUFDN0MsQ0FBQyxDQUNGLENBQUE7QUFFRCxNQUFNLHdCQUF3QixHQUFHLElBQUEsMEJBQVUsRUFDekMsd0JBQXdCLEVBQ3hCLEtBQUssRUFDSCxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQWlELEVBQzVFLEVBQUUsU0FBUyxFQUFFLEVBQ2IsRUFBRTtJQUNGLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQXlCLGVBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNuRixNQUFNLFFBQVEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUVwRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksbUJBQVcsQ0FBQyxtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFBO0lBQzNELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxLQUFLO1FBQzlCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtRQUM5QixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQTtJQUVsQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQix5REFBeUQsQ0FDMUQsQ0FBQTtJQUNILENBQUM7SUFFRCwwREFBMEQ7SUFDMUQsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDbkQsTUFBTSxZQUFZLEdBQUcsTUFBTSxXQUFXLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRTtRQUM5RCxTQUFTO1FBQ1QsUUFBUSxFQUFFLFlBQVk7S0FDdkIsQ0FBQyxDQUFBO0lBRUYsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQ2xDLFlBQVksQ0FBQyxLQUFLLElBQUksMkJBQTJCLENBQ2xELENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLDRCQUFZLENBQUMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7QUFDekQsQ0FBQyxDQUNGLENBQUE7QUFPWSxRQUFBLHNCQUFzQixHQUFHLElBQUEsOEJBQWMsRUFDbEQsaUJBQWlCLEVBQ2pCLENBQUMsS0FBMEIsRUFBMEMsRUFBRTtJQUNyRSxvQkFBb0IsQ0FBQztRQUNuQixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7UUFDaEMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtLQUN6QyxDQUFDLENBQUE7SUFFRixNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUE7SUFFOUUscUJBQXFCLENBQUMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFBO0lBRXhFLE1BQU0sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyx3QkFBd0IsQ0FBQztRQUNwRSxXQUFXO1FBQ1gsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO0tBQ2pDLENBQUMsQ0FBQTtJQUVGLE9BQU8sSUFBSSxnQ0FBZ0IsQ0FBQyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtBQUNsRixDQUFDLENBQ0YsQ0FBQTtBQUVELGtCQUFlLDhCQUFzQixDQUFBIn0=
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sendContactChangeOtpWorkflow = void 0;
|
|
4
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
+
const steps_1 = require("./steps");
|
|
6
|
+
/**
|
|
7
|
+
* Generates an OTP whose JWT payload contains the `new_value` (new phone or
|
|
8
|
+
* email) and sends it to that new contact address — NOT the current one on
|
|
9
|
+
* the customer record. No metadata staging is required.
|
|
10
|
+
*/
|
|
11
|
+
exports.sendContactChangeOtpWorkflow = (0, workflows_sdk_1.createWorkflow)("send-contact-change-otp", (input) => {
|
|
12
|
+
const { customer } = (0, steps_1.retrieveCustomerStep)({ customer_id: input.customer_id });
|
|
13
|
+
const { channelConfig } = (0, steps_1.resolveChannelConfigStep)({ type: input.otp_type });
|
|
14
|
+
const { token, expires_at, code } = (0, steps_1.generateContactChangeOtpStep)({
|
|
15
|
+
customer_id: input.customer_id,
|
|
16
|
+
type: input.otp_type,
|
|
17
|
+
new_value: input.new_value,
|
|
18
|
+
contact_type: input.contact_type,
|
|
19
|
+
});
|
|
20
|
+
const { templateData } = (0, steps_1.prepareTemplateDataStep)({
|
|
21
|
+
customer,
|
|
22
|
+
otpCode: code,
|
|
23
|
+
});
|
|
24
|
+
const { renderedContent } = (0, steps_1.loadTemplateStep)({
|
|
25
|
+
templatePath: channelConfig.template || null,
|
|
26
|
+
templateData,
|
|
27
|
+
});
|
|
28
|
+
// Send OTP to the NEW contact value, not customer.phone / customer.email
|
|
29
|
+
const notificationInput = (0, workflows_sdk_1.transform)({ input, channelConfig, templateData, renderedContent }, (data) => ({
|
|
30
|
+
to: data.input.new_value,
|
|
31
|
+
channel: data.channelConfig.channel,
|
|
32
|
+
channelConfig: data.channelConfig,
|
|
33
|
+
templateData: data.templateData,
|
|
34
|
+
renderedContent: data.renderedContent,
|
|
35
|
+
contactType: data.input.contact_type,
|
|
36
|
+
}));
|
|
37
|
+
(0, steps_1.sendNotificationStep)(notificationInput);
|
|
38
|
+
return new workflows_sdk_1.WorkflowResponse({ token, expires_at });
|
|
39
|
+
});
|
|
40
|
+
exports.default = exports.sendContactChangeOtpWorkflow;
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1jb250YWN0LWNoYW5nZS1vdHAtd29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3NlbmQtY29udGFjdC1jaGFuZ2Utb3RwLXdvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUkwQztBQUUxQyxtQ0FPZ0I7QUFjaEI7Ozs7R0FJRztBQUNVLFFBQUEsNEJBQTRCLEdBQUcsSUFBQSw4QkFBYyxFQUN4RCx5QkFBeUIsRUFDekIsQ0FBQyxLQUFnQyxFQUFnRCxFQUFFO0lBQ2pGLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFBLDRCQUFvQixFQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBRTdFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxJQUFBLGdDQUF3QixFQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBRTVFLE1BQU0sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUEsb0NBQTRCLEVBQUM7UUFDL0QsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1FBQzlCLElBQUksRUFBRSxLQUFLLENBQUMsUUFBUTtRQUNwQixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7UUFDMUIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO0tBQ2pDLENBQUMsQ0FBQTtJQUVGLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFBLCtCQUF1QixFQUFDO1FBQy9DLFFBQVE7UUFDUixPQUFPLEVBQUUsSUFBSTtLQUNkLENBQUMsQ0FBQTtJQUVGLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxJQUFBLHdCQUFnQixFQUFDO1FBQzNDLFlBQVksRUFBRSxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUk7UUFDNUMsWUFBWTtLQUNiLENBQUMsQ0FBQTtJQUVGLHlFQUF5RTtJQUN6RSxNQUFNLGlCQUFpQixHQUFHLElBQUEseUJBQVMsRUFDakMsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsRUFDdkQsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDVCxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTO1FBQ3hCLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU87UUFDbkMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1FBQ2pDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtRQUMvQixlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7UUFDckMsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWTtLQUNyQyxDQUFDLENBQ0gsQ0FBQTtJQUNELElBQUEsNEJBQW9CLEVBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUV2QyxPQUFPLElBQUksZ0NBQWdCLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQTtBQUNwRCxDQUFDLENBQ0YsQ0FBQTtBQUVELGtCQUFlLG9DQUE0QixDQUFBIn0=
|
|
@@ -7,7 +7,13 @@ exports.determineContactMethodStep = (0, workflows_sdk_1.createStep)("determine-
|
|
|
7
7
|
const { customer, channelConfig } = input;
|
|
8
8
|
const channelName = channelConfig.channel.toLowerCase();
|
|
9
9
|
const contactType = channelName === "email" ? "email" : "phone";
|
|
10
|
-
|
|
10
|
+
let contactValue;
|
|
11
|
+
if (contactType === "email") {
|
|
12
|
+
contactValue = customer.email;
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
contactValue = customer.phone;
|
|
16
|
+
}
|
|
11
17
|
if (!contactValue) {
|
|
12
18
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, contactType === "email"
|
|
13
19
|
? "Customer email is required for this verification type"
|
|
@@ -18,4 +24,4 @@ exports.determineContactMethodStep = (0, workflows_sdk_1.createStep)("determine-
|
|
|
18
24
|
contactType,
|
|
19
25
|
});
|
|
20
26
|
});
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZXJtaW5lLWNvbnRhY3QtbWV0aG9kLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL2RldGVybWluZS1jb250YWN0LW1ldGhvZC1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSxxREFBdUQ7QUFZMUMsUUFBQSwwQkFBMEIsR0FBRyxJQUFBLDBCQUFVLEVBQ2xELDBCQUEwQixFQUMxQixLQUFLLEVBQ0gsS0FBa0MsRUFDbUIsRUFBRTtJQUN2RCxNQUFNLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUV6QyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ3ZELE1BQU0sV0FBVyxHQUNmLFdBQVcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFBO0lBRTdDLElBQUksWUFBZ0MsQ0FBQTtJQUVwQyxJQUFJLFdBQVcsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUM1QixZQUFZLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQTtJQUMvQixDQUFDO1NBQU0sQ0FBQztRQUNOLFlBQVksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFBO0lBQy9CLENBQUM7SUFFRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsV0FBVyxLQUFLLE9BQU87WUFDckIsQ0FBQyxDQUFDLHVEQUF1RDtZQUN6RCxDQUFDLENBQUMsOERBQThELENBQ25FLENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLDRCQUFZLENBQStCO1FBQ3BELFlBQVk7UUFDWixXQUFXO0tBQ1osQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUNGLENBQUEifQ==
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateContactChangeOtpStep = void 0;
|
|
4
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const otp_verification_1 = require("../../modules/otp-verification");
|
|
7
|
+
/**
|
|
8
|
+
* Generates an OTP for a contact-change request.
|
|
9
|
+
* The new_value and contact_type are embedded in the signed JWT so that no
|
|
10
|
+
* metadata staging on the customer record is required.
|
|
11
|
+
*/
|
|
12
|
+
exports.generateContactChangeOtpStep = (0, workflows_sdk_1.createStep)("generate-contact-change-otp", async (input, { container }) => {
|
|
13
|
+
const config = container.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
14
|
+
const jwtSecret = config?.projectConfig
|
|
15
|
+
?.http?.jwtSecret || "supersecret";
|
|
16
|
+
const otpService = container.resolve(otp_verification_1.OTP_VERIFICATION_MODULE);
|
|
17
|
+
const otpResult = await otpService.generateOtpForContactChange({ customer_id: input.customer_id, type: input.type }, jwtSecret, input.new_value, input.contact_type);
|
|
18
|
+
return new workflows_sdk_1.StepResponse({
|
|
19
|
+
token: otpResult.token,
|
|
20
|
+
expires_at: otpResult.expires_at,
|
|
21
|
+
code: otpResult.code,
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtY29udGFjdC1jaGFuZ2Utb3RwLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL2dlbmVyYXRlLWNvbnRhY3QtY2hhbmdlLW90cC1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSxxREFBcUU7QUFDckUscUVBQXdFO0FBaUJ4RTs7OztHQUlHO0FBQ1UsUUFBQSw0QkFBNEIsR0FBRyxJQUFBLDBCQUFVLEVBQ3BELDZCQUE2QixFQUM3QixLQUFLLEVBQUUsS0FBb0MsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDNUQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUN6RSxNQUFNLFNBQVMsR0FDWixNQUFNLEVBQUUsYUFBNkU7UUFDcEYsRUFBRSxJQUFJLEVBQUUsU0FBUyxJQUFJLGFBQWEsQ0FBQTtJQUV0QyxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUF5QiwwQ0FBdUIsQ0FBQyxDQUFBO0lBRXJGLE1BQU0sU0FBUyxHQUFHLE1BQU0sVUFBVSxDQUFDLDJCQUEyQixDQUM1RCxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQ3BELFNBQVMsRUFDVCxLQUFLLENBQUMsU0FBUyxFQUNmLEtBQUssQ0FBQyxZQUFZLENBQ25CLENBQUE7SUFFRCxPQUFPLElBQUksNEJBQVksQ0FBaUM7UUFDdEQsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLO1FBQ3RCLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVTtRQUNoQyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7S0FDckIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUNGLENBQUEifQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.updatePasswordStep = exports.findCustomerByEmailStep = exports.prepareTemplateDataStep = exports.generateOtpStep = exports.determineContactMethodStep = exports.retrieveCustomerStep = exports.sendNotificationStep = exports.loadTemplateStep = exports.resolveChannelConfigStep = void 0;
|
|
3
|
+
exports.syncPhonepassEntityIdStep = exports.updatePasswordStep = exports.findCustomerByEmailStep = exports.prepareTemplateDataStep = exports.generateContactChangeOtpStep = exports.generateOtpStep = exports.determineContactMethodStep = exports.retrieveCustomerStep = exports.sendNotificationStep = exports.loadTemplateStep = exports.resolveChannelConfigStep = void 0;
|
|
4
4
|
var resolve_channel_config_step_1 = require("./resolve-channel-config-step");
|
|
5
5
|
Object.defineProperty(exports, "resolveChannelConfigStep", { enumerable: true, get: function () { return resolve_channel_config_step_1.resolveChannelConfigStep; } });
|
|
6
6
|
var load_template_step_1 = require("./load-template-step");
|
|
@@ -13,10 +13,14 @@ var determine_contact_method_step_1 = require("./determine-contact-method-step")
|
|
|
13
13
|
Object.defineProperty(exports, "determineContactMethodStep", { enumerable: true, get: function () { return determine_contact_method_step_1.determineContactMethodStep; } });
|
|
14
14
|
var generate_otp_step_1 = require("./generate-otp-step");
|
|
15
15
|
Object.defineProperty(exports, "generateOtpStep", { enumerable: true, get: function () { return generate_otp_step_1.generateOtpStep; } });
|
|
16
|
+
var generate_contact_change_otp_step_1 = require("./generate-contact-change-otp-step");
|
|
17
|
+
Object.defineProperty(exports, "generateContactChangeOtpStep", { enumerable: true, get: function () { return generate_contact_change_otp_step_1.generateContactChangeOtpStep; } });
|
|
16
18
|
var prepare_template_data_step_1 = require("./prepare-template-data-step");
|
|
17
19
|
Object.defineProperty(exports, "prepareTemplateDataStep", { enumerable: true, get: function () { return prepare_template_data_step_1.prepareTemplateDataStep; } });
|
|
18
20
|
var find_customer_by_email_step_1 = require("./find-customer-by-email-step");
|
|
19
21
|
Object.defineProperty(exports, "findCustomerByEmailStep", { enumerable: true, get: function () { return find_customer_by_email_step_1.findCustomerByEmailStep; } });
|
|
20
22
|
var update_password_step_1 = require("./update-password-step");
|
|
21
23
|
Object.defineProperty(exports, "updatePasswordStep", { enumerable: true, get: function () { return update_password_step_1.updatePasswordStep; } });
|
|
22
|
-
|
|
24
|
+
var sync_phonepass_entity_id_step_1 = require("./sync-phonepass-entity-id-step");
|
|
25
|
+
Object.defineProperty(exports, "syncPhonepassEntityIdStep", { enumerable: true, get: function () { return sync_phonepass_entity_id_step_1.syncPhonepassEntityIdStep; } });
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZFQUF3RTtBQUEvRCx1SUFBQSx3QkFBd0IsT0FBQTtBQUNqQywyREFBdUQ7QUFBOUMsc0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIsbUVBQStEO0FBQXRELDhIQUFBLG9CQUFvQixPQUFBO0FBQzdCLG1FQUErRDtBQUF0RCw4SEFBQSxvQkFBb0IsT0FBQTtBQUM3QixpRkFBNEU7QUFBbkUsMklBQUEsMEJBQTBCLE9BQUE7QUFDbkMseURBQXFEO0FBQTVDLG9IQUFBLGVBQWUsT0FBQTtBQUN4Qix1RkFBaUY7QUFBeEUsZ0pBQUEsNEJBQTRCLE9BQUE7QUFDckMsMkVBQXNFO0FBQTdELHFJQUFBLHVCQUF1QixPQUFBO0FBQ2hDLDZFQUF1RTtBQUE5RCxzSUFBQSx1QkFBdUIsT0FBQTtBQUNoQywrREFBMkQ7QUFBbEQsMEhBQUEsa0JBQWtCLE9BQUE7QUFDM0IsaUZBQTJFO0FBQWxFLDBJQUFBLHlCQUF5QixPQUFBIn0=
|
|
@@ -4,6 +4,7 @@ exports.resolveChannelConfigStep = void 0;
|
|
|
4
4
|
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
5
|
const utils_1 = require("@medusajs/framework/utils");
|
|
6
6
|
const otp_verification_1 = require("../../modules/otp-verification");
|
|
7
|
+
const otp_verification_2 = require("../../modules/otp-verification/models/otp-verification");
|
|
7
8
|
exports.resolveChannelConfigStep = (0, workflows_sdk_1.createStep)("resolve-channel-config", async (input, { container }) => {
|
|
8
9
|
const config = container.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
9
10
|
const otpService = container.resolve(otp_verification_1.OTP_VERIFICATION_MODULE);
|
|
@@ -11,8 +12,16 @@ exports.resolveChannelConfigStep = (0, workflows_sdk_1.createStep)("resolve-chan
|
|
|
11
12
|
if (!channelConfig || !channelConfig.channel) {
|
|
12
13
|
throw new Error(`Channel configuration not found for type: ${input.type}. Please configure ${input.type} in plugin options with a 'channel' property.`);
|
|
13
14
|
}
|
|
15
|
+
const deletionPurposes = [
|
|
16
|
+
otp_verification_2.OtpPurpose.ACCOUNT_DELETION_REQUEST,
|
|
17
|
+
otp_verification_2.OtpPurpose.ACCOUNT_DELETION_CANCEL,
|
|
18
|
+
];
|
|
19
|
+
if (deletionPurposes.includes(input.type) &&
|
|
20
|
+
(!channelConfig.template || typeof channelConfig.template !== "string")) {
|
|
21
|
+
throw new Error(`account_deletion_request.template and account_deletion_cancel.template must be set in plugin options for account deletion flows.`);
|
|
22
|
+
}
|
|
14
23
|
return new workflows_sdk_1.StepResponse({
|
|
15
24
|
channelConfig,
|
|
16
25
|
});
|
|
17
26
|
});
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1jaGFubmVsLWNvbmZpZy1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9yZXNvbHZlLWNoYW5uZWwtY29uZmlnLXN0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQTRFO0FBQzVFLHFEQUFxRTtBQUNyRSxxRUFBd0U7QUFFeEUsNkZBQW1GO0FBVXRFLFFBQUEsd0JBQXdCLEdBQUcsSUFBQSwwQkFBVSxFQUNoRCx3QkFBd0IsRUFDeEIsS0FBSyxFQUFFLEtBQWdDLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ3hELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDekUsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDbEMsMENBQXVCLENBQ3hCLENBQUE7SUFFRCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsNEJBQTRCLENBQzNELEtBQUssQ0FBQyxJQUFJLEVBQ1YsTUFBTSxDQUNBLENBQUE7SUFFUixJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzdDLE1BQU0sSUFBSSxLQUFLLENBQ2IsNkNBQTZDLEtBQUssQ0FBQyxJQUFJLHNCQUFzQixLQUFLLENBQUMsSUFBSSwrQ0FBK0MsQ0FDdkksQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUFHO1FBQ3ZCLDZCQUFVLENBQUMsd0JBQXdCO1FBQ25DLDZCQUFVLENBQUMsdUJBQXVCO0tBQ25DLENBQUE7SUFDRCxJQUNFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxhQUFhLENBQUMsUUFBUSxJQUFJLE9BQU8sYUFBYSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsRUFDdkUsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQ2Isa0lBQWtJLENBQ25JLENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLDRCQUFZLENBQTZCO1FBQ2xELGFBQWE7S0FDZCxDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQSJ9
|
|
@@ -123,43 +123,33 @@ function prepareSmsPayload(to, channel, renderedContent) {
|
|
|
123
123
|
exports.sendNotificationStep = (0, workflows_sdk_1.createStep)("send-notification", async (input, { container }) => {
|
|
124
124
|
let payload;
|
|
125
125
|
if (input.contactType === "email") {
|
|
126
|
-
console.log("[send-notification] Preparing email payload");
|
|
127
126
|
payload = prepareEmailPayload(input.to, input.renderedContent, input.channelConfig, input.templateData);
|
|
128
|
-
console.log("Email payload:", JSON.stringify(payload, null, 2));
|
|
129
127
|
}
|
|
130
128
|
else {
|
|
131
|
-
console.log("[send-notification] Preparing SMS payload");
|
|
132
129
|
payload = prepareSmsPayload(input.to, input.channel, input.renderedContent);
|
|
133
|
-
console.log("SMS payload:", JSON.stringify(payload, null, 2));
|
|
134
130
|
}
|
|
135
131
|
// Use notification service with payload structure matching sendNotificationsStep
|
|
136
132
|
const notificationService = container.resolve(utils_1.Modules.NOTIFICATION);
|
|
137
133
|
if (!notificationService) {
|
|
138
134
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Notification service is not configured.");
|
|
139
135
|
}
|
|
140
|
-
console.log("=== [send-notification] Attempting to send ===");
|
|
141
|
-
console.log("Payload:", JSON.stringify(payload, null, 2));
|
|
142
136
|
// Use create method with payload structure matching @medusajs/medusa/core-flows
|
|
143
137
|
try {
|
|
144
138
|
if (typeof notificationService.create === "function") {
|
|
145
139
|
await notificationService.create(payload);
|
|
146
|
-
console.log("[send-notification] Successfully sent using notificationService.create");
|
|
147
140
|
}
|
|
148
141
|
else if (typeof notificationService.createNotifications === "function") {
|
|
149
142
|
await notificationService.createNotifications([payload]);
|
|
150
|
-
console.log("[send-notification] Successfully sent using notificationService.createNotifications");
|
|
151
143
|
}
|
|
152
144
|
else {
|
|
153
145
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Notification service does not support sending notifications.");
|
|
154
146
|
}
|
|
155
147
|
}
|
|
156
148
|
catch (error) {
|
|
157
|
-
console.error("[send-notification] Failed to send notification:", error);
|
|
158
149
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Failed to send notification: ${error instanceof Error ? error.message : String(error)}`);
|
|
159
150
|
}
|
|
160
|
-
console.log("=== [send-notification] Notification Sent Successfully ===");
|
|
161
151
|
return new workflows_sdk_1.StepResponse({
|
|
162
152
|
sent: true,
|
|
163
153
|
});
|
|
164
154
|
});
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1ub3RpZmljYXRpb24tc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvc2VuZC1ub3RpZmljYXRpb24tc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxRUFBNEU7QUFDNUUscURBQWdFO0FBQ2hFLDRFQUFtRztBQUNuRywyQ0FBNEI7QUFnQjVCOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQzFCLEVBQVUsRUFDVixlQUE4QixFQUM5QixhQUFrQixFQUNsQixZQUEwQjtJQUUxQixpRUFBaUU7SUFDakUsSUFBSSxTQUFTLEdBQUcsZUFBZSxDQUFBO0lBQy9CLElBQUksQ0FBQyxTQUFTLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ25DLHlDQUF5QztRQUN6QywwRkFBMEY7UUFDMUYsdUVBQXVFO1FBQ3ZFLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FDdEMsU0FBUyxFQUNULHNEQUFzRCxDQUN2RCxDQUFBO1FBRUQsU0FBUyxHQUFHLElBQUEsZ0NBQXFCLEVBQUMsbUJBQW1CLEVBQUU7WUFDckQsR0FBRyxFQUFFLFlBQVksQ0FBQyxHQUFHO1lBQ3JCLGFBQWEsRUFBRSxZQUFZLENBQUMsYUFBYSxJQUFJLFVBQVU7U0FDeEQsQ0FBQyxDQUFBO1FBRUYscURBQXFEO1FBQ3JELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFBO1lBQzdELFNBQVMsR0FBRzs7Ozt1QkFJSyxZQUFZOzs7Z0JBR25CLFlBQVksQ0FBQyxHQUFHOzs7Ozs7O09BT3pCLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxNQUFNLFNBQVMsR0FBRyxTQUFT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
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.syncPhonepassEntityIdStep = void 0;
|
|
4
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
/**
|
|
7
|
+
* After a customer verifies a new phone number, update the phonepass
|
|
8
|
+
* provider_identity.entity_id so the customer can log in with the new number.
|
|
9
|
+
*
|
|
10
|
+
* This is needed because phonepass.authenticate() looks up the identity by
|
|
11
|
+
* entity_id. If the customer changed their phone and the entity_id is stale,
|
|
12
|
+
* login silently fails even though the password is correct.
|
|
13
|
+
*/
|
|
14
|
+
exports.syncPhonepassEntityIdStep = (0, workflows_sdk_1.createStep)("sync-phonepass-entity-id", async (input, { container }) => {
|
|
15
|
+
const { login_identifier } = input;
|
|
16
|
+
// Only sync when phonepass is actually used for login
|
|
17
|
+
if (login_identifier !== "phone" && login_identifier !== "both") {
|
|
18
|
+
return new workflows_sdk_1.StepResponse({ synced: false, old_phone: null, new_phone: null }, null);
|
|
19
|
+
}
|
|
20
|
+
const knex = container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
|
|
21
|
+
// Get the customer's current phone
|
|
22
|
+
const customerRow = await knex.raw(`SELECT phone FROM customer WHERE id = ? LIMIT 1`, [input.customer_id]);
|
|
23
|
+
const currentPhone = (customerRow.rows?.[0] ?? customerRow[0]?.[0])?.phone ?? null;
|
|
24
|
+
if (!currentPhone) {
|
|
25
|
+
return new workflows_sdk_1.StepResponse({ synced: false, old_phone: null, new_phone: null }, null);
|
|
26
|
+
}
|
|
27
|
+
// Find the auth_identity for this customer
|
|
28
|
+
const authRow = await knex.raw(`SELECT id FROM auth_identity WHERE app_metadata->>'customer_id' = ? LIMIT 1`, [input.customer_id]);
|
|
29
|
+
const authIdentityId = (authRow.rows?.[0] ?? authRow[0]?.[0])?.id ?? null;
|
|
30
|
+
if (!authIdentityId) {
|
|
31
|
+
return new workflows_sdk_1.StepResponse({ synced: false, old_phone: null, new_phone: null }, null);
|
|
32
|
+
}
|
|
33
|
+
// Find the phonepass provider_identity linked to this auth identity
|
|
34
|
+
const piRow = await knex.raw(`SELECT id, entity_id
|
|
35
|
+
FROM provider_identity
|
|
36
|
+
WHERE auth_identity_id = ? AND provider = 'phonepass'
|
|
37
|
+
LIMIT 1`, [authIdentityId]);
|
|
38
|
+
const pi = piRow.rows?.[0] ?? piRow[0]?.[0] ?? null;
|
|
39
|
+
if (!pi) {
|
|
40
|
+
// No phonepass identity exists — nothing to sync
|
|
41
|
+
return new workflows_sdk_1.StepResponse({ synced: false, old_phone: null, new_phone: currentPhone }, null);
|
|
42
|
+
}
|
|
43
|
+
const oldPhone = pi.entity_id;
|
|
44
|
+
if (oldPhone === currentPhone) {
|
|
45
|
+
// entity_id is already up to date
|
|
46
|
+
return new workflows_sdk_1.StepResponse({ synced: false, old_phone: oldPhone, new_phone: currentPhone }, null);
|
|
47
|
+
}
|
|
48
|
+
await knex.raw(`UPDATE provider_identity
|
|
49
|
+
SET entity_id = ?, updated_at = NOW()
|
|
50
|
+
WHERE id = ?`, [currentPhone, pi.id]);
|
|
51
|
+
return new workflows_sdk_1.StepResponse({ synced: true, old_phone: oldPhone, new_phone: currentPhone }, { provider_identity_id: pi.id, old_phone: oldPhone });
|
|
52
|
+
},
|
|
53
|
+
// Compensation: restore the old entity_id if a later step in the workflow fails.
|
|
54
|
+
// Medusa calls this with `undefined` when no compensation data was set.
|
|
55
|
+
async (compensationData, { container }) => {
|
|
56
|
+
if (!compensationData)
|
|
57
|
+
return;
|
|
58
|
+
const knex = container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
|
|
59
|
+
await knex.raw(`UPDATE provider_identity
|
|
60
|
+
SET entity_id = ?, updated_at = NOW()
|
|
61
|
+
WHERE id = ?`, [compensationData.old_phone, compensationData.provider_identity_id]);
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1waG9uZXBhc3MtZW50aXR5LWlkLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3N5bmMtcGhvbmVwYXNzLWVudGl0eS1pZC1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSxxREFBcUU7QUF1QnJFOzs7Ozs7O0dBT0c7QUFDVSxRQUFBLHlCQUF5QixHQUFHLElBQUEsMEJBQVUsRUFDakQsMEJBQTBCLEVBQzFCLEtBQUssRUFBRSxLQUFpQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQXdFLEVBQUU7SUFDL0gsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsS0FBSyxDQUFBO0lBRWxDLHNEQUFzRDtJQUN0RCxJQUFJLGdCQUFnQixLQUFLLE9BQU8sSUFBSSxnQkFBZ0IsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUNoRSxPQUFPLElBQUksNEJBQVksQ0FDckIsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxFQUNuRCxJQUFJLENBQ0wsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBRXZFLG1DQUFtQztJQUNuQyxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQ2hDLGlEQUFpRCxFQUNqRCxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FDcEIsQ0FBQTtJQUNELE1BQU0sWUFBWSxHQUNoQixDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUE7SUFFL0QsSUFBSSxDQUFDLFlBQVksRUFBRSxD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
|
|
@@ -3,42 +3,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.updatePasswordStep = void 0;
|
|
4
4
|
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
5
|
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
-
exports.updatePasswordStep = (0, workflows_sdk_1.createStep)("update-password", async ({ customer_id,
|
|
6
|
+
exports.updatePasswordStep = (0, workflows_sdk_1.createStep)("update-password", async ({ customer_id, new_password }, { container }) => {
|
|
7
7
|
if (!customer_id) {
|
|
8
8
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Customer ID is required");
|
|
9
9
|
}
|
|
10
|
-
if (!
|
|
11
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "
|
|
10
|
+
if (!new_password) {
|
|
11
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "New password is required");
|
|
12
12
|
}
|
|
13
|
-
// Get customer to retrieve email
|
|
14
13
|
const customerService = container.resolve(utils_1.Modules.CUSTOMER);
|
|
15
14
|
const customer = await customerService.retrieveCustomer(customer_id);
|
|
16
|
-
if (!customer
|
|
17
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found
|
|
15
|
+
if (!customer) {
|
|
16
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found");
|
|
18
17
|
}
|
|
19
|
-
//
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const providerIdentity = providerIdentityResult.rows?.[0] || providerIdentityResult[0]?.[0];
|
|
27
|
-
if (!providerIdentity) {
|
|
28
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Provider identity not found for customer");
|
|
18
|
+
// Resolve provider and entity_id — supports both emailpass and phonepass
|
|
19
|
+
const provider = customer.email ? "emailpass" : "phonepass";
|
|
20
|
+
const entity_id = customer.email
|
|
21
|
+
? customer.email.toLowerCase()
|
|
22
|
+
: customer.phone;
|
|
23
|
+
if (!entity_id) {
|
|
24
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer has no email or phone — cannot update password");
|
|
29
25
|
}
|
|
30
|
-
|
|
31
|
-
await
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
'{password}',
|
|
35
|
-
to_jsonb(?::text)
|
|
36
|
-
),
|
|
37
|
-
updated_at = NOW()
|
|
38
|
-
WHERE id = ?`, [password_hash, providerIdentity.id]);
|
|
39
|
-
return new workflows_sdk_1.StepResponse({
|
|
40
|
-
customer_id,
|
|
41
|
-
success: true,
|
|
26
|
+
const authService = container.resolve(utils_1.Modules.AUTH);
|
|
27
|
+
const updateResult = await authService.updateProvider(provider, {
|
|
28
|
+
entity_id,
|
|
29
|
+
password: new_password,
|
|
42
30
|
});
|
|
31
|
+
if (!updateResult.success) {
|
|
32
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, updateResult.error || "Failed to update password");
|
|
33
|
+
}
|
|
34
|
+
return new workflows_sdk_1.StepResponse({ customer_id, success: true });
|
|
43
35
|
});
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXBhc3N3b3JkLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3VwZGF0ZS1wYXNzd29yZC1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSxxREFBZ0U7QUFjbkQsUUFBQSxrQkFBa0IsR0FBRyxJQUFBLDBCQUFVLEVBQzFDLGlCQUFpQixFQUNqQixLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUF1QixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUMxRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIseUJBQXlCLENBQzFCLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDBCQUEwQixDQUMzQixDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQXlCLGVBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNuRixNQUFNLFFBQVEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUVwRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksbUJBQVcsQ0FBQyxtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFBO0lBQzNELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxLQUFLO1FBQzlCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtRQUM5QixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQTtJQUVsQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQix5REFBeUQsQ0FDMUQsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNuRCxNQUFNLFlBQVksR0FBRyxNQUFNLFdBQVcsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO1FBQzlELFNBQVM7UUFDVCxRQUFRLEVBQUUsWUFBWTtLQUN2QixDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsWUFBWSxDQUFDLEtBQUssSUFBSSwyQkFBMkIsQ0FDbEQsQ0FBQTtJQUNILENBQUM7SUFFRCxPQUFPLElBQUksNEJBQVksQ0FBdUIsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7QUFDL0UsQ0FBQyxDQUNGLENBQUEifQ==
|