diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 31d853c..efae49c 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -16,7 +16,7 @@ const geistMono = Geist_Mono({ export const metadata: Metadata = { metadataBase: new URL( - process.env.NEXT_PUBLIC_SITE_URL ?? "https://kita-planer.example.com", + process.env.NEXT_PUBLIC_SITE_URL ?? "https://mein-kitaplaner.de", ), title: { default: "Der digitale Kita-Planer für Elternvereine", diff --git a/src/app/page.tsx b/src/app/page.tsx index 4322500..42d8ab1 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,7 +1,6 @@ import type { Metadata } from "next"; import Image from "next/image"; import Link from "next/link"; -import { redirect } from "next/navigation"; import { ArrowRight, CheckCircle2, @@ -23,8 +22,6 @@ import { UsersRound, } from "lucide-react"; -import { auth } from "@/auth"; -import { getPostLoginRedirect } from "@/lib/post-login-redirect"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { @@ -41,6 +38,9 @@ export const metadata: Metadata = { title: "Kita-Planer für Elterninitiativen und Kita-Vereine", description: "Die einfache Plattform für Elterninitiativen, freie Kitas und Kita-Vereine: organisiert Dienste, Termine, Krankmeldungen und offizielle Kommunikation an einem Ort.", + alternates: { + canonical: "/", + }, openGraph: { title: "Kita-Planer für Elterninitiativen und Kita-Vereine", description: @@ -172,13 +172,7 @@ const onboardingSteps = [ }, ]; -// Eingeloggte User von der Landingpage direkt weiterleiten. -export default async function LandingPage() { - const session = await auth(); - if (session?.user?.id) { - redirect(getPostLoginRedirect(session.user)); - } - +export default function LandingPage() { return (
diff --git a/src/proxy.ts b/src/proxy.ts index 42cf4c0..2c99a3a 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -14,14 +14,31 @@ import { auth } from "@/auth"; // Eingeloggt + kein kitaId + nicht /onboarding → /onboarding // Eingeloggt + SUPERADMIN → /admin // Eingeloggt + hat kitaId + auf /onboarding → /dashboard -// Eingeloggt + auf /login oder /register → / +// Eingeloggt + auf /login oder /register → Post-Login-Ziel // ===================================================================== const ONBOARDING_ROUTE = "/onboarding"; const PROTECTED_PREFIX = ["/dashboard", "/admin", "/onboarding"]; +const PUBLIC_PATHS = new Set(["/", "/impressum", "/datenschutz"]); +const PUBLIC_PREFIX = ["/features"]; + +function getPostLoginPath(user: { role?: string; kitaId?: string | null }) { + if (user.role === "SUPERADMIN") { + return "/admin"; + } + + return user.kitaId ? "/dashboard" : ONBOARDING_ROUTE; +} export async function proxy(request: NextRequest) { const { pathname } = request.nextUrl; + const isPublicRoute = + PUBLIC_PATHS.has(pathname) || + PUBLIC_PREFIX.some((prefix) => pathname.startsWith(prefix)); + + if (isPublicRoute) { + return NextResponse.next(); + } // Auth.js liest den Session-JWT aus dem Cookie — // kein DB-Call, pure Token-Verifikation (Edge-sicher). @@ -43,10 +60,12 @@ export async function proxy(request: NextRequest) { // ── 2. Eingeloggt ─────────────────────────────────────────────────── if (hasValidUser && user) { - // 2a. Eingeloggter User auf Login/Register-Seite → Startseite, - // die dann selbst zu /dashboard oder /onboarding redirectet. + // 2a. Eingeloggter User auf Login/Register-Seite → direkt zum Ziel, + // damit die öffentliche Startseite stabil indexierbar bleibt. if (pathname === "/login" || pathname === "/register") { - return NextResponse.redirect(new URL("/", request.nextUrl)); + return NextResponse.redirect( + new URL(getPostLoginPath(user), request.nextUrl), + ); } if (user.role === "SUPERADMIN" && pathname === ONBOARDING_ROUTE) { @@ -58,6 +77,7 @@ export async function proxy(request: NextRequest) { if ( !user.kitaId && user.role !== "SUPERADMIN" && + isProtectedRoute && !pathname.startsWith(ONBOARDING_ROUTE) ) { return NextResponse.redirect(new URL(ONBOARDING_ROUTE, request.nextUrl));