Self-service password reset

This commit is contained in:
2025-10-06 18:26:01 -04:00
parent 53c9ba8fd7
commit c127ea35f6
13 changed files with 683 additions and 21 deletions

View File

@@ -0,0 +1,44 @@
import { getUserByEmail, createPasswordResetCode } from '~/server/utils/database'
import { sendPasswordResetEmail, generateResetCode } from '~/server/utils/email'
export default defineEventHandler(async (event) => {
const body = await readBody(event)
const { email } = body
if (!email) {
throw createError({
statusCode: 400,
message: 'Email is required',
})
}
// Check if user exists with this email
const user = getUserByEmail(email)
if (!user) {
// Don't reveal if email exists or not for security
return { success: true, message: 'If an account exists with this email, a reset code has been sent.' }
}
// Generate 6-digit code
const code = generateResetCode()
// Set expiration to 15 minutes from now
const expiresAt = new Date(Date.now() + 15 * 60 * 1000).toISOString()
// Store code in database
createPasswordResetCode(email, code, expiresAt)
// Send email
try {
await sendPasswordResetEmail(email, code)
} catch (error) {
console.error('Failed to send reset email:', error)
throw createError({
statusCode: 500,
message: 'Failed to send reset email. Please try again later.',
})
}
return { success: true, message: 'If an account exists with this email, a reset code has been sent.' }
})