Kuma/src/app/api/marketing/unsubscribe/route.ts
2026-10-02 17:31:08 +02:00

33 lines
1.3 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server";
import { setMarketingConsent } from "@/src/modules/marketing/lib/consent";
import { verifyUnsubscribeToken } from "@/src/modules/marketing/lib/unsubscribe-token";
/**
* Ein-Klick-Abmeldung aus dem Mailprogramm (RFC 8058). Gmail, Apple Mail & Co.
* schicken einen POST an die Adresse aus dem List-Unsubscribe-Header - ohne
* Cookies, ohne Rückfrage. Das signierte Token reicht als Berechtigung.
*/
export async function POST(request: NextRequest) {
const target = verifyUnsubscribeToken(request.nextUrl.searchParams.get("t"));
if (!target) {
return NextResponse.json({ error: "Ungültiger Abmeldelink" }, { status: 400 });
}
try {
await setMarketingConsent({ ...target, granted: false, source: "unsubscribe_link" });
return NextResponse.json({ unsubscribed: true });
} catch (error) {
console.error("Ein-Klick-Abmeldung fehlgeschlagen:", error);
return NextResponse.json({ error: "Abmeldung fehlgeschlagen" }, { status: 500 });
}
}
/**
* Wer die Adresse direkt öffnet, landet auf der Abmelde-Seite. Ein GET meldet
* bewusst nicht ab: Link-Scanner in Mailprogrammen rufen Links vorab auf.
*/
export function GET(request: NextRequest) {
const url = request.nextUrl.clone();
url.pathname = "/abmelden";
return NextResponse.redirect(url);
}