From d60f875793be1db7d94232423d129dedfd62a71a Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 15 Jan 2026 10:11:02 +0000 Subject: [PATCH] seo: improve metadata base and sitemap resilience Co-authored-by: dennis --- app/layout.tsx | 2 ++ lib/sitemap.ts | 20 +++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/app/layout.tsx b/app/layout.tsx index 2d9262e..5d44db1 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -4,6 +4,7 @@ import { Inter } from "next/font/google"; import React from "react"; import ClientProviders from "./components/ClientProviders"; import { cookies } from "next/headers"; +import { getBaseUrl } from "@/lib/seo"; const inter = Inter({ variable: "--font-inter", @@ -30,6 +31,7 @@ export default async function RootLayout({ } export const metadata: Metadata = { + metadataBase: new URL(getBaseUrl()), title: "Dennis Konkol | Portfolio", description: "Portfolio of Dennis Konkol, a student and software engineer based in Osnabrück, Germany. Passionate about technology, coding, and solving real-world problems.", diff --git a/lib/sitemap.ts b/lib/sitemap.ts index 4405283..8202db4 100644 --- a/lib/sitemap.ts +++ b/lib/sitemap.ts @@ -1,6 +1,7 @@ import { prisma } from "@/lib/prisma"; import { locales } from "@/i18n/locales"; import { getBaseUrl } from "@/lib/seo"; +import { PrismaClientKnownRequestError } from "@prisma/client/runtime/library"; export type SitemapEntry = { url: string; @@ -49,11 +50,20 @@ export async function getSitemapEntries(): Promise { ); // Projects: for each project slug we publish per locale (same slug) - const projects = await prisma.project.findMany({ - where: { published: true }, - select: { slug: true, updatedAt: true }, - orderBy: { updatedAt: "desc" }, - }); + let projects: Array<{ slug: string; updatedAt: Date | null }> = []; + try { + projects = await prisma.project.findMany({ + where: { published: true }, + select: { slug: true, updatedAt: true }, + orderBy: { updatedAt: "desc" }, + }); + } catch (error) { + // If DB isn't ready/migrated yet, still serve a valid sitemap for static pages. + if (error instanceof PrismaClientKnownRequestError && (error.code === "P2021" || error.code === "P2022")) { + return staticEntries; + } + throw error; + } const projectEntries: SitemapEntry[] = projects.flatMap((p) => { const lastModified = (p.updatedAt ?? new Date()).toISOString();