import type { MetadataRoute } from 'next'; import { apiTry } from '@/lib/api'; import { SITE_URL } from '@/lib/site'; import type { AsnRow, Country, HistorySummary, IncidentList, Region, ServiceRow } from '@/lib/types'; export const dynamic = 'force-dynamic'; export default async function sitemap(): Promise { const [countries, regions, asns, services, incidents, history] = await Promise.all([ apiTry<{ countries: Country[] }>('/api/v1/pressure/countries'), apiTry<{ regions: Region[] }>('/api/v1/pressure/regions'), apiTry<{ asns: AsnRow[] }>('/api/v1/asns'), apiTry<{ services: ServiceRow[] }>('/api/v1/services'), apiTry('/api/v1/incidents?status=all&limit=500'), apiTry('/api/v1/history/summary'), ]); const now = new Date(); const u = (p: string, priority = 0.6, changeFrequency: MetadataRoute.Sitemap[number]['changeFrequency'] = 'hourly'): MetadataRoute.Sitemap[number] => ({ url: `${SITE_URL}${p}`, lastModified: now, changeFrequency, priority }); const out: MetadataRoute.Sitemap = [ u('/', 1, 'always'), ...['/incidents', '/services', '/asns', '/routes', '/bgp', '/probes', '/targets', '/history'].map((p) => u(p, 0.7)), u('/methodology', 0.5, 'monthly'), u('/api', 0.5, 'monthly'), ]; for (const c of countries?.countries ?? []) out.push(u(`/country/${c.cc.toLowerCase()}`, 0.8)); for (const r of regions?.regions ?? []) out.push(u(`/internet/${r.id}`, 0.7)); for (const a of asns?.asns ?? []) out.push(u(`/asn/${a.asn}`, 0.6)); for (const s of services?.services ?? []) out.push(u(`/service/${s.slug}`, 0.7)); for (const i of incidents?.incidents ?? []) out.push(u(`/event/${i.slug}`, 0.6, i.status === 'resolved' ? 'yearly' : 'hourly')); for (const m of history?.available_months ?? []) { const [y, mo] = m.split('-'); if (y) out.push(u(`/history/${y}`, 0.5, 'weekly')); if (y && mo) out.push(u(`/history/${y}/${Number(mo)}`, 0.5, 'weekly')); } return out; }