customer-registration 0.0.105 → 0.0.106

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.
@@ -2,62 +2,192 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.POST = void 0;
4
4
  const utils_1 = require("@medusajs/framework/utils");
5
+ const generate_jwt_token_1 = require("@medusajs/medusa/api/auth/utils/generate-jwt-token");
6
+ /**
7
+ * Send password reset email using notification service
8
+ */
9
+ async function sendPasswordResetEmail(email, token, container) {
10
+ console.log("[reset-password] Sending password reset email directly...");
11
+ const notificationService = container.resolve(utils_1.Modules.NOTIFICATION);
12
+ if (!notificationService) {
13
+ console.error("[reset-password] Notification service is not configured");
14
+ return;
15
+ }
16
+ // Get storefront URL from environment or config
17
+ let storefrontUrl = "http://localhost:8000";
18
+ try {
19
+ const config = container.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
20
+ storefrontUrl =
21
+ process.env.STOREFRONT_URL ||
22
+ config?.projectConfig?.storefrontUrl ||
23
+ "http://localhost:8000";
24
+ }
25
+ catch (error) {
26
+ console.warn("[reset-password] Failed to resolve config, using default storefront URL:", error);
27
+ }
28
+ // Build reset URL with token and email as query parameters
29
+ const resetUrl = `${storefrontUrl}/reset-password?token=${encodeURIComponent(token)}&email=${encodeURIComponent(email)}`;
30
+ // Prepare HTML and text content
31
+ const htmlContent = `
32
+ <html>
33
+ <body>
34
+ <h2>Reset Your Password</h2>
35
+ <p>Hello,</p>
36
+ <p>You requested to reset your password. Click the link below to reset it:</p>
37
+ <p><a href="${resetUrl}">Reset Password</a></p>
38
+ <p>Or use this token: <code>${token}</code></p>
39
+ <p>This link will expire in 1 hour.</p>
40
+ <p>If you didn't request a password reset, please ignore this email.</p>
41
+ <p>Best regards,<br>Your Team</p>
42
+ </body>
43
+ </html>
44
+ `.trim();
45
+ const textContent = `Reset Your Password\n\nClick this link to reset your password: ${resetUrl}\n\nToken: ${token}\n\nThis link will expire in 1 hour.\n\nIf you didn't request a password reset, please ignore this email.`;
46
+ // Prepare email payload matching notification service structure
47
+ // Include multiple fields for different SMTP provider expectations
48
+ const payload = {
49
+ to: email,
50
+ channel: "email",
51
+ data: {
52
+ subject: "Reset Your Password",
53
+ email,
54
+ token,
55
+ reset_url: resetUrl,
56
+ expires_in: "1 hour",
57
+ html: htmlContent,
58
+ text: textContent,
59
+ },
60
+ // Root level fields for SMTP providers
61
+ html: htmlContent,
62
+ text: textContent,
63
+ body: htmlContent, // Some providers expect 'body' field
64
+ template: htmlContent, // Some providers expect 'template' field
65
+ subject: "Reset Your Password", // Include subject at root level too
66
+ };
67
+ // Log payload structure (sanitized for security)
68
+ console.log("[reset-password] Email payload structure:", {
69
+ to: payload.to,
70
+ channel: payload.channel,
71
+ subject: payload.subject,
72
+ hasHtml: !!payload.html,
73
+ hasText: !!payload.text,
74
+ hasBody: !!payload.body,
75
+ hasTemplate: !!payload.template,
76
+ dataKeys: Object.keys(payload.data || {}),
77
+ htmlLength: payload.html?.length || 0,
78
+ textLength: payload.text?.length || 0,
79
+ });
80
+ try {
81
+ if (typeof notificationService.create === "function") {
82
+ console.log("[reset-password] Using notificationService.create method");
83
+ await notificationService.create(payload);
84
+ console.log(`[reset-password] ✓ Password reset email sent successfully to ${email}`);
85
+ }
86
+ else if (typeof notificationService.createNotifications === "function") {
87
+ console.log("[reset-password] Using notificationService.createNotifications method");
88
+ await notificationService.createNotifications([payload]);
89
+ console.log(`[reset-password] ✓ Password reset email sent successfully to ${email}`);
90
+ }
91
+ else {
92
+ console.error("[reset-password] Notification service does not support sending notifications");
93
+ }
94
+ }
95
+ catch (error) {
96
+ console.error(`[reset-password] Failed to send password reset email to ${email}:`, error);
97
+ if (error instanceof Error) {
98
+ console.error("[reset-password] Error details:", {
99
+ message: error.message,
100
+ stack: error.stack,
101
+ });
102
+ }
103
+ throw error;
104
+ }
105
+ }
5
106
  /**
6
107
  * Password reset request endpoint
7
108
  *
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
109
+ * This endpoint matches Medusa's built-in `/auth/{actor_type}/{provider}/reset-password` route behavior.
110
+ * It generates a password reset token and sends an email.
111
+ *
112
+ * Note: This custom route overrides Medusa's built-in route. The subscriber listens to
113
+ * `auth.password_reset` event (emitted by Medusa's built-in route) but since we're overriding
114
+ * the route, we send the email directly here.
115
+ *
116
+ * To use Medusa's built-in route instead, remove this file and update the subscriber
117
+ * to listen to `auth.password_reset` event.
14
118
  */
15
119
  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
- };
120
+ // Accept 'identifier' (Medusa's built-in route format) or 'email' for backward compatibility
121
+ const { identifier, email } = req.body;
122
+ const userEmail = identifier || email;
123
+ if (!userEmail || typeof userEmail !== "string" || !userEmail.trim()) {
124
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Email (identifier) is required");
125
+ }
126
+ const normalizedEmail = userEmail.toLowerCase().trim();
38
127
  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",
128
+ // Find customer by email
129
+ const knex = req.scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
130
+ if (!knex) {
131
+ throw new Error("Database connection not available");
132
+ }
133
+ const result = await knex.raw(`SELECT id FROM customer WHERE email = ? LIMIT 1`, [normalizedEmail]);
134
+ const row = result.rows?.[0] || result[0]?.[0];
135
+ const customer_id = row?.id;
136
+ // If customer doesn't exist, return success anyway (security: don't reveal if email exists)
137
+ // This matches Medusa's built-in route behavior
138
+ if (!customer_id) {
139
+ return res.status(201).json({});
140
+ }
141
+ // Get auth identity from provider_identity table
142
+ const providerIdentityResult = await knex.raw(`SELECT pi.id, pi.entity_id, pi.provider, ai.id as auth_identity_id
143
+ FROM provider_identity pi
144
+ LEFT JOIN auth_identity ai ON pi.auth_identity_id = ai.id
145
+ WHERE pi.entity_id = ? AND pi.provider = 'emailpass'
146
+ LIMIT 1`, [normalizedEmail]);
147
+ const providerIdentity = providerIdentityResult.rows?.[0] || providerIdentityResult[0]?.[0];
148
+ if (!providerIdentity || !providerIdentity.auth_identity_id) {
149
+ // Return success for security (don't reveal if email exists)
150
+ return res.status(201).json({});
151
+ }
152
+ // Get AUTH service to retrieve the full auth identity object
153
+ const authService = req.scope.resolve(utils_1.Modules.AUTH);
154
+ const authIdentity = await authService.retrieveAuthIdentity(providerIdentity.auth_identity_id);
155
+ if (!authIdentity) {
156
+ // Return success for security (don't reveal if email exists)
157
+ return res.status(201).json({});
158
+ }
159
+ // Generate reset token (JWT) with 1 hour expiration
160
+ // Using the same method Medusa's built-in route uses
161
+ const config = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
162
+ const { http } = config.projectConfig;
163
+ const resetToken = (0, generate_jwt_token_1.generateJwtTokenForAuthIdentity)({
164
+ authIdentity,
165
+ actorType: "customer",
166
+ authProvider: "emailpass",
167
+ }, {
168
+ secret: http.jwtSecret,
169
+ expiresIn: "1h", // 1 hour expiration for reset token
170
+ options: http.jwtOptions,
51
171
  });
