import { getAllProjects } from "@/content/projects/projects"; import { getSettings } from "@/content/settings/settings"; import type { APIRoute } from "astro"; import minifyXML from "minify-xml"; export const GET = (async () => { const settings = await getSettings(); if (!settings.blog.enabled) { return new Response(null, { status: 204, statusText: "Not Found" }); } const projects = await getAllProjects(settings); const projectCount = projects.length; const perPage = settings.sitemap.perPage; const pages = Math.ceil(projectCount / perPage); let sitemaps: SitemapIndex[] = []; for (let i = 0; i < pages; i++) { const selectedProjects = projects.slice( ((Number(i + 1) - 1) * settings.sitemap.perPage), Number(i + 1) * settings.sitemap.perPage - 1 ); let dates = [ settings.sitemap.lastModified, settings.project.lastModified, settings.website.lastModified ]; selectedProjects.forEach((project) => { dates.push(project.lastModified); }); const lastModified = dates.sort((a: Date, b: Date) => { return b.getTime() - a.getTime(); }); sitemaps.push({ url: `/sitemap/projects-${i + 1}.xml`, lastModified: lastModified[0] }); } let sitemapContent = ` ${sitemaps.map((item) => ` ${settings.website.domainName}${item.url} ${item.lastModified.toISOString()} `).join('')} `; return new Response(minifyXML(sitemapContent), { status: 200, statusText: "OK", headers: { "Content-Type": "application/xml" } }); }) satisfies APIRoute;