import { NextRequest, NextResponse } from "next/server"; import { z } from "zod"; import { getCurrentUserId } from "@/lib/session"; import { changeUserPassword } from "@/lib/users"; import { rateLimit, tooManyRequests } from "@/lib/rate-limit"; const changePasswordSchema = z.object({ currentPassword: z.string().min(1), newPassword: z.string().min(6, "Das neue Passwort muss mindestens 6 Zeichen lang sein."), }); export async function POST(request: NextRequest) { const userId = await getCurrentUserId(); if (!userId) { return NextResponse.json({ error: "Nicht authentifiziert." }, { status: 401 }); } // Bremse gegen das Durchprobieren des aktuellen Passworts: 10 Versuche je Benutzer und // 15 Minuten (nach dem Auth-Check, damit der Schlüssel die echte Benutzer-ID ist). const limited = rateLimit(`change-pw:${userId}`, 10, 15 * 60 * 1000); if (!limited.ok) return tooManyRequests(limited.retryAfterSeconds); const body = await request.json(); const parsed = changePasswordSchema.safeParse(body); if (!parsed.success) { const message = parsed.error.issues[0]?.message ?? "Ungültige Eingabe."; return NextResponse.json({ error: message }, { status: 400 }); } try { await changeUserPassword(userId, parsed.data.currentPassword, parsed.data.newPassword); } catch (e) { return NextResponse.json( { error: e instanceof Error ? e.message : "Passwort ändern fehlgeschlagen." }, { status: 400 } ); } return NextResponse.json({ ok: true }); }