import type { MetadataRoute } from "next"; import { connection } from "next/server"; import { fetchPosts, fetchAnnouncementsPage, fetchPublishedSitePages, } from "@/lib/api"; import { canonicalPath, resolveSiteOrigin } from "@/lib/siteUrl"; export default async function sitemap(): Promise { await connection(); const origin = resolveSiteOrigin(); if (!origin) { console.error("[seo] SITE_URL 缺失或非法,已跳过 sitemap"); return []; } const url = (pathname: string) => `${origin}${canonicalPath(pathname)}`; const entries: MetadataRoute.Sitemap = [ { url: url("/"), lastModified: new Date(), changeFrequency: "daily", priority: 1 }, { url: url("/announcements"), lastModified: new Date(), changeFrequency: "daily", priority: 0.7, }, { url: url("/leaderboard"), lastModified: new Date(), changeFrequency: "daily", priority: 0.5, }, { url: url("/about"), lastModified: new Date(), changeFrequency: "monthly", priority: 0.6, }, ]; try { const { posts } = await fetchPosts(1, 100); for (const post of posts) { entries.push({ url: url(`/post/${post.id}`), lastModified: new Date(post.created_at), changeFrequency: "weekly", priority: 0.6, }); } } catch { /* 忽略 API 错误 */ } try { const { announcements } = await fetchAnnouncementsPage(1, 100); for (const a of announcements) { entries.push({ url: url(`/announcement/${a.id}`), lastModified: new Date(a.updated_at || a.created_at), changeFrequency: "weekly", priority: 0.5, }); } } catch { /* 忽略 */ } try { const { pages } = await fetchPublishedSitePages(); for (const p of pages) { entries.push({ url: url(`/p/${p.slug}`), lastModified: new Date(p.updated_at || p.created_at), changeFrequency: "monthly", priority: 0.4, }); } } catch { /* 忽略 */ } return entries; }