172
+ // Send password reset email
173
+ // Note: Medusa's built-in route would emit 'auth.password_reset' event here
174
+ // Since we're overriding the route, we send the email directly
175
+ try {
176
+ await sendPasswordResetEmail(normalizedEmail, resetToken, req.scope);
177
+ }
178
+ catch (emailError) {
179
+ console.error("[reset-password] Failed to send email:", emailError);
180
+ // Continue anyway - don't reveal if email exists
181
+ }
182
+ // Return 201 (Created) to match Medusa's built-in route response
183
+ return res.status(201).json({});
52
184
  }
53
185
  catch (error) {
54
186
  // Even on error, return success to prevent email enumeration attacks
55
- // Log the error for debugging
187
+ // This matches Medusa's built-in route behavior
56
188
  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
- });
189
+ return res.status(201).json({});
60
190
  }
61
191
  };
62
192
  exports.POST = POST;
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2F1dGgvY3VzdG9tZXIvZW1haWxwYXNzL3Jlc2V0LXBhc3N3b3JkL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFnRTtBQUdoRTs7Ozs7Ozs7O0dBU0c7QUFDSSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUEwQixDQUFBO0lBRWhELElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDekQsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsbUJBQW1CLENBQ3BCLENBQUE7SUFDSCxDQUFDO0lBRUQsbUJBQW1CO0lBQ25CLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVuRCxrREFBa0Q7SUFDbEQseUZBQXlGO0lBQ3pGLE1BQU0sT0FBTyxHQUEyQixFQUFFLENBQUE7SUFDMUMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ3hFLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRztRQUNmLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRztRQUNaLE9BQU87UUFDUCxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7UUFDaEIsSUFBSSxFQUFFO1lBQ0osS0FBSyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUU7WUFDakMsTUFBTSxFQUFFLGdCQUFnQjtTQUN6QjtRQUNELFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtLQUNBLENBQUE7SUFFeEIsSUFBSSxDQUFDO1FBQ0gsb0VBQW9FO1FBQ3BFLG9GQUFvRjtRQUNwRixNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBRTFGLGtFQUFrRTtRQUNsRSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFDM0MsQ0FBQztRQUVELG9FQUFvRTtRQUNwRSwwQ0FBMEM7UUFDMUMsaUVBQWlFO1FBQ2pFLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsT0FBTyxFQUFFLDBEQUEwRDtTQUNwRSxDQUFDLENBQUE7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLHFFQUFxRTtRQUNyRSw4QkFBOEI7UUFDOUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxrREFBa0QsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUV4RSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLE9BQU8sRUFBRSwwREFBMEQ7U0FDcEUsQ0FBQyxDQUFBO0lBQ0osQ0FBQztBQUNILENBQUMsQ0FBQTtBQXhEWSxRQUFBLElBQUksUUF3RGhCIn0=
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2F1dGgvY3VzdG9tZXIvZW1haWxwYXNzL3Jlc2V0LXBhc3N3b3JkL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUEyRjtBQUUzRiwyRkFBb0c7QUFFcEc7O0dBRUc7QUFDSCxLQUFLLFVBQVUsc0JBQXNCLENBQ25DLEtBQWEsRUFDYixLQUFhLEVBQ2IsU0FBYztJQUVkLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkRBQTJELENBQUMsQ0FBQTtJQUV4RSxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLFlBQVksQ0FHakUsQ0FBQTtJQUVELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQTtRQUN4RSxPQUFNO0lBQ1IsQ0FBQztJQUVELGdEQUFnRDtJQUNoRCxJQUFJLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQTtJQUMzQyxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ3pFLGFBQWE7WUFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWM7Z0JBQ3pCLE1BQU0sRUFBRSxhQUFxQixFQUFFLGFBQWE7Z0JBQzdDLHVCQUF1QixDQUFBO0lBQzNCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQywwRUFBMEUsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUNqRyxDQUFDO0lBRUQsMkRBQTJEO0lBQzNELE1BQU0sUUFBUSxHQUFHLEdBQUcsYUFBYSx5QkFBeUIsa0JBQWtCLENBQUMsS0FBSyxDQUFDLFVBQVUsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQTtJQUV4SCxn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
@@ -5,19 +5,20 @@ const utils_1 = require("@medusajs/framework/utils");
5
5
  /**
6
6
  * Password reset completion endpoint
7
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
8
+ * This endpoint uses Medusa's built-in AUTH module updateProvider method
9
+ * to update the customer's password. The AUTH module handles:
10
+ * 1. Token validation (from Authorization header)
11
+ * 2. Password hashing
12
+ * 3. Database updates
13
+ *
14
+ * This matches Medusa's built-in `/auth/{actor_type}/{provider}/update` route behavior.
14
15
  */
15
16
  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 ", "");
17
+ const { email, password } = req.body;
18
+ // Get token from Authorization header (required by Medusa's built-in route)
19
+ const resetToken = req.headers.authorization?.replace("Bearer ", "");
19
20
  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
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Reset token is required. Provide it in the 'Authorization: Bearer {token}' header");
21
22
  }
22
23
  if (!email || typeof email !== "string" || !email.trim()) {
23
24
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Email is required");
@@ -25,32 +26,21 @@ const POST = async (req, res) => {
25
26
  if (!password || typeof password !== "string" || password.length < 8) {
26
27
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Password is required and must be at least 8 characters");
27
28
  }
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
- };
29
+ const normalizedEmail = email.toLowerCase().trim();
48
30
  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.");
31
+ // Get AUTH service
32
+ const authService = req.scope.resolve(utils_1.Modules.AUTH);
33
+ // Use Medusa's built-in updateProvider method
34
+ // This method validates the token, hashes the password, and updates it in the database
35
+ // Pass the token in the data object (matching SDK behavior)
36
+ const result = await authService.updateProvider("emailpass", {
37
+ entity_id: normalizedEmail,
38
+ password: password,
39
+ token: resetToken,
40
+ });
41
+ // updateProvider returns the updated auth identity on success
42
+ if (!result) {
43
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, "Failed to reset password. Invalid or expired token.");
54
44
  }
