mirror of
https://github.com/Since-3/Kuma.git
synced 2026-10-12 19:51:17 +00:00
33 lines
1.3 KiB
TypeScript
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);
|
|
}
|