Files
Wabenhain/src/app/api/newsletter/confirm/route.ts
T
Nick SzaunigandClaude Opus 5.5 52ce37e216 fix: Weiterleitungen innerhalb der Seite relativ statt auf die Produktionsdomain
Sechs Route-Handler (Hinweis-Weiterleitung, E-Mail-Bestaetigung,
Newsletter bestaetigen/abmelden, Entra-Login und -Callback) bauten ihr
Weiterleitungsziel mit getBaseUrl() absolut zusammen. Ohne gesetztes
NEXT_PUBLIC_SITE_URL (lokal, Staging, Vorschau-Host) sprang man damit auf
https://wabenhain.com, und die gerade gesetzte Flash-Meldung ging auf dem
fremden Host verloren - aufgefallen, als die Admin-Pruefung nach
/api/hinweis umleitete.

Neuer Helfer lib/redirect.ts (redirectWithinSite) mit relativem
Location-Header, analog zu redirect() in Server Actions. Er lehnt alles
ausser Pfaden dieser Seite ab ("//host", "/\host", absolute URLs), damit
daraus keine offene Weiterleitung werden kann. getSiteUrl() bleibt fuer
Adressen, die die Seite verlassen (E-Mails, Stripe, Entra-redirect_uri,
Sitemap, Canonicals).

proxy.ts bleibt bei new URL("/konto", request.url) (eigener Host): der
Proxy verlangt einen absoluten Location-Header, ein relativer endet dort
in "Invalid URL" - als Kommentar festgehalten.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-26 01:11:44 +02:00

25 lines
823 B
TypeScript

import { prisma } from "@/lib/prisma";
import { ensureNewsletterDiscountCode } from "@/lib/newsletter-discount";
import { redirectWithinSite } from "@/lib/redirect";
export async function GET(request: Request) {
const token = new URL(request.url).searchParams.get("token");
if (!token) {
return redirectWithinSite("/newsletter-bestaetigt?status=invalid");
}
const subscriber = await prisma.newsletterSubscriber.findUnique({ where: { confirmationToken: token } });
if (!subscriber) {
return redirectWithinSite("/newsletter-bestaetigt?status=invalid");
}
await prisma.newsletterSubscriber.update({
where: { id: subscriber.id },
data: { confirmed: true, unsubscribedAt: null },
});
await ensureNewsletterDiscountCode();
return redirectWithinSite("/newsletter-bestaetigt?status=ok");
}