- Add connection() API call to guarantee dynamic rendering - Fixes critical auth bypass where page was still being pre-rendered - Previous fix (force-dynamic) was insufficient in Next.js 15 - connection() API is the official Next.js 15 recommendation Resolves QA Session 2 Critical Issue #1 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
import { connection } from 'next/server';
|
|
import { setRequestLocale } from 'next-intl/server';
|
|
import type { Metadata } from 'next';
|
|
import { redirect } from 'next/navigation';
|
|
import DashboardContent from '@/components/auth/DashboardContent';
|
|
import { createClient } from '@/lib/supabase/server';
|
|
|
|
// Force dynamic rendering to ensure auth checks run on every request
|
|
export const dynamic = 'force-dynamic';
|
|
|
|
type Props = {
|
|
params: Promise<{ locale: string }>;
|
|
};
|
|
|
|
export async function generateMetadata({ params }: Props): Promise<Metadata> {
|
|
const { locale } = await params;
|
|
|
|
const titles: Record<string, string> = {
|
|
de: 'Dashboard | Damjan Savić',
|
|
en: 'Dashboard | Damjan Savić',
|
|
sr: 'Dashboard | Damjan Savić',
|
|
};
|
|
|
|
return {
|
|
title: titles[locale] || titles.de,
|
|
robots: {
|
|
index: false,
|
|
follow: false,
|
|
googleBot: {
|
|
index: false,
|
|
follow: false,
|
|
},
|
|
},
|
|
};
|
|
}
|
|
|
|
export default async function DashboardPage({ params }: Props) {
|
|
// CRITICAL: Use connection() API to guarantee dynamic rendering in Next.js 15
|
|
await connection();
|
|
|
|
const { locale } = await params;
|
|
setRequestLocale(locale);
|
|
|
|
// Server-side auth check (defense-in-depth)
|
|
const supabase = await createClient();
|
|
const { data: { user } } = await supabase.auth.getUser();
|
|
|
|
if (!user) {
|
|
redirect(`/${locale}/login`);
|
|
}
|
|
|
|
return <DashboardContent />;
|
|
}
|