/** * Individual School Page (SSR) * Dynamic route for school details with full SEO optimization */ import { fetchSchoolDetails } from '@/lib/api'; import { notFound } from 'next/navigation'; import { SchoolDetailView } from '@/components/SchoolDetailView'; import { SecondarySchoolDetailView } from '@/components/SecondarySchoolDetailView'; import type { Metadata } from 'next'; interface SchoolPageProps { params: Promise<{ urn: string }>; } export async function generateMetadata({ params }: SchoolPageProps): Promise { const { urn: urnString } = await params; const urn = parseInt(urnString); if (isNaN(urn) || urn < 100000 || urn > 999999) { return { title: 'School Not Found', }; } try { const data = await fetchSchoolDetails(urn); const { school_info } = data; const isSecondary = (school_info.phase ?? '').toLowerCase().includes('secondary'); const title = `${school_info.school_name} | ${school_info.local_authority || 'England'}`; const description = isSecondary ? `View GCSE results, Attainment 8, Progress 8 and school statistics for ${school_info.school_name}${school_info.local_authority ? ` in ${school_info.local_authority}` : ''}.` : `View KS2 performance data, results, and statistics for ${school_info.school_name}${school_info.local_authority ? ` in ${school_info.local_authority}` : ''}. Compare reading, writing, and maths results.`; return { title, description, keywords: isSecondary ? `${school_info.school_name}, GCSE results, secondary school, ${school_info.local_authority}, Attainment 8, Progress 8` : `${school_info.school_name}, KS2 results, primary school, ${school_info.local_authority}, school performance, SATs results`, openGraph: { title, description, type: 'website', url: `https://schoolcompare.co.uk/school/${urn}`, siteName: 'SchoolCompare', }, twitter: { card: 'summary', title, description, }, alternates: { canonical: `https://schoolcompare.co.uk/school/${urn}`, }, }; } catch { return { title: 'School Not Found', }; } } // Force dynamic rendering export const dynamic = 'force-dynamic'; export default async function SchoolPage({ params }: SchoolPageProps) { const { urn: urnString } = await params; const urn = parseInt(urnString); // Validate URN format if (isNaN(urn) || urn < 100000 || urn > 999999) { notFound(); } // Fetch school data let data; try { data = await fetchSchoolDetails(urn); } catch (error) { console.error(`Failed to fetch school ${urn}:`, error); notFound(); } const { school_info, yearly_data, absence_data, ofsted, parent_view, census, admissions, sen_detail, phonics, deprivation, finance } = data; const isSecondary = (school_info.phase ?? '').toLowerCase().includes('secondary'); // Generate JSON-LD structured data for SEO const structuredData = { '@context': 'https://schema.org', '@type': 'EducationalOrganization', name: school_info.school_name, identifier: school_info.urn.toString(), ...(school_info.address && { address: { '@type': 'PostalAddress', streetAddress: school_info.address, addressLocality: school_info.local_authority || undefined, postalCode: school_info.postcode || undefined, addressCountry: 'GB', }, }), ...(school_info.latitude && school_info.longitude && { geo: { '@type': 'GeoCoordinates', latitude: school_info.latitude, longitude: school_info.longitude, }, }), ...(school_info.school_type && { additionalType: school_info.school_type, }), }; return ( <>