customer-registration 0.0.104 → 0.0.105
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 +63 -0
- package/.medusa/server/src/api/auth/customer/emailpass/update/route.js +71 -0
- package/.medusa/server/src/api/store/customers/change-password/route.js +52 -0
- package/.medusa/server/src/api/store/customers/otp/verify/route.js +1 -14
- package/.medusa/server/src/helpers/base-client.js +36 -0
- package/.medusa/server/src/helpers/index.js +16 -0
- package/.medusa/server/src/helpers/reset-password.js +193 -0
- package/.medusa/server/src/modules/otp-verification/migrations/Migration20250120000000RemoveForgotPasswordFromOtpPurpose.js +33 -0
- package/.medusa/server/src/modules/otp-verification/models/otp-verification.js +2 -3
- package/.medusa/server/src/modules/otp-verification/service.js +64 -1
- package/.medusa/server/src/modules/password-management/index.js +12 -0
- package/.medusa/server/src/modules/password-management/service.js +200 -0
- package/.medusa/server/src/subscribers/password-reset.js +94 -0
- package/.medusa/server/src/utils/password-hashing.js +93 -0
- package/.medusa/server/src/utils/password-validation.js +45 -0
- package/.medusa/server/src/workflows/change-password.js +117 -0
- package/.medusa/server/src/workflows/steps/find-customer-by-email-step.js +23 -0
- package/.medusa/server/src/workflows/steps/index.js +6 -2
- package/.medusa/server/src/workflows/steps/send-notification-step.js +91 -5
- package/.medusa/server/src/workflows/steps/update-password-step.js +44 -0
- package/README.md +59 -17
- package/package.json +6 -2
- package/.medusa/server/src/workflows/generate-password-reset-token.js +0 -38
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
/**
|
|
6
|
+
* Password reset request endpoint
|
|
7
|
+
*
|
|
8
|
+
* This endpoint uses Medusa's built-in AUTH module to handle password reset requests.
|
|
9
|
+
* The AUTH module will:
|
|
10
|
+
* 1. Validate the email
|
|
11
|
+
* 2. Generate a password reset token
|
|
12
|
+
* 3. Trigger the `customer.password_reset` event
|
|
13
|
+
* 4. The notification subscriber will send the reset email
|
|
14
|
+
*/
|
|
15
|
+
const POST = async (req, res) => {
|
|
16
|
+
const { email } = req.body;
|
|
17
|
+
if (!email || typeof email !== "string" || !email.trim()) {
|
|
18
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Email is required");
|
|
19
|
+
}
|
|
20
|
+
// Get AUTH service
|
|
21
|
+
const authService = req.scope.resolve(utils_1.Modules.AUTH);
|
|
22
|
+
// Prepare authentication input for password reset
|
|
23
|
+
// Convert headers to Record<string, string> format (handle array values like set-cookie)
|
|
24
|
+
const headers = {};
|
|
25
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
26
|
+
headers[key] = Array.isArray(value) ? value.join(", ") : (value || "");
|
|
27
|
+
}
|
|
28
|
+
const authData = {
|
|
29
|
+
url: req.url,
|
|
30
|
+
headers,
|
|
31
|
+
query: req.query,
|
|
32
|
+
body: {
|
|
33
|
+
email: email.toLowerCase().trim(),
|
|
34
|
+
action: "reset-password",
|
|
35
|
+
},
|
|
36
|
+
protocol: req.protocol,
|
|
37
|
+
};
|
|
38
|
+
try {
|
|
39
|
+
// Call AUTH module's authenticate method with reset-password action
|
|
40
|
+
// This will trigger the customer.password_reset event, which our subscriber handles
|
|
41
|
+
const { success, error, location } = await authService.authenticate("emailpass", authData);
|
|
42
|
+
// If location is returned, it means AUTH module wants to redirect
|
|
43
|
+
if (location) {
|
|
44
|
+
return res.status(200).json({ location });
|
|
45
|
+
}
|
|
46
|
+
// Always return success for security (don't reveal if email exists)
|
|
47
|
+
// This prevents email enumeration attacks
|
|
48
|
+
// The AUTH module and subscriber handle the actual email sending
|
|
49
|
+
return res.status(200).json({
|
|
50
|
+
message: "If the email exists, a password reset link has been sent",
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
// Even on error, return success to prevent email enumeration attacks
|
|
55
|
+
// Log the error for debugging
|
|
56
|
+
console.error("[reset-password] Error processing reset request:", error);
|
|
57
|
+
return res.status(200).json({
|
|
58
|
+
message: "If the email exists, a password reset link has been sent",
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
exports.POST = POST;
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2F1dGgvY3VzdG9tZXIvZW1haWxwYXNzL3Jlc2V0LXBhc3N3b3JkL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFnRTtBQUdoRTs7Ozs7Ozs7O0dBU0c7QUFDSSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUEwQixDQUFBO0lBRWhELElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDekQsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsbUJBQW1CLENBQ3BCLENBQUE7SUFDSCxDQUFDO0lBRUQsbUJBQW1CO0lBQ25CLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVuRCxrREFBa0Q7SUFDbEQseUZBQXlGO0lBQ3pGLE1BQU0sT0FBTyxHQUEyQixFQUFFLENBQUE7SUFDMUMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ3hFLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRztRQUNmLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRztRQUNaLE9BQU87UUFDUCxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7UUFDaEIsSUFBSSxFQUFFO1lBQ0osS0FBSyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUU7WUFDakMsTUFBTSxFQUFFLGdCQUFnQjtTQUN6QjtRQUNELFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtLQUNBLENBQUE7SUFFeEIsSUFBSSxDQUFDO1FBQ0gsb0VBQW9FO1FBQ3BFLG9GQUFvRjtRQUNwRixNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBRTFGLGtFQUFrRTtRQUNsRSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFDM0MsQ0FBQztRQUVELG9FQUFvRTtRQUNwRSwwQ0FBMEM7UUFDMUMsaUVBQWlFO1FBQ2pFLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsT0FBTyxFQUFFLDBEQUEwRDtTQUNwRSxDQUFDLENBQUE7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLHFFQUFxRTtRQUNyRSw4QkFBOEI7UUFDOUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxrREFBa0QsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUV4RSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLE9BQU8sRUFBRSwwREFBMEQ7U0FDcEUsQ0FBQyxDQUFBO0lBQ0osQ0FBQztBQUNILENBQUMsQ0FBQTtBQXhEWSxRQUFBLElBQUksUUF3RGhCIn0=
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
/**
|
|
6
|
+
* Password reset completion endpoint
|
|
7
|
+
*
|
|
8
|
+
* This endpoint uses Medusa's built-in AUTH module to complete password reset.
|
|
9
|
+
* The AUTH module will:
|
|
10
|
+
* 1. Validate the reset token (from Authorization header or body)
|
|
11
|
+
* 2. Verify the token is valid and not expired
|
|
12
|
+
* 3. Hash the new password
|
|
13
|
+
* 4. Update the password in provider_identity
|
|
14
|
+
*/
|
|
15
|
+
const POST = async (req, res) => {
|
|
16
|
+
const { email, password, token } = req.body;
|
|
17
|
+
// Get token from body or Authorization header
|
|
18
|
+
const resetToken = token || req.headers.authorization?.replace("Bearer ", "");
|
|
19
|
+
if (!resetToken) {
|
|
20
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Reset token is required. Provide it in the 'token' field or 'Authorization: Bearer {token}' header");
|
|
21
|
+
}
|
|
22
|
+
if (!email || typeof email !== "string" || !email.trim()) {
|
|
23
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Email is required");
|
|
24
|
+
}
|
|
25
|
+
if (!password || typeof password !== "string" || password.length < 8) {
|
|
26
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Password is required and must be at least 8 characters");
|
|
27
|
+
}
|
|
28
|
+
// Get AUTH service
|
|
29
|
+
const authService = req.scope.resolve(utils_1.Modules.AUTH);
|
|
30
|
+
// Prepare authentication input for password reset completion
|
|
31
|
+
// Convert headers to Record<string, string> format (handle array values like set-cookie)
|
|
32
|
+
const headers = {};
|
|
33
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
34
|
+
headers[key] = Array.isArray(value) ? value.join(", ") : (value || "");
|
|
35
|
+
}
|
|
36
|
+
headers.authorization = `Bearer ${resetToken}`;
|
|
37
|
+
const authData = {
|
|
38
|
+
url: req.url,
|
|
39
|
+
headers,
|
|
40
|
+
query: req.query,
|
|
41
|
+
body: {
|
|
42
|
+
email: email.toLowerCase().trim(),
|
|
43
|
+
password,
|
|
44
|
+
action: "update-password",
|
|
45
|
+
},
|
|
46
|
+
protocol: req.protocol,
|
|
47
|
+
};
|
|
48
|
+
try {
|
|
49
|
+
// Call AUTH module's authenticate method with update-password action
|
|
50
|
+
// The AUTH module will validate the token and update the password
|
|
51
|
+
const { success, error, authIdentity } = await authService.authenticate("emailpass", authData);
|
|
52
|
+
if (!success || !authIdentity) {
|
|
53
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, error || "Failed to reset password. Invalid or expired token.");
|
|
54
|
+
}
|
|
55
|
+
return res.status(200).json({
|
|
56
|
+
message: "Password reset successfully",
|
|
57
|
+
success: true,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
// Re-throw MedusaError as-is
|
|
62
|
+
if (error instanceof utils_1.MedusaError) {
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
// Handle unexpected errors
|
|
66
|
+
console.error("[reset-password-complete] Unexpected error:", error);
|
|
67
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Failed to reset password: ${error instanceof Error ? error.message : String(error)}`);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
exports.POST = POST;
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2F1dGgvY3VzdG9tZXIvZW1haWxwYXNzL3VwZGF0ZS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBZ0U7QUFHaEU7Ozs7Ozs7OztHQVNHO0FBQ0ksTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ3BFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUl0QyxDQUFBO0lBRUQsOENBQThDO0lBQzlDLE1BQU0sVUFBVSxHQUFHLEtBQUssSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBRTdFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixvR0FBb0csQ0FDckcsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3pELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG1CQUFtQixDQUNwQixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDckUsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsd0RBQXdELENBQ3pELENBQUE7SUFDSCxDQUFDO0lBRUQsbUJBQW1CO0lBQ25CLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVuRCw2REFBNkQ7SUFDN0QseUZBQXlGO0lBQ3pGLE1BQU0sT0FBTyxHQUEyQixFQUFFLENBQUE7SUFDMUMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ3hFLENBQUM7SUFDRCxPQUFPLENBQUMsYUFBYSxHQUFHLFVBQVUsVUFBVSxFQUFFLENBQUE7SUFFOUMsTUFBTSxRQUFRLEdBQUc7UUFDZixHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUc7UUFDWixPQUFPO1FBQ1AsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1FBQ2hCLElBQUksRUFBRTtZQUNKLEtBQUssRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFO1lBQ2pDLFFBQVE7WUFDUixNQUFNLEVBQUUsaUJBQWlCO1NBQzFCO1FBQ0QsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO0tBQ0EsQ0FBQTtJQUV4QixJQUFJLENBQUM7UUFDSCxxRUFBcUU7UUFDckUsa0VBQWtFO1FBQ2xFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sV0FBVyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFFOUYsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLEtBQUssSUFBSSxxREFBcUQsQ0FDL0QsQ0FBQTtRQUNILENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLE9BQU8sRUFBRSw2QkFBNkI7WUFDdEMsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDLENBQUE7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLDZCQUE2QjtRQUM3QixJQUFJLEtBQUssWUFBWSxtQkFBVyxFQUFFLENBQUM7WUFDakMsTUFBTSxLQUFLLENBQUE7UUFDYixDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDbkUsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyw2QkFBNkIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ3RGLENBQUE7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxDQUFBO0FBbkZZLFFBQUEsSUFBSSxRQW1GaEIifQ==
|
|
@@ -0,0 +1,52 @@
|
|
|
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.POST = void 0;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const change_password_1 = __importDefault(require("../../../../workflows/change-password"));
|
|
9
|
+
const POST = async (req, res) => {
|
|
10
|
+
// Get customer from auth context
|
|
11
|
+
const authContext = req.auth_context;
|
|
12
|
+
const customerId = authContext?.actor_id || authContext?.user_id;
|
|
13
|
+
if (!customerId) {
|
|
14
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, "Authentication required");
|
|
15
|
+
}
|
|
16
|
+
const { old_password, new_password, confirm_password } = req.body;
|
|
17
|
+
if (!old_password) {
|
|
18
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Current password is required");
|
|
19
|
+
}
|
|
20
|
+
if (!new_password) {
|
|
21
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "New password is required");
|
|
22
|
+
}
|
|
23
|
+
if (!confirm_password) {
|
|
24
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Confirm password is required");
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
// Execute change password workflow (validates password, verifies old password, and updates password)
|
|
28
|
+
const { result } = await (0, change_password_1.default)(req.scope).run({
|
|
29
|
+
input: {
|
|
30
|
+
customer_id: customerId,
|
|
31
|
+
old_password,
|
|
32
|
+
new_password,
|
|
33
|
+
confirm_password,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
return res.status(200).json({
|
|
37
|
+
message: "Password changed successfully",
|
|
38
|
+
customer_id: result.customer_id,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
// Re-throw MedusaError as-is
|
|
43
|
+
if (error instanceof utils_1.MedusaError) {
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
// Handle unexpected errors
|
|
47
|
+
console.error("[change-password] Unexpected error:", error);
|
|
48
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Failed to change password");
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
exports.POST = POST;
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9jaGFuZ2UtcGFzc3dvcmQvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EscURBQXVEO0FBQ3ZELDRGQUEwRTtBQUVuRSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsaUNBQWlDO0lBQ2pDLE1BQU0sV0FBVyxHQUFJLEdBQWtFLENBQUMsWUFBWSxDQUFBO0lBQ3BHLE1BQU0sVUFBVSxHQUFHLFdBQVcsRUFBRSxRQUFRLElBQUksV0FBVyxFQUFFLE9BQU8sQ0FBQTtJQUVoRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIseUJBQXlCLENBQzFCLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFJNUQsQ0FBQTtJQUVELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qiw4QkFBOEIsQ0FDL0IsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsMEJBQTBCLENBQzNCLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsOEJBQThCLENBQy9CLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gscUdBQXFHO1FBQ3JHLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEseUJBQXNCLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUM3RCxLQUFLLEVBQUU7Z0JBQ0wsV0FBVyxFQUFFLFVBQVU7Z0JBQ3ZCLFlBQVk7Z0JBQ1osWUFBWTtnQkFDWixnQkFBZ0I7YUFDakI7U0FDRixDQUFDLENBQUE7UUFFRixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLE9BQU8sRUFBRSwrQkFBK0I7WUFDeEMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1NBQ2hDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsNkJBQTZCO1FBQzdCLElBQUksS0FBSyxZQUFZLG1CQUFXLEVBQUUsQ0FBQztZQUNqQyxNQUFNLEtBQUssQ0FBQTtRQUNiLENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUMzRCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQ2xDLDJCQUEyQixDQUM1QixDQUFBO0lBQ0gsQ0FBQztBQUNILENBQUMsQ0FBQTtBQW5FWSxRQUFBLElBQUksUUFtRWhCIn0=
|
|
@@ -9,7 +9,6 @@ const otp_verification_1 = require("../../../../../modules/otp-verification");
|
|
|
9
9
|
const otp_verification_2 = require("../../../../../modules/otp-verification/models/otp-verification");
|
|
10
10
|
const verify_email_1 = __importDefault(require("../../../../../workflows/verify-email"));
|
|
11
11
|
const verify_phone_1 = __importDefault(require("../../../../../workflows/verify-phone"));
|
|
12
|
-
const generate_password_reset_token_1 = __importDefault(require("../../../../../workflows/generate-password-reset-token"));
|
|
13
12
|
const POST = async (req, res) => {
|
|
14
13
|
const { token, code } = req.body;
|
|
15
14
|
if (!token) {
|
|
@@ -54,22 +53,10 @@ const POST = async (req, res) => {
|
|
|
54
53
|
phone_verified: workflowResult.phone_verified,
|
|
55
54
|
};
|
|
56
55
|
}
|
|
57
|
-
else if (verifyResult.type === otp_verification_2.OtpPurpose.FORGOT_PASSWORD) {
|
|
58
|
-
const { result: workflowResult } = await (0, generate_password_reset_token_1.default)(req.scope).run({
|
|
59
|
-
input: {
|
|
60
|
-
customer_id: verifyResult.customer_id,
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
result = {
|
|
64
|
-
verified: true,
|
|
65
|
-
reset_token: workflowResult.token,
|
|
66
|
-
expires_in: workflowResult.expires_in,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
56
|
else {
|
|
70
57
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid verification type");
|
|
71
58
|
}
|
|
72
59
|
return res.status(200).json(result);
|
|
73
60
|
};
|
|
74
61
|
exports.POST = POST;
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9vdHAvdmVyaWZ5L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLHFEQUdrQztBQUNsQyw4RUFBaUY7QUFFakYsc0dBQTRGO0FBQzVGLHlGQUF1RTtBQUN2RSx5RkFBdUU7QUFFaEUsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ3BFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBRzNCLENBQUE7SUFFRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixtQkFBbUIsQ0FDcEIsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixzQkFBc0IsQ0FDdkIsQ0FBQTtJQUNILENBQUM7SUFFRCw4QkFBOEI7SUFDOUIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ2xDLDBDQUF1QixDQUNFLENBQUE7SUFFM0IsNkJBQTZCO0lBQzdCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ3pFLE1BQU0sU0FBUyxHQUFJLE1BQU0sRUFBRSxhQUFxQixFQUFFLElBQUksRUFBRSxTQUFTLElBQUksYUFBYSxDQUFBO0lBRWxGLGFBQWE7SUFDYixNQUFNLFlBQVksR0FBRyxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQzdDO1FBQ0UsS0FBSztRQUNMLElBQUk7S0FDTCxFQUNELFNBQVMsQ0FDVixDQUFBO0lBRUQsaUNBQWlDO0lBQ2pDLElBQUksTUFBVyxDQUFBO0lBRWYsSUFBSSxZQUFZLENBQUMsSUFBSSxLQUFLLDZCQUFVLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN4RCxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sSUFBQSxzQkFBbUIsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQzFFLEtBQUssRUFBRTtnQkFDTCxXQUFXLEVBQUUsWUFBWSxDQUFDLFdBQVc7YUFDdEM7U0FDRixDQUFDLENBQUE7UUFDRixNQUFNLEdBQUc7WUFDUCxRQUFRLEVBQUUsSUFBSTtZQUNkLFFBQVEsRUFBRSxjQUFjLENBQUMsUUFBUTtZQUNqQyxjQUFjLEVBQUUsY0FBYyxDQUFDLGNBQWM7U0FDOUMsQ0FBQTtJQUNILENBQUM7U0FBTSxJQUFJLFlBQVksQ0FBQyxJQUFJLEtBQUssNkJBQVUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9ELE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsTUFBTSxJQUFBLHNCQUFtQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDMUUsS0FBSyxFQUFFO2dCQUNMLFdBQVcsRUFBRSxZQUFZLENBQUMsV0FBVzthQUN0QztTQUNGLENBQUMsQ0FBQTtRQUNGLE1BQU0sR0FBRztZQUNQLFFBQVEsRUFBRSxJQUFJO1lBQ2QsUUFBUSxFQUFFLGNBQWMsQ0FBQyxRQUFRO1lBQ2pDLGNBQWMsRUFBRSxjQUFjLENBQUMsY0FBYztTQUM5QyxDQUFBO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QiwyQkFBMkIsQ0FDNUIsQ0FBQTtJQUNILENBQUM7SUFFRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ3JDLENBQUMsQ0FBQTtBQXZFWSxRQUFBLElBQUksUUF1RWhCIn0=
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getClientRequest = exports.buildHeaders = exports.normalizeBaseUrl = void 0;
|
|
4
|
+
const normalizeBaseUrl = (baseUrl) => {
|
|
5
|
+
if (!baseUrl) {
|
|
6
|
+
return "";
|
|
7
|
+
}
|
|
8
|
+
return baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
|
|
9
|
+
};
|
|
10
|
+
exports.normalizeBaseUrl = normalizeBaseUrl;
|
|
11
|
+
const buildHeaders = (options) => {
|
|
12
|
+
const headers = {
|
|
13
|
+
"Content-Type": "application/json",
|
|
14
|
+
...(options.headers ?? {}),
|
|
15
|
+
};
|
|
16
|
+
const hasPublishableHeader = Object.keys(headers).some((key) => key.toLowerCase() === "x-publishable-api-key");
|
|
17
|
+
if (options.publishableApiKey && !hasPublishableHeader) {
|
|
18
|
+
headers["x-publishable-api-key"] = options.publishableApiKey;
|
|
19
|
+
}
|
|
20
|
+
return headers;
|
|
21
|
+
};
|
|
22
|
+
exports.buildHeaders = buildHeaders;
|
|
23
|
+
const getClientRequest = (client) => {
|
|
24
|
+
if (!client) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
if ("request" in client && typeof client.request === "function") {
|
|
28
|
+
return client.request.bind(client);
|
|
29
|
+
}
|
|
30
|
+
if ("client" in client && typeof client.client?.request === "function") {
|
|
31
|
+
return client.client.request.bind(client.client);
|
|
32
|
+
}
|
|
33
|
+
return undefined;
|
|
34
|
+
};
|
|
35
|
+
exports.getClientRequest = getClientRequest;
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaGVscGVycy9iYXNlLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFvQ08sTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE9BQWdCLEVBQUUsRUFBRTtJQUNuRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtBQUMvRCxDQUFDLENBQUE7QUFMWSxRQUFBLGdCQUFnQixvQkFLNUI7QUFFTSxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQStCLEVBQUUsRUFBRTtJQUM5RCxNQUFNLE9BQU8sR0FBMkI7UUFDdEMsY0FBYyxFQUFFLGtCQUFrQjtRQUNsQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7S0FDM0IsQ0FBQTtJQUVELE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQ3BELENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssdUJBQXVCLENBQ3ZELENBQUE7SUFFRCxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDdkQsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFBO0lBQzlELENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDLENBQUE7QUFmWSxRQUFBLFlBQVksZ0JBZXhCO0FBRU0sTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE1BQXlCLEVBQUUsRUFBRTtJQUM1RCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBRUQsSUFBSSxTQUFTLElBQUksTUFBTSxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNoRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3BDLENBQUM7SUFFRCxJQUFJLFFBQVEsSUFBSSxNQUFNLElBQUksT0FBTyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUN2RSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEQsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUMsQ0FBQTtBQWRZLFFBQUEsZ0JBQWdCLG9CQWM1QiJ9
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createCompletePasswordReset = exports.completePasswordReset = exports.createRequestPasswordReset = exports.requestPasswordReset = exports.getClientRequest = exports.buildHeaders = exports.normalizeBaseUrl = void 0;
|
|
4
|
+
// Base client utilities
|
|
5
|
+
var base_client_1 = require("./base-client");
|
|
6
|
+
Object.defineProperty(exports, "normalizeBaseUrl", { enumerable: true, get: function () { return base_client_1.normalizeBaseUrl; } });
|
|
7
|
+
Object.defineProperty(exports, "buildHeaders", { enumerable: true, get: function () { return base_client_1.buildHeaders; } });
|
|
8
|
+
Object.defineProperty(exports, "getClientRequest", { enumerable: true, get: function () { return base_client_1.getClientRequest; } });
|
|
9
|
+
// Password reset helpers
|
|
10
|
+
var reset_password_1 = require("./reset-password");
|
|
11
|
+
Object.defineProperty(exports, "requestPasswordReset", { enumerable: true, get: function () { return reset_password_1.requestPasswordReset; } });
|
|
12
|
+
Object.defineProperty(exports, "createRequestPasswordReset", { enumerable: true, get: function () { return reset_password_1.createRequestPasswordReset; } });
|
|
13
|
+
var reset_password_2 = require("./reset-password");
|
|
14
|
+
Object.defineProperty(exports, "completePasswordReset", { enumerable: true, get: function () { return reset_password_2.completePasswordReset; } });
|
|
15
|
+
Object.defineProperty(exports, "createCompletePasswordReset", { enumerable: true, get: function () { return reset_password_2.createCompletePasswordReset; } });
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx3QkFBd0I7QUFDeEIsNkNBTXNCO0FBSHBCLCtHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLDJHQUFBLFlBQVksT0FBQTtBQUNaLCtHQUFBLGdCQUFnQixPQUFBO0FBR2xCLHlCQUF5QjtBQUN6QixtREFNeUI7QUFGdkIsc0hBQUEsb0JBQW9CLE9BQUE7QUFDcEIsNEhBQUEsMEJBQTBCLE9BQUE7QUFHNUIsbURBTXlCO0FBRnZCLHVIQUFBLHFCQUFxQixPQUFBO0FBQ3JCLDZIQUFBLDJCQUEyQixPQUFBIn0=
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createCompletePasswordReset = exports.createRequestPasswordReset = exports.completePasswordReset = exports.requestPasswordReset = void 0;
|
|
4
|
+
const base_client_1 = require("./base-client");
|
|
5
|
+
const RESET_PASSWORD_ENDPOINT = "/store/auth/customer/emailpass/reset-password";
|
|
6
|
+
const COMPLETE_PASSWORD_RESET_ENDPOINT = "/store/auth/customer/emailpass/update";
|
|
7
|
+
const resolveEndpoint = (defaultEndpoint, endpoint) => endpoint?.startsWith("/") ? endpoint : defaultEndpoint;
|
|
8
|
+
/**
|
|
9
|
+
* Request a password reset for a customer
|
|
10
|
+
*
|
|
11
|
+
* This function calls the password reset endpoint which triggers Medusa's built-in
|
|
12
|
+
* password reset flow. The AUTH module will generate a reset token and trigger
|
|
13
|
+
* the `customer.password_reset` event, which sends an email to the customer.
|
|
14
|
+
*
|
|
15
|
+
* @param input - Password reset request input
|
|
16
|
+
* @param options - Transport options (baseUrl, client, publishableApiKey, etc.)
|
|
17
|
+
* @returns Promise resolving to the reset request response
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* import { requestPasswordReset } from "customer-registration/helpers"
|
|
22
|
+
*
|
|
23
|
+
* // Basic usage
|
|
24
|
+
* const result = await requestPasswordReset(
|
|
25
|
+
* { email: "customer@example.com" },
|
|
26
|
+
* { baseUrl: "https://store.example.com", publishableApiKey: "pk_..." }
|
|
27
|
+
* )
|
|
28
|
+
*
|
|
29
|
+
* // With Medusa SDK client
|
|
30
|
+
* import { sdk } from "@medusajs/js-sdk"
|
|
31
|
+
* const result = await requestPasswordReset(
|
|
32
|
+
* { email: "customer@example.com" },
|
|
33
|
+
* { client: sdk }
|
|
34
|
+
* )
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
const requestPasswordReset = async (input, options = {}) => {
|
|
38
|
+
const endpoint = resolveEndpoint(RESET_PASSWORD_ENDPOINT, input.endpoint);
|
|
39
|
+
const payload = {
|
|
40
|
+
email: input.email.toLowerCase().trim(),
|
|
41
|
+
};
|
|
42
|
+
const clientRequest = (0, base_client_1.getClientRequest)(options.client);
|
|
43
|
+
if (clientRequest) {
|
|
44
|
+
const headers = (0, base_client_1.buildHeaders)(options);
|
|
45
|
+
const raw = await clientRequest(endpoint, {
|
|
46
|
+
method: "POST",
|
|
47
|
+
body: JSON.stringify(payload),
|
|
48
|
+
headers,
|
|
49
|
+
});
|
|
50
|
+
if (!raw || typeof raw !== "object") {
|
|
51
|
+
throw new Error("Invalid response from password reset endpoint");
|
|
52
|
+
}
|
|
53
|
+
return raw;
|
|
54
|
+
}
|
|
55
|
+
const fetchImpl = options.fetchImpl ?? globalThis.fetch;
|
|
56
|
+
if (!fetchImpl) {
|
|
57
|
+
throw new Error("No fetch implementation available. Provide `fetchImpl` or a Medusa client.");
|
|
58
|
+
}
|
|
59
|
+
const url = `${(0, base_client_1.normalizeBaseUrl)(options.baseUrl)}${endpoint}`;
|
|
60
|
+
const headers = (0, base_client_1.buildHeaders)(options);
|
|
61
|
+
const response = await fetchImpl(url || endpoint, {
|
|
62
|
+
method: "POST",
|
|
63
|
+
headers,
|
|
64
|
+
body: JSON.stringify(payload),
|
|
65
|
+
});
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
const body = await response.text();
|
|
68
|
+
throw new Error(body || `Failed to request password reset (status ${response.status})`);
|
|
69
|
+
}
|
|
70
|
+
const json = await response.json();
|
|
71
|
+
if (!json || typeof json !== "object") {
|
|
72
|
+
throw new Error("Invalid response format from password reset endpoint");
|
|
73
|
+
}
|
|
74
|
+
return json;
|
|
75
|
+
};
|
|
76
|
+
exports.requestPasswordReset = requestPasswordReset;
|
|
77
|
+
/**
|
|
78
|
+
* Complete a password reset with a new password
|
|
79
|
+
*
|
|
80
|
+
* This function calls the password reset completion endpoint which validates
|
|
81
|
+
* the reset token and updates the customer's password using Medusa's AUTH module.
|
|
82
|
+
*
|
|
83
|
+
* The token can be provided either:
|
|
84
|
+
* - In the `token` field of the input
|
|
85
|
+
* - Via `Authorization: Bearer {token}` header in options.headers
|
|
86
|
+
*
|
|
87
|
+
* @param input - Password reset completion input
|
|
88
|
+
* @param options - Transport options (baseUrl, client, publishableApiKey, etc.)
|
|
89
|
+
* @returns Promise resolving to the reset completion response
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```typescript
|
|
93
|
+
* import { completePasswordReset } from "customer-registration/helpers"
|
|
94
|
+
*
|
|
95
|
+
* // Basic usage with token in input
|
|
96
|
+
* const result = await completePasswordReset(
|
|
97
|
+
* {
|
|
98
|
+
* email: "customer@example.com",
|
|
99
|
+
* password: "NewSecurePassword123!",
|
|
100
|
+
* token: "reset_token_from_email"
|
|
101
|
+
* },
|
|
102
|
+
* { baseUrl: "https://store.example.com", publishableApiKey: "pk_..." }
|
|
103
|
+
* )
|
|
104
|
+
*
|
|
105
|
+
* // With token in Authorization header
|
|
106
|
+
* const result = await completePasswordReset(
|
|
107
|
+
* {
|
|
108
|
+
* email: "customer@example.com",
|
|
109
|
+
* password: "NewSecurePassword123!",
|
|
110
|
+
* token: "reset_token_from_email"
|
|
111
|
+
* },
|
|
112
|
+
* {
|
|
113
|
+
* baseUrl: "https://store.example.com",
|
|
114
|
+
* publishableApiKey: "pk_...",
|
|
115
|
+
* headers: {
|
|
116
|
+
* "Authorization": "Bearer reset_token_from_email"
|
|
117
|
+
* }
|
|
118
|
+
* }
|
|
119
|
+
* )
|
|
120
|
+
*
|
|
121
|
+
* // With Medusa SDK client
|
|
122
|
+
* import { sdk } from "@medusajs/js-sdk"
|
|
123
|
+
* const result = await completePasswordReset(
|
|
124
|
+
* {
|
|
125
|
+
* email: "customer@example.com",
|
|
126
|
+
* password: "NewSecurePassword123!",
|
|
127
|
+
* token: "reset_token_from_email"
|
|
128
|
+
* },
|
|
129
|
+
* { client: sdk }
|
|
130
|
+
* )
|
|
131
|
+
* ```
|
|
132
|
+
*/
|
|
133
|
+
const completePasswordReset = async (input, options = {}) => {
|
|
134
|
+
const endpoint = resolveEndpoint(COMPLETE_PASSWORD_RESET_ENDPOINT, input.endpoint);
|
|
135
|
+
const payload = {
|
|
136
|
+
email: input.email.toLowerCase().trim(),
|
|
137
|
+
password: input.password,
|
|
138
|
+
token: input.token,
|
|
139
|
+
};
|
|
140
|
+
const clientRequest = (0, base_client_1.getClientRequest)(options.client);
|
|
141
|
+
if (clientRequest) {
|
|
142
|
+
const headers = (0, base_client_1.buildHeaders)(options);
|
|
143
|
+
// Add Authorization header if token is provided and not already in headers
|
|
144
|
+
if (input.token && !headers.authorization) {
|
|
145
|
+
headers.authorization = `Bearer ${input.token}`;
|
|
146
|
+
}
|
|
147
|
+
const raw = await clientRequest(endpoint, {
|
|
148
|
+
method: "POST",
|
|
149
|
+
body: JSON.stringify(payload),
|
|
150
|
+
headers,
|
|
151
|
+
});
|
|
152
|
+
if (!raw || typeof raw !== "object" || !("success" in raw)) {
|
|
153
|
+
throw new Error("Invalid response from password reset completion endpoint");
|
|
154
|
+
}
|
|
155
|
+
return raw;
|
|
156
|
+
}
|
|
157
|
+
const fetchImpl = options.fetchImpl ?? globalThis.fetch;
|
|
158
|
+
if (!fetchImpl) {
|
|
159
|
+
throw new Error("No fetch implementation available. Provide `fetchImpl` or a Medusa client.");
|
|
160
|
+
}
|
|
161
|
+
const url = `${(0, base_client_1.normalizeBaseUrl)(options.baseUrl)}${endpoint}`;
|
|
162
|
+
const headers = (0, base_client_1.buildHeaders)(options);
|
|
163
|
+
// Add Authorization header if token is provided and not already in headers
|
|
164
|
+
if (input.token && !headers.authorization) {
|
|
165
|
+
headers.authorization = `Bearer ${input.token}`;
|
|
166
|
+
}
|
|
167
|
+
const response = await fetchImpl(url || endpoint, {
|
|
168
|
+
method: "POST",
|
|
169
|
+
headers,
|
|
170
|
+
body: JSON.stringify(payload),
|
|
171
|
+
});
|
|
172
|
+
if (!response.ok) {
|
|
173
|
+
const body = await response.text();
|
|
174
|
+
throw new Error(body || `Failed to complete password reset (status ${response.status})`);
|
|
175
|
+
}
|
|
176
|
+
const json = await response.json();
|
|
177
|
+
if (!json || typeof json !== "object" || !("success" in json)) {
|
|
178
|
+
throw new Error("Invalid response format from password reset completion endpoint");
|
|
179
|
+
}
|
|
180
|
+
return json;
|
|
181
|
+
};
|
|
182
|
+
exports.completePasswordReset = completePasswordReset;
|
|
183
|
+
/**
|
|
184
|
+
* Factory creator for preconfigured password reset request helper
|
|
185
|
+
*/
|
|
186
|
+
const createRequestPasswordReset = (options = {}) => (input) => (0, exports.requestPasswordReset)(input, options);
|
|
187
|
+
exports.createRequestPasswordReset = createRequestPasswordReset;
|
|
188
|
+
/**
|
|
189
|
+
* Factory creator for preconfigured password reset completion helper
|
|
190
|
+
*/
|
|
191
|
+
const createCompletePasswordReset = (options = {}) => (input) => (0, exports.completePasswordReset)(input, options);
|
|
192
|
+
exports.createCompletePasswordReset = createCompletePasswordReset;
|
|
193
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzZXQtcGFzc3dvcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaGVscGVycy9yZXNldC1wYXNzd29yZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQ0FLc0I7QUFFdEIsTUFBTSx1QkFBdUIsR0FBRywrQ0FBK0MsQ0FBQTtBQUMvRSxNQUFNLGdDQUFnQyxHQUFHLHVDQUF1QyxDQUFBO0FBRWhGLE1BQU0sZUFBZSxHQUFHLENBQUMsZUFBdUIsRUFBRSxRQUFpQixFQUFFLEVBQUUsQ0FDckUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUE7QUFtQ3hEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0ksTUFBTSxvQkFBb0IsR0FBRyxLQUFLLEVBQ3ZDLEtBQWdDLEVBQ2hDLFVBQXVDLEVBQUUsRUFDRixFQUFFO0lBQ3pDLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDekUsTUFBTSxPQUFPLEdBQUc7UUFDZCxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUU7S0FDeEMsQ0FBQTtJQUVELE1BQU0sYUFBYSxHQUFHLElBQUEsOEJBQWdCLEVBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3RELElBQUksYUFBYSxFQUFFLENBQUM7UUFDbEIsTUFBTSxPQUFPLEdBQUcsSUFBQSwwQkFBWSxFQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3JDLE1BQU0sR0FBRyxHQUFHLE1BQU0sYUFBYSxDQUFDLFFBQVEsRUFBRTtZQUN4QyxNQUFNLEVBQUUsTUFBTTtZQUNkLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztZQUM3QixPQUFPO1NBQ1IsQ0FBQyxDQUFBO1FB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
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20250120000000RemoveForgotPasswordFromOtpPurpose = void 0;
|
|
4
|
+
const migrations_1 = require("@mikro-orm/migrations");
|
|
5
|
+
class Migration20250120000000RemoveForgotPasswordFromOtpPurpose extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
// Drop the existing check constraint
|
|
8
|
+
this.addSql(`
|
|
9
|
+
ALTER TABLE "otp_verification"
|
|
10
|
+
DROP CONSTRAINT IF EXISTS "otp_verification_purpose_check";
|
|
11
|
+
`);
|
|
12
|
+
// Add new check constraint without 'forgot_password'
|
|
13
|
+
this.addSql(`
|
|
14
|
+
ALTER TABLE "otp_verification"
|
|
15
|
+
ADD CONSTRAINT "otp_verification_purpose_check"
|
|
16
|
+
CHECK ("purpose" IN ('email_verification', 'phone_verification'));
|
|
17
|
+
`);
|
|
18
|
+
}
|
|
19
|
+
async down() {
|
|
20
|
+
// Rollback: restore the original constraint with 'forgot_password'
|
|
21
|
+
this.addSql(`
|
|
22
|
+
ALTER TABLE "otp_verification"
|
|
23
|
+
DROP CONSTRAINT IF EXISTS "otp_verification_purpose_check";
|
|
24
|
+
`);
|
|
25
|
+
this.addSql(`
|
|
26
|
+
ALTER TABLE "otp_verification"
|
|
27
|
+
ADD CONSTRAINT "otp_verification_purpose_check"
|
|
28
|
+
CHECK ("purpose" IN ('email_verification', 'phone_verification', 'forgot_password'));
|
|
29
|
+
`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.Migration20250120000000RemoveForgotPasswordFromOtpPurpose = Migration20250120000000RemoveForgotPasswordFromOtpPurpose;
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTAxMjAwMDAwMDBSZW1vdmVGb3Jnb3RQYXNzd29yZEZyb21PdHBQdXJwb3NlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvb3RwLXZlcmlmaWNhdGlvbi9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjUwMTIwMDAwMDAwUmVtb3ZlRm9yZ290UGFzc3dvcmRGcm9tT3RwUHVycG9zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzREFBaUQ7QUFFakQsTUFBYSx5REFBMEQsU0FBUSxzQkFBUztJQUN0RixLQUFLLENBQUMsRUFBRTtRQUNOLHFDQUFxQztRQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDOzs7S0FHWCxDQUFDLENBQUE7UUFFRixxREFBcUQ7UUFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7OztLQUlYLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNSLG1FQUFtRTtRQUNuRSxJQUFJLENBQUMsTUFBTSxDQUFDOzs7S0FHWCxDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsTUFBTSxDQUFDOzs7O0tBSVgsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGO0FBN0JELDhIQTZCQyJ9
|
|
@@ -6,14 +6,13 @@ var OtpPurpose;
|
|
|
6
6
|
(function (OtpPurpose) {
|
|
7
7
|
OtpPurpose["EMAIL_VERIFICATION"] = "email_verification";
|
|
8
8
|
OtpPurpose["PHONE_VERIFICATION"] = "phone_verification";
|
|
9
|
-
OtpPurpose["FORGOT_PASSWORD"] = "forgot_password";
|
|
10
9
|
})(OtpPurpose || (exports.OtpPurpose = OtpPurpose = {}));
|
|
11
10
|
exports.OtpVerification = utils_1.model
|
|
12
11
|
.define("otp_verification", {
|
|
13
12
|
id: utils_1.model.id().primaryKey(),
|
|
14
13
|
customer_id: utils_1.model.text().searchable(),
|
|
15
14
|
purpose: utils_1.model
|
|
16
|
-
.enum(["email_verification", "phone_verification"
|
|
15
|
+
.enum(["email_verification", "phone_verification"])
|
|
17
16
|
.default("email_verification"),
|
|
18
17
|
hashed_code: utils_1.model.text(),
|
|
19
18
|
expires_at: utils_1.model.dateTime(),
|
|
@@ -34,4 +33,4 @@ exports.OtpVerification = utils_1.model
|
|
|
34
33
|
on: ["expires_at"],
|
|
35
34
|
},
|
|
36
35
|
]);
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RwLXZlcmlmaWNhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL290cC12ZXJpZmljYXRpb24vbW9kZWxzL290cC12ZXJpZmljYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQWlEO0FBRWpELElBQVksVUFHWDtBQUhELFdBQVksVUFBVTtJQUNwQix1REFBeUMsQ0FBQTtJQUN6Qyx1REFBeUMsQ0FBQTtBQUMzQyxDQUFDLEVBSFcsVUFBVSwwQkFBVixVQUFVLFFBR3JCO0FBRVksUUFBQSxlQUFlLEdBQUcsYUFBSztLQUNqQyxNQUFNLENBQUMsa0JBQWtCLEVBQUU7SUFDMUIsRUFBRSxFQUFFLGFBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUU7SUFDM0IsV0FBVyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUU7SUFDdEMsT0FBTyxFQUFFLGFBQUs7U0FDWCxJQUFJLENBQUMsQ0FBQyxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1NBQ2xELE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztJQUNoQyxXQUFXLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUN6QixVQUFVLEVBQUUsYUFBSyxDQUFDLFFBQVEsRUFBRTtJQUM1QixRQUFRLEVBQUUsYUFBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDbkMsV0FBVyxFQUFFLGFBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDekMsQ0FBQztLQUNELE9BQU8sQ0FBQztJQUNQO1FBQ0UsSUFBSSxFQUFFLGtDQUFrQztRQUN4QyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUM7S0FDcEI7SUFDRDtRQUNFLElBQUksRUFBRSwwQ0FBMEM7UUFDaEQsRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQztLQUMvQjtJQUNEO1FBQ0UsSUFBSSxFQUFFLGlDQUFpQztRQUN2QyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUM7S0FDbkI7Q0FDRixDQUFDLENBQUEifQ==
|