55
45
  return res.status(200).json({
56
46
  message: "Password reset successfully",
@@ -68,4 +58,4 @@ const POST = async (req, res) => {
68
58
  }
69
59
  };
70
60
  exports.POST = POST;
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2F1dGgvY3VzdG9tZXIvZW1haWxwYXNzL3VwZGF0ZS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBZ0U7QUFHaEU7Ozs7Ozs7OztHQVNHO0FBQ0ksTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ3BFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUl0QyxDQUFBO0lBRUQsOENBQThDO0lBQzlDLE1BQU0sVUFBVSxHQUFHLEtBQUssSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBRTdFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixvR0FBb0csQ0FDckcsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3pELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG1CQUFtQixDQUNwQixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDckUsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsd0RBQXdELENBQ3pELENBQUE7SUFDSCxDQUFDO0lBRUQsbUJBQW1CO0lBQ25CLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVuRCw2REFBNkQ7SUFDN0QseUZBQXlGO0lBQ3pGLE1BQU0sT0FBTyxHQUEyQixFQUFFLENBQUE7SUFDMUMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ3hFLENBQUM7SUFDRCxPQUFPLENBQUMsYUFBYSxHQUFHLFVBQVUsVUFBVSxFQUFFLENBQUE7SUFFOUMsTUFBTSxRQUFRLEdBQUc7UUFDZixHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUc7UUFDWixPQUFPO1FBQ1AsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1FBQ2hCLElBQUksRUFBRTtZQUNKLEtBQUssRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFO1lBQ2pDLFFBQVE7WUFDUixNQUFNLEVBQUUsaUJBQWlCO1NBQzFCO1FBQ0QsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO0tBQ0EsQ0FBQTtJQUV4QixJQUFJLENBQUM7UUFDSCxxRUFBcUU7UUFDckUsa0VBQWtFO1FBQ2xFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sV0FBVyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFFOUYsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLEtBQUssSUFBSSxxREFBcUQsQ0FDL0QsQ0FBQTtRQUNILENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLE9BQU8sRUFBRSw2QkFBNkI7WUFDdEMsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDLENBQUE7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLDZCQUE2QjtRQUM3QixJQUFJLEtBQUssWUFBWSxtQkFBVyxFQUFFLENBQUM7WUFDakMsTUFBTSxLQUFLLENBQUE7UUFDYixDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDbkUsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyw2QkFBNkIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ3RGLENBQUE7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxDQUFBO0FBbkZZLFFBQUEsSUFBSSxRQW1GaEIifQ==
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2F1dGgvY3VzdG9tZXIvZW1haWxwYXNzL3VwZGF0ZS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBZ0U7QUFFaEU7Ozs7Ozs7Ozs7R0FVRztBQUNJLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNwRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUcvQixDQUFBO0lBRUQsNEVBQTRFO0lBQzVFLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFFcEUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG1GQUFtRixDQUNwRixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDekQsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsbUJBQW1CLENBQ3BCLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyRSxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix3REFBd0QsQ0FDekQsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUE7SUFFbEQsSUFBSSxDQUFDO1FBQ0gsbUJBQW1CO1FBQ25CLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVuRCw4Q0FBOEM7UUFDOUMsdUZBQXVGO1FBQ3ZGLDREQUE0RDtRQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxjQUFjLENBQzdDLFdBQVcsRUFDWDtZQUNFLFNBQVMsRUFBRSxlQUFlO1lBQzFCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLEtBQUssRUFBRSxVQUFVO1NBQ2xCLENBQ0YsQ0FBQTtRQUVELDhEQUE4RDtRQUM5RCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixxREFBcUQsQ0FDdEQsQ0FBQTtRQUNILENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLE9BQU8sRUFBRSw2QkFBNkI7WUFDdEMsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDLENBQUE7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLDZCQUE2QjtRQUM3QixJQUFJLEtBQUssWUFBWSxtQkFBVyxFQUFFLENBQUM7WUFDakMsTUFBTSxLQUFLLENBQUE7UUFDYixDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDbkUsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyw2QkFBNkIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ3RGLENBQUE7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxDQUFBO0FBekVZLFFBQUEsSUFBSSxRQXlFaEIifQ==
@@ -2,19 +2,21 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createCompletePasswordReset = exports.createRequestPasswordReset = exports.completePasswordReset = exports.requestPasswordReset = void 0;
4
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";
5
+ const RESET_PASSWORD_ENDPOINT = "/auth/customer/emailpass/reset-password";
6
+ const COMPLETE_PASSWORD_RESET_ENDPOINT = "/auth/customer/emailpass/update";
7
7
  const resolveEndpoint = (defaultEndpoint, endpoint) => endpoint?.startsWith("/") ? endpoint : defaultEndpoint;
8
8
  /**
9
9
  * Request a password reset for a customer
10
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.
11
+ * This function calls the password reset endpoint which generates a JWT reset token
12
+ * and sends a password reset email to the customer.
13
+ *
14
+ * The API returns an empty object `{}` with 201 status for security reasons
15
+ * (doesn't reveal if email exists to prevent email enumeration attacks).
14
16
  *
15
17
  * @param input - Password reset request input
16
18
  * @param options - Transport options (baseUrl, client, publishableApiKey, etc.)
17
- * @returns Promise resolving to the reset request response
19
+ * @returns Promise resolving to the reset request response (empty object on success)
18
20
  *
19
21
  * @example
20
22
  * ```typescript
@@ -47,10 +49,12 @@ const requestPasswordReset = async (input, options = {}) => {
47
49
  body: JSON.stringify(payload),
48
50
  headers,
49
51
  });
50
- if (!raw || typeof raw !== "object") {
52
+ // Accept empty object {} as valid response (API returns {} for security)
53
+ if (raw === null || (typeof raw !== "object" && raw !== undefined)) {
51
54
  throw new Error("Invalid response from password reset endpoint");
52
55
  }
53
- return raw;
56
+ // Return empty object or the response as-is
57
+ return (raw || {});
54
58
  }
55
59
  const fetchImpl = options.fetchImpl ?? globalThis.fetch;
56
60
  if (!fetchImpl) {
@@ -67,22 +71,30 @@ const requestPasswordReset = async (input, options = {}) => {
67
71
  const body = await response.text();
68
72
  throw new Error(body || `Failed to request password reset (status ${response.status})`);
69
73
  }
70
- const json = await response.json();
71
- if (!json || typeof json !== "object") {
72
- throw new Error("Invalid response format from password reset endpoint");
74
+ // Handle empty response (204 No Content) or empty JSON object
75
+ const contentType = response.headers.get("content-type");
76
+ if (contentType && contentType.includes("application/json")) {
77
+ const json = await response.json();
78
+ // Accept empty object {} as valid response
79
+ return (json || {});
73
80
  }
74
- return json;
81
+ // If no content, return empty object
82
+ return {};
75
83
  };
76
84
  exports.requestPasswordReset = requestPasswordReset;
77
85
  /**
78
86
  * Complete a password reset with a new password
79
87
  *
80
88
  * 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.
89
+ * the reset token and updates the customer's password using Medusa's AUTH module
90
+ * `updateProvider` method.
91
+ *
92
+ * The token is sent in both:
93
+ * - The request body (`token` field)
94
+ * - The `Authorization: Bearer {token}` header (automatically added)
82
95
  *
83
- * The token can be provided either:
84
- * - In the `token` field of the input
85
- * - Via `Authorization: Bearer {token}` header in options.headers
96
+ * The route reads the token from the Authorization header and passes it to
97
+ * `updateProvider`, which handles token validation, password hashing, and database updates.
86
98
  *
87
99
  * @param input - Password reset completion input
88
100
  * @param options - Transport options (baseUrl, client, publishableApiKey, etc.)
@@ -102,7 +114,7 @@ exports.requestPasswordReset = requestPasswordReset;
102
114
  * { baseUrl: "https://store.example.com", publishableApiKey: "pk_..." }
103
115
  * )
104
116
  *
105
- * // With token in Authorization header
117
+ * // With token in Authorization header (helper automatically adds it)
106
118
  * const result = await completePasswordReset(
107
119
  * {
108
120
  * email: "customer@example.com",
@@ -190,4 +202,4 @@ exports.createRequestPasswordReset = createRequestPasswordReset;
190
202
  */
191
203
  const createCompletePasswordReset = (options = {}) => (input) => (0, exports.completePasswordReset)(input, options);
192
204
  exports.createCompletePasswordReset = createCompletePasswordReset;
193
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzZXQtcGFzc3dvcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaGVscGVycy9yZXNldC1wYXNzd29yZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQ0FLc0I7QUFFdEIsTUFBTSx1QkFBdUIsR0FBRywrQ0FBK0MsQ0FBQTtBQUMvRSxNQUFNLGdDQUFnQyxHQUFHLHVDQUF1QyxDQUFBO0FBRWhGLE1BQU0sZUFBZSxHQUFHLENBQUMsZUFBdUIsRUFBRSxRQUFpQixFQUFFLEVBQUUsQ0FDckUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUE7QUFtQ3hEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0ksTUFBTSxvQkFBb0IsR0FBRyxLQUFLLEVBQ3ZDLEtBQWdDLEVBQ2hDLFVBQXVDLEVBQUUsRUFDRixFQUFFO0lBQ3pDLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDekUsTUFBTSxPQUFPLEdBQUc7UUFDZCxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUU7S0FDeEMsQ0FBQTtJQUVELE1BQU0sYUFBYSxHQUFHLElBQUEsOEJBQWdCLEVBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3RELElBQUksYUFBYSxFQUFFLENBQUM7UUFDbEIsTUFBTSxPQUFPLEdBQUcsSUFBQSwwQkFBWSxFQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3JDLE1BQU0sR0FBRyxHQUFHLE1BQU0sYUFBYSxDQUFDLFFBQVEsRUFBRTtZQUN4QyxNQUFNLEVBQUUsTUFBTTtZQUNkLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztZQUM3QixPQUFPO1NBQ1IsQ0FBQyxDQUFBO1FB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
205
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzZXQtcGFzc3dvcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaGVscGVycy9yZXNldC1wYXNzd29yZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQ0FLc0I7QUFFdEIsTUFBTSx1QkFBdUIsR0FBRyx5Q0FBeUMsQ0FBQTtBQUN6RSxNQUFNLGdDQUFnQyxHQUFHLGlDQUFpQyxDQUFBO0FBRTFFLE1BQU0sZUFBZSxHQUFHLENBQUMsZUFBdUIsRUFBRSxRQUFpQixFQUFFLEVBQUUsQ0FDckUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUE7QUFnQ3hEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSSxNQUFNLG9CQUFvQixHQUFHLEtBQUssRUFDdkMsS0FBZ0MsRUFDaEMsVUFBdUMsRUFBRSxFQUNGLEVBQUU7SUFDekMsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN6RSxNQUFNLE9BQU8sR0FBRztRQUNkLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRTtLQUN4QyxDQUFBO0lBRUQsTUFBTSxhQUFhLEdBQUcsSUFBQSw4QkFBZ0IsRUFBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdEQsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQixNQUFNLE9BQU8sR0FBRyxJQUFBLDBCQUFZLEVBQUMsT0FBTyxDQUFDLENBQUE7UUFDckMsTUFBTSxHQUFHLEdBQUcsTUFBTSxhQUFhLENBQUMsUUFBUSxFQUFFO1lBQ3hDLE1BQU0sRUFBRSxNQUFNO1lBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO1lBQzdCLE9BQU87U0FDUixDQUFDLENBQUE7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
@@ -369,6 +369,30 @@ class OtpVerificationService extends (0, utils_1.MedusaService)({
369
369
  SET phone_verified = ?, updated_at = NOW()
370
370
  WHERE id = ?`, [true, customerId]);
371
371
  }
372
+ /**
373
+ * Set customer phone verification status to false
374
+ */
375
+ async setPhoneVerifiedFalse(sharedContext, customerId) {
376
+ const knex = sharedContext.manager?.getKnex();
377
+ if (!knex) {
378
+ throw new Error("Database connection not available");
379
+ }
380
+ await knex.raw(`UPDATE customer
381
+ SET phone_verified = ?, updated_at = NOW()
382
+ WHERE id = ?`, [false, customerId]);
383
+ }
384
+ /**
385
+ * Set customer email verification status to false
386
+ */
387
+ async setEmailVerifiedFalse(sharedContext, customerId) {
388
+ const knex = sharedContext.manager?.getKnex();
389
+ if (!knex) {
390
+ throw new Error("Database connection not available");
391
+ }
392
+ await knex.raw(`UPDATE customer
393
+ SET email_verified = ?, updated_at = NOW()
394
+ WHERE id = ?`, [false, customerId]);
395
+ }
372
396
  /**
373
397
  * Get customer verification status
374
398
  */
@@ -434,6 +458,20 @@ __decorate([
434
458
  __metadata("design:paramtypes", [Object, String]),
435
459
  __metadata("design:returntype", Promise)
436
460
  ], OtpVerificationService.prototype, "updatePhoneVerified", null);
461
+ __decorate([
462
+ (0, utils_2.InjectManager)(),
463
+ __param(0, (0, utils_3.MedusaContext)()),
464
+ __metadata("design:type", Function),
465
+ __metadata("design:paramtypes", [Object, String]),
466
+ __metadata("design:returntype", Promise)
467
+ ], OtpVerificationService.prototype, "setPhoneVerifiedFalse", null);
468
+ __decorate([
469
+ (0, utils_2.InjectManager)(),
470
+ __param(0, (0, utils_3.MedusaContext)()),
471
+ __metadata("design:type", Function),
472
+ __metadata("design:paramtypes", [Object, String]),
473
+ __metadata("design:returntype", Promise)
474
+ ], OtpVerificationService.prototype, "setEmailVerifiedFalse", null);
437
475
  __decorate([
438
476
  (0, utils_2.InjectManager)(),
439
477
  __param(0, (0, utils_3.MedusaContext)()),
@@ -448,4 +486,4 @@ __decorate([
448
486
  __metadata("design:paramtypes", [Object, String]),
449
487
  __metadata("design:returntype", Promise)
450
488
  ], OtpVerificationService.prototype, "getCustomerVerificationByEmail", null);
451
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL290cC12ZXJpZmljYXRpb24vc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBc0U7QUFDdEUscURBQXlEO0FBRXpELHFEQUF5RDtBQUV6RCxvREFBMkI7QUFDM0IsZ0VBQThCO0FBQzlCLGdFQUF1RTtBQVl2RSxNQUFhLHNCQUF1QixTQUFRLElBQUEscUJBQWEsRUFBQztJQUN4RCxlQUFlLEVBQWYsa0NBQWU7Q0FDaEIsQ0FBQztJQUdBLFlBQ0UsU0FBK0IsRUFDL0IsYUFBeUIsRUFDekIsaUJBQTJDO1FBRTNDLEtBQUssQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUE7UUFFbEQsTUFBTSxlQUFlLEdBQUcsaUJBQWlCLEVBQUUsT0FBTyxJQUFJLGFBQWEsSUFBSSxFQUFFLENBQUE7UUFDekUsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFNBQVMsRUFBRSxDQUFDO1lBQ1osVUFBVSxFQUFFLFNBQVM7WUFDckIsZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixXQUFXLEVBQUUsQ0FBQztZQUNkLEdBQUcsZUFBZTtTQUNuQixDQUFBO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCLENBQUMsSUFBZ0I7UUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUF1QixDQUFDLENBQUE7UUFDcEQsK0JBQStCO1FBQy9CLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxzQ0FBc0MsSUFBSSw2QkFBNkIsRUFDdkUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQzFCLENBQUE7UUFDSCxDQUFDO1FB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
489
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL290cC12ZXJpZmljYXRpb24vc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBc0U7QUFDdEUscURBQXlEO0FBRXpELHFEQUF5RDtBQUV6RCxvREFBMkI7QUFDM0IsZ0VBQThCO0FBQzlCLGdFQUF1RTtBQVl2RSxNQUFhLHNCQUF1QixTQUFRLElBQUEscUJBQWEsRUFBQztJQUN4RCxlQUFlLEVBQWYsa0NBQWU7Q0FDaEIsQ0FBQztJQUdBLFlBQ0UsU0FBK0IsRUFDL0IsYUFBeUIsRUFDekIsaUJBQTJDO1FBRTNDLEtBQUssQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUE7UUFFbEQsTUFBTSxlQUFlLEdBQUcsaUJBQWlCLEVBQUUsT0FBTyxJQUFJLGFBQWEsSUFBSSxFQUFFLENBQUE7UUFDekUsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFNBQVMsRUFBRSxDQUFDO1lBQ1osVUFBVSxFQUFFLFNBQVM7WUFDckIsZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixXQUFXLEVBQUUsQ0FBQztZQUNkLEdBQUcsZUFBZTtTQUNuQixDQUFBO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCLENBQUMsSUFBZ0I7UUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUF1QixDQUFDLENBQUE7UUFDcEQsK0JBQStCO1FBQy9CLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxzQ0FBc0MsSUFBSSw2QkFBNkIsRUFDdkUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQzFCLENBQUE7UUFDSCxDQUFDO1FB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
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = customerUpdatedHandler;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ /**
7
+ * Subscriber for customer.updated events
8
+ *
9
+ * This subscriber listens to Medusa's built-in `customer.updated` event
10
+ * and automatically sets `phone_verified = false` when a customer's phone
11
+ * number is updated via Medusa's default `/store/customers/me` API.
12
+ *
13
+ * Logic:
14
+ * - Stores the current phone in customer metadata as `_previous_phone`
15
+ * - On first update with phone: sets `phone_verified = false`
16
+ * - On subsequent updates: compares stored previous phone with current phone
17
+ * - Only resets `phone_verified = false` if phone actually changed
18
+ */
19
+ async function customerUpdatedHandler({ event: { data }, container, }) {
20
+ const customerId = data.id;
21
+ console.log(`[customer-updated] Event received for customer: ${customerId}`);
22
+ if (!customerId) {
23
+ console.error("[customer-updated] No customer ID in event data");
24
+ return;
25
+ }
26
+ try {
27
+ // Get customer service to retrieve current customer data
28
+ const customerService = container.resolve(utils_1.Modules.CUSTOMER);
29
+ // Get database connection to update phone_verified directly
30
+ const knex = container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
31
+ // Retrieve the updated customer (has new phone after update)
32
+ const customer = await customerService.retrieveCustomer(customerId);
33
+ if (!customer) {
34
+ console.error(`[customer-updated] Customer ${customerId} not found`);
35
+ return;
36
+ }
37
+ console.log(`[customer-updated] Customer retrieved: ${customerId}, phone: ${customer.phone || 'none'}`);
38
+ // Get previous phone from metadata (stored in previous update)
39
+ const previousPhone = customer.metadata?._previous_phone;
40
+ const currentPhone = customer.phone ? customer.phone.trim() : null;
41
+ // Only reset phone_verified if:
42
+ // 1. Customer has a phone number
43
+ // 2. Either it's the first update (no previous phone) OR phone changed
44
+ if (currentPhone) {
45
+ if (!previousPhone) {
46
+ // First update - set phone_verified to false
47
+ await knex.raw(`UPDATE customer
48
+ SET phone_verified = ?, updated_at = NOW()
49
+ WHERE id = ?`, [false, customerId]);
50
+ console.log(`[customer-updated] Phone verification reset for customer ${customerId} (first time storing phone: ${currentPhone})`);
51
+ }
52
+ else if (previousPhone.trim() !== currentPhone) {
53
+ // Phone was changed - reset verification
54
+ await knex.raw(`UPDATE customer
55
+ SET phone_verified = ?, updated_at = NOW()
56
+ WHERE id = ?`, [false, customerId]);
57
+ console.log(`[customer-updated] Phone verification reset for customer ${customerId} (phone changed from ${previousPhone} to ${currentPhone})`);
58
+ }
59
+ else {
60
+ // Phone not changed
61
+ console.log(`[customer-updated] Phone not changed for customer ${customerId} (${currentPhone}), skipping verification reset`);
62
+ }
63
+ // Store current phone in metadata for next comparison
64
+ const currentMetadata = customer.metadata || {};
65
+ await customerService.updateCustomers(customerId, {
66
+ metadata: {
67
+ ...currentMetadata,
68
+ _previous_phone: currentPhone,
69
+ },
70
+ });
71
+ }
72
+ else {
73
+ // No phone number - clear stored previous phone if it exists
74
+ if (previousPhone) {
75
+ const currentMetadata = customer.metadata || {};
76
+ await customerService.updateCustomers(customerId, {
77
+ metadata: {
78
+ ...currentMetadata,
79
+ _previous_phone: null,
80
+ },
81
+ });
82
+ }
83
+ console.log(`[customer-updated] No phone number found for customer ${customerId}, skipping verification reset`);
84
+ }
85
+ }
86
+ catch (error) {
87
+ // Log error but don't throw - subscriber errors shouldn't break the main flow
88
+ console.error(`[customer-updated] Error processing customer update for ${customerId}:`, error);
89
+ }
90
+ }
91
+ /**
92
+ * Subscriber configuration
93
+ *
94
+ * Listens to Medusa's built-in customer.updated event
95
+ * This event is triggered when a customer is updated via the updateCustomers workflow.
96
+ */
97
+ exports.config = {
98
+ event: "customer.updated",
99
+ };
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tZXItdXBkYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9jdXN0b21lci11cGRhdGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTJCQSx5Q0FtR0M7QUExSEQscURBQThFO0FBVTlFOzs7Ozs7Ozs7Ozs7R0FZRztBQUNZLEtBQUssVUFBVSxzQkFBc0IsQ0FBQyxFQUNuRCxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFDZixTQUFTLEdBQ2dDO0lBQ3pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUE7SUFFMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtREFBbUQsVUFBVSxFQUFFLENBQUMsQ0FBQTtJQUU1RSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFBO1FBQ2hFLE9BQU07SUFDUixDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gseURBQXlEO1FBQ3pELE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQ3ZDLGVBQU8sQ0FBQyxRQUFRLENBQ2pCLENBQUE7UUFFRCw0REFBNEQ7UUFDNUQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUV2RSw2REFBNkQ7UUFDN0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUE7UUFFbkUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsVUFBVSxZQUFZLENBQUMsQ0FBQTtZQUNwRSxPQUFNO1FBQ1IsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsMENBQTBDLFVBQVUsWUFBWSxRQUFRLENBQUMsS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFFdkcsK0RBQStEO1FBQy9ELE1BQU0sYUFBYSxHQUFJLFFBQVEsQ0FBQyxRQUFvQyxFQUFFLGVBQXFDLENBQUE7UUFDM0csTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO1FBRWxFLGdDQUFnQztRQUNoQyxpQ0FBaUM7UUFDakMsdUVBQXVFO1FBQ3ZFLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNuQiw2Q0FBNkM7Z0JBQzdDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FDWjs7d0JBRWMsRUFDZCxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FDcEIsQ0FBQTtnQkFFRCxPQUFPLENBQUMsR0FBRyxDQUNULDREQUE0RCxVQUFVLCtCQUErQixZQUFZLEdBQUcsQ0FDckgsQ0FBQTtZQUNILENBQUM7aUJBQU0sSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLEtBQUssWUFBWSxFQUFFLENBQUM7Z0JBQ2pELHlDQUF5QztnQkFDekMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUNaOzt3QkFFYyxFQUNkLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUNwQixDQUFBO2dCQUVELE9BQU8sQ0FBQyxHQUFHLENBQ1QsNERBQTRELFVBQVUsd0JBQXdCLGFBQWEsT0FBTyxZQUFZLEdBQUcsQ0FDbEksQ0FBQTtZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixvQkFBb0I7Z0JBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQ1QscURBQXFELFVBQVUsS0FBSyxZQUFZLGdDQUFnQyxDQUNqSCxDQUFBO1lBQ0gsQ0FBQztZQUVELHNEQUFzRDtZQUN0RCxNQUFNLGVBQWUsR0FBSSxRQUFRLENBQUMsUUFBb0MsSUFBSSxFQUFFLENBQUE7WUFDNUUsTUFBTSxlQUFlLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRTtnQkFDaEQsUUFBUSxFQUFFO29CQUNSLEdBQUcsZUFBZTtvQkFDbEIsZUFBZSxFQUFFLFlBQVk7aUJBQzlCO2FBQ0YsQ0FBQyxDQUFBO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTiw2REFBNkQ7WUFDN0QsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxlQUFlLEdBQUksUUFBUSxDQUFDLFFBQW9DLElBQUksRUFBRSxDQUFBO2dCQUM1RSxNQUFNLGVBQWUsQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFO29CQUNoRCxRQUFRLEVBQUU7d0JBQ1IsR0FBRyxlQUFlO3dCQUNsQixlQUFlLEVBQUUsSUFBSTtxQkFDdEI7aUJBQ0YsQ0FBQyxDQUFBO1lBQ0osQ0FBQztZQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMseURBQXlELFVBQVUsK0JBQStCLENBQUMsQ0FBQTtRQUNqSCxDQUFDO0lBQ0gsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZiw4RUFBOEU7UUFDOUUsT0FBTyxDQUFDLEtBQUssQ0FDWCwyREFBMkQsVUFBVSxHQUFHLEVBQ3hFLEtBQUssQ0FDTixDQUFBO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNVLFFBQUEsTUFBTSxHQUFxQjtJQUN0QyxLQUFLLEVBQUUsa0JBQWtCO0NBQzFCLENBQUEifQ==
@@ -4,9 +4,10 @@ exports.config = void 0;
4
4
  exports.default = passwordResetHandler;
5
5
  const utils_1 = require("@medusajs/framework/utils");
6
6
  /**
7
- * Notification subscriber for customer password reset events
7
+ * Notification subscriber for password reset events
8
8
  *
9
- * This subscriber listens to Medusa's built-in `customer.password_reset` event
9
+ * This subscriber listens to Medusa's built-in `auth.password_reset` event
10
+ * (emitted by Medusa's built-in `/auth/{actor_type}/{provider}/reset-password` route)
10
11
  * and sends a password reset email with the reset token and URL.
11
12
  *
12
13
  * The email includes:
@@ -14,81 +15,170 @@ const utils_1 = require("@medusajs/framework/utils");
14
15
  * - Token value (as backup)
15
16
  * - Expiration information
16
17
  * - Security notice
18
+ *
19
+ * Note: If using the custom reset-password route in this plugin, the email
20
+ * is sent directly from the route. This subscriber handles cases where
21
+ * Medusa's built-in route is used.
17
22
  */
18
23
  async function passwordResetHandler({ event: { data }, container, }) {
19
- const notificationService = container.resolve(utils_1.Modules.NOTIFICATION);
20
- if (!notificationService) {
21
- console.error("[password-reset] Notification service is not configured");
24
+ console.log("[password-reset] Subscriber triggered");
25
+ console.log("[password-reset] Event data received:", JSON.stringify(data, null, 2));
26
+ // Extract email and token with defensive checks for different event data structures
27
+ let email;
28
+ let token;
29
+ // Handle different possible event data structures
30
+ if (data && typeof data === "object") {
31
+ // Direct properties
32
+ email = data.email || data.customer_email;
33
+ token = data.token || data.reset_token || data.password_reset_token;
34
+ // Nested in data property
35
+ if (!email && data.data) {
36
+ const nestedData = data.data;
37
+ email = nestedData.email || nestedData.customer_email;
38
+ token = nestedData.token || nestedData.reset_token || nestedData.password_reset_token;
39
+ }
40
+ }
41
+ // Validate required fields
42
+ if (!email || typeof email !== "string" || !email.trim()) {
43
+ console.error("[password-reset] Missing or invalid email in event data", {
44
+ email,
45
+ dataKeys: data ? Object.keys(data) : [],
46
+ fullData: data
47
+ });
22
48
  return;
23
49
  }
24
- const { email, token } = data;
25
- if (!email || !token) {
26
- console.error("[password-reset] Missing email or token in event data", { email, token });
50
+ if (!token || typeof token !== "string" || !token.trim()) {
51
+ console.error("[password-reset] Missing or invalid token in event data", {
52
+ token,
53
+ dataKeys: data ? Object.keys(data) : [],
54
+ fullData: data
55
+ });
27
56
  return;
28
57
  }
58
+ console.log("[password-reset] Extracted email and token", { email, tokenLength: token.length });
59
+ // Resolve notification service with error handling
60
+ let notificationService;
61
+ try {
62
+ notificationService = container.resolve(utils_1.Modules.NOTIFICATION);
63
+ }
64
+ catch (error) {
65
+ console.error("[password-reset] Failed to resolve notification service:", error);
66
+ return;
67
+ }
68
+ if (!notificationService) {
69
+ console.error("[password-reset] Notification service is not configured");
70
+ return;
71
+ }
72
+ console.log("[password-reset] Notification service resolved", {
73
+ hasCreate: typeof notificationService.create === "function",
74
+ hasCreateNotifications: typeof notificationService.createNotifications === "function"
75
+ });
29
76
  // Get storefront URL from environment or config
30
- const config = container.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
31
- const storefrontUrl = process.env.STOREFRONT_URL ||
32
- config?.projectConfig?.storefrontUrl ||
33
- "http://localhost:8000";
77
+ let storefrontUrl = "http://localhost:8000";
78
+ try {
79
+ const config = container.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
80
+ storefrontUrl =
81
+ process.env.STOREFRONT_URL ||
82
+ config?.projectConfig?.storefrontUrl ||
83
+ "http://localhost:8000";
84
+ }
85
+ catch (error) {
86
+ console.warn("[password-reset] Failed to resolve config, using default storefront URL:", error);
87
+ }
88
+ console.log("[password-reset] Storefront URL:", storefrontUrl);
34
89
  // Build reset URL with token and email as query parameters
35
90
  const resetUrl = `${storefrontUrl}/reset-password?token=${encodeURIComponent(token)}&email=${encodeURIComponent(email)}`;
91
+ // Prepare HTML and text content
92
+ const htmlContent = `
93
+ <html>
94
+ <body>
95
+ <h2>Reset Your Password</h2>
96
+ <p>Hello,</p>
97
+ <p>You requested to reset your password. Click the link below to reset it:</p>
98
+ <p><a href="${resetUrl}">Reset Password</a></p>
99
+ <p>Or use this token: <code>${token}</code></p>
100
+ <p>This link will expire in 1 hour.</p>
101
+ <p>If you didn't request a password reset, please ignore this email.</p>
102
+ <p>Best regards,<br>Your Team</p>
103
+ </body>
104
+ </html>
105
+ `.trim();
106
+ const textContent = `Reset Your Password\n\nClick this link to reset your password: ${resetUrl}\n\nToken: ${token}\n\nThis link will expire in 1 hour.\n\nIf you didn't request a password reset, please ignore this email.`;
36
107
  // Prepare email payload matching notification service structure
108
+ // Structure matches the working send-notification-step.ts format
37
109
  const payload = {
38
110
  to: email,
39
111
  channel: "email",
40
- template: "password-reset", // Template ID configured in notification provider
41
112
  data: {
113
+ subject: "Reset Your Password",
42
114
  email,
43
115
  token,
44
116
  reset_url: resetUrl,
45
- subject: "Reset Your Password",
46
117
  expires_in: "1 hour",
118
+ // Include HTML and text in data for providers that read from there
119
+ html: htmlContent,
120
+ text: textContent,
47
121
  },
48
- // Include HTML body for providers that need it
49
- html: `
50
- <html>
51
- <body>
52
- <h2>Reset Your Password</h2>
53
- <p>Hello,</p>
54
- <p>You requested to reset your password. Click the link below to reset it:</p>
55
- <p><a href="${resetUrl}">Reset Password</a></p>
56
- <p>Or use this token: <code>${token}</code></p>
57
- <p>This link will expire in 1 hour.</p>
58
- <p>If you didn't request a password reset, please ignore this email.</p>
59
- <p>Best regards,<br>Your Team</p>
60
- </body>
61
- </html>
62
- `.trim(),
63
- text: `Reset Your Password\n\nClick this link to reset your password: ${resetUrl}\n\nToken: ${token}\n\nThis link will expire in 1 hour.\n\nIf you didn't request a password reset, please ignore this email.`,
122
+ // Include HTML and text at root level for SMTP providers
123
+ html: htmlContent,
124
+ text: textContent,
64
125
  };
126
+ console.log("[password-reset] Prepared payload:", JSON.stringify({
127
+ to: payload.to,
128
+ channel: payload.channel,
129
+ data: {
130
+ subject: payload.data.subject,
131
+ email: payload.data.email,
132
+ hasToken: !!payload.data.token,
133
+ hasResetUrl: !!payload.data.reset_url,
134
+ hasHtml: !!payload.data.html,
135
+ hasText: !!payload.data.text,
136
+ },
137
+ hasHtml: !!payload.html,
138
+ hasText: !!payload.text,
139
+ }, null, 2));
65
140
  try {
141
+ console.log("[password-reset] Attempting to send notification...");
66
142
  // Send password reset email using notification service
67
143
  if (typeof notificationService.create === "function") {
68
- await notificationService.create(payload);
144
+ console.log("[password-reset] Using notificationService.create method");
145
+ const result = await notificationService.create(payload);
146
+ console.log("[password-reset] Notification service.create result:", result);
69
147
  }
70
148
  else if (typeof notificationService.createNotifications === "function") {
71
- await notificationService.createNotifications([payload]);
149
+ console.log("[password-reset] Using notificationService.createNotifications method");
150
+ const result = await notificationService.createNotifications([payload]);
151
+ console.log("[password-reset] Notification service.createNotifications result:", result);
72
152
  }
73
153
  else {
74
- console.error("[password-reset] Notification service does not support sending notifications");
154
+ console.error("[password-reset] Notification service does not support sending notifications", {
155
+ serviceType: typeof notificationService,
156
+ serviceKeys: Object.keys(notificationService || {})
157
+ });
75
158
  return;
76
159
  }
77
- console.log(`[password-reset] Password reset email sent to ${email}`);
160
+ console.log(`[password-reset] Password reset email sent successfully to ${email}`);
78
161
  }
79
162
  catch (error) {
80
- console.error(`[password-reset] Failed to send password reset email to ${email}:`, error);
163
+ console.error(`[password-reset] Failed to send password reset email to ${email}:`, error);
164
+ if (error instanceof Error) {
165
+ console.error("[password-reset] Error details:", {
166
+ message: error.message,
167
+ stack: error.stack,
168
+ name: error.name
169
+ });
170
+ }
81
171
  // Don't throw - subscriber errors shouldn't break the main flow
82
172
  }
83
173
  }
84
174
  /**
85
175
  * Subscriber configuration
86
176
  *
87
- * Listens to Medusa's built-in customer.password_reset event
88
- * This event is triggered when a customer requests a password reset
89
- * via the AUTH module's resetPassword method.
177
+ * Listens to Medusa's built-in auth.password_reset event
178
+ * This event is emitted by Medusa's built-in `/auth/{actor_type}/{provider}/reset-password` route
179
+ * when a password reset is requested.
90
180
  */
91
181
  exports.config = {
92
- event: "customer.password_reset",
182
+ event: "auth.password_reset",
93
183
  };
94
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtcmVzZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc3Vic2NyaWJlcnMvcGFzc3dvcmQtcmVzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMEJBLHVDQTZFQztBQW5HRCxxREFBMkY7QUFVM0Y7Ozs7Ozs7Ozs7O0dBV0c7QUFDWSxLQUFLLFVBQVUsb0JBQW9CLENBQUMsRUFDakQsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQ2YsU0FBUyxHQUM4QjtJQUN2QyxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLFlBQVksQ0FHakUsQ0FBQTtJQUVELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQTtRQUN4RSxPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFBO0lBRTdCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQixPQUFPLENBQUMsS0FBSyxDQUFDLHVEQUF1RCxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDeEYsT0FBTTtJQUNSLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUN6RSxNQUFNLGFBQWEsR0FDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjO1FBQ3pCLE1BQU0sRUFBRSxhQUFxQixFQUFFLGFBQWE7UUFDN0MsdUJBQXVCLENBQUE7SUFFekIsMkRBQTJEO0lBQzNELE1BQU0sUUFBUSxHQUFHLEdBQUcsYUFBYSx5QkFBeUIsa0JBQWtCLENBQUMsS0FBSyxDQUFDLFVBQVUsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQTtJQUV4SCxnRUFBZ0U7SUFDaEUsTUFBTSxPQUFPLEdBQUc7UUFDZCxFQUFFLEVBQUUsS0FBSztRQUNULE9BQU8sRUFBRSxPQUFPO1FBQ2hCLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxrREFBa0Q7UUFDOUUsSUFBSSxFQUFFO1lBQ0osS0FBSztZQUNMLEtBQUs7WUFDTCxTQUFTLEVBQUUsUUFBUTtZQUNuQixPQUFPLEVBQUUscUJBQXFCO1lBQzlCLFVBQVUsRUFBRSxRQUFRO1NBQ3JCO1FBQ0QsK0NBQStDO1FBQy9DLElBQUksRUFBRTs7Ozs7O3dCQU1jLFFBQVE7d0NBQ1EsS0FBSzs7Ozs7O0tBTXhDLENBQUMsSUFBSSxFQUFFO1FBQ1IsSUFBSSxFQUFFLGtFQUFrRSxRQUFRLGNBQWMsS0FBSywyR0FBMkc7S0FDL00sQ0FBQTtJQUVELElBQUksQ0FBQztRQUNILHVEQUF1RDtRQUN2RCxJQUFJLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3JELE1BQU0sbUJBQW1CLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzNDLENBQUM7YUFBTSxJQUFJLE9BQU8sbUJBQW1CLENBQUMsbUJBQW1CLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDekUsTUFBTSxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFDMUQsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLDhFQUE4RSxDQUFDLENBQUE7WUFDN0YsT0FBTTtRQUNSLENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLGlEQUFpRCxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZFLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQywyREFBMkQsS0FBSyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDekYsZ0VBQWdFO0lBQ2xFLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ1UsUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRSx5QkFBeUI7Q0FDakMsQ0FBQSJ9
184
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtcmVzZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc3Vic2NyaWJlcnMvcGFzc3dvcmQtcmVzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBa0NBLHVDQThLQztBQTVNRCxxREFBMkY7QUFhM0Y7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDWSxLQUFLLFVBQVUsb0JBQW9CLENBQUMsRUFDakQsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQ2YsU0FBUyxHQUM4QjtJQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxDQUFDLENBQUE7SUFDcEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1Q0FBdUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUVuRixvRkFBb0Y7SUFDcEYsSUFBSSxLQUF5QixDQUFBO0lBQzdCLElBQUksS0FBeUIsQ0FBQTtJQUU3QixrREFBa0Q7SUFDbEQsSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDckMsb0JBQW9CO1FBQ3BCLEtBQUssR0FBSSxJQUFJLENBQUMsS0FBZ0IsSUFBSyxJQUFJLENBQUMsY0FBeUIsQ0FBQTtRQUNqRSxLQUFLLEdBQUksSUFBSSxDQUFDLEtBQWdCLElBQUssSUFBSSxDQUFDLFdBQXNCLElBQUssSUFBSSxDQUFDLG9CQUErQixDQUFBO1FBRXZHLDBCQUEwQjtRQUMxQixJQUFJLENBQUMsS0FBSyxJQUFLLElBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqQyxNQUFNLFVBQVUsR0FBSSxJQUFZLENBQUMsSUFBSSxDQUFBO1lBQ3JDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxJQUFJLFVBQVUsQ0FBQyxjQUFjLENBQUE7WUFDckQsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksVUFBVSxDQUFDLFdBQVcsSUFBSSxV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
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateEmailFormat = validateEmailFormat;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
6
+ /**
7
+ * Validate email format
8
+ *
9
+ * @param email - Email address to validate
10
+ * @throws MedusaError if email is invalid
11
+ */
12
+ function validateEmailFormat(email) {
13
+ if (!email || typeof email !== "string" || !email.trim()) {
14
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Email is required");
15
+ }
16
+ if (!EMAIL_REGEX.test(email.trim())) {
17
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid email format");
18
+ }
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwtdmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9lbWFpbC12YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBVUEsa0RBY0M7QUF4QkQscURBQXVEO0FBRXZELE1BQU0sV0FBVyxHQUFHLDRCQUE0QixDQUFBO0FBRWhEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsS0FBYTtJQUMvQyxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3pELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG1CQUFtQixDQUNwQixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsc0JBQXNCLENBQ3ZCLENBQUE7SUFDSCxDQUFDO0FBQ0gsQ0FBQyJ9
package/README.md CHANGED
@@ -212,22 +212,25 @@ The plugin uses workflows for different verification types:
212
212
 
213
213
  ## Password Reset
214
214
 
215
- This plugin uses Medusa's built-in password reset flow via the AUTH module:
216
-
217
- 1. **Request Reset**: POST to `/store/auth/customer/emailpass/reset-password` with email
218
- - Internally calls AUTH module's `authenticate()` method with `reset-password` action
219
- - AUTH module generates token and triggers `customer.password_reset` event
220
- 2. **Email Sent**: The notification subscriber (`src/subscribers/password-reset.ts`) listens to the event and sends password reset email
221
- 3. **Complete Reset**: POST to `/store/auth/customer/emailpass/update` with token and new password
222
- - Internally calls AUTH module's `authenticate()` method with `update-password` action
215
+ This plugin provides password reset functionality using Medusa's AUTH module:
216
+
217
+ 1. **Request Reset**: POST to `/auth/customer/emailpass/reset-password` with email (or `identifier`)
218
+ - Custom route that generates JWT reset token using Medusa's `generateJwtTokenForAuthIdentity`
219
+ - Sends password reset email directly via notification service
220
+ - Returns 201 status (matches Medusa's built-in route behavior)
221
+ 2. **Email Sent**: Password reset email is sent with reset token and URL
222
+ 3. **Complete Reset**: POST to `/auth/customer/emailpass/update` with token and new password
223
+ - Uses AUTH module's `authenticate()` method with `update-password` action
223
224
  - AUTH module validates token and updates password
224
225
 
225
226
  **Key Features:**
226
- - All token generation, validation, and password hashing handled by Medusa's AUTH module
227
- - No custom JWT generation or password update logic in routes
228
- - Event-driven email notifications via subscriber
227
+ - Uses Medusa's AUTH module for token generation and password updates
228
+ - Custom routes that match Medusa's built-in route behavior
229
+ - Email sending handled directly in the route (subscriber available for `auth.password_reset` event)
229
230
  - Consistent with Medusa's authentication patterns
230
231
 
232
+ **Note:** These custom routes override Medusa's built-in routes at the same paths. The subscriber listens to `auth.password_reset` event (emitted by Medusa's built-in route) but since we're using custom routes, emails are sent directly from the route.
233
+
231
234
  **Configuration Required:**
232
235
  - Set `STOREFRONT_URL` environment variable
233
236
  - Configure email template with ID `password-reset` in your notification provider (optional, subscriber includes HTML)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "customer-registration",
3
- "version": "0.0.105",
3
+ "version": "0.0.106",
4
4
  "description": "Medusa plugin that overrides store customer registration, enforces email/phone verification flags, and provides OTP management module.",
5
5
  "author": "Medusa (https://medusajs.com)",
6
6
  "license": "MIT",