import { NextRequest, NextResponse } from 'next/server' import { prisma } from '@/lib/db' import { sendEmail } from '@/lib/email' import { randomBytes } from 'crypto' import { resendVerificationLimiter, getClientIp, rateLimitResponse } from '@/lib/rate-limit' export async function POST(req: NextRequest) { try { const ip = getClientIp(req) const rl = resendVerificationLimiter.check(ip) if (!rl.success) return rateLimitResponse(rl.resetAt) const { email } = await req.json() if (!email) { return NextResponse.json({ error: 'E-Mail-Adresse erforderlich.' }, { status: 400 }) } const user = await (prisma as any).user.findUnique({ where: { email }, include: { memberships: { include: { tenant: true } } }, }) if (!user) { // Don't reveal whether user exists return NextResponse.json({ success: true, message: 'Falls ein Konto mit dieser E-Mail existiert, wurde eine neue Bestätigungsmail gesendet.' }) } if (user.emailVerified) { return NextResponse.json({ success: true, message: 'Ihre E-Mail-Adresse ist bereits bestätigt. Sie können sich anmelden.' }) } // Generate new verification token const verificationToken = randomBytes(32).toString('hex') await (prisma as any).user.update({ where: { id: user.id }, data: { emailVerificationToken: verificationToken }, }) // Build verification URL let baseUrl = process.env.NEXTAUTH_URL || req.headers.get('origin') || `${req.headers.get('x-forwarded-proto') || 'https'}://${req.headers.get('host')}` || 'http://localhost:3000' if (baseUrl && !baseUrl.startsWith('http://') && !baseUrl.startsWith('https://')) { baseUrl = `https://${baseUrl}` } const verifyUrl = `${baseUrl}/api/auth/verify-email?token=${verificationToken}` const orgName = user.memberships?.[0]?.tenant?.name || 'Lageplan' await sendEmail( user.email, 'E-Mail-Adresse bestätigen — Lageplan', `
Hallo ${user.name},
Bitte bestätigen Sie Ihre E-Mail-Adresse, um Ihr Konto für ${orgName} zu aktivieren.
Falls der Button nicht funktioniert, kopieren Sie diesen Link:
${verifyUrl}