import { getAllBlogs } from "@/content/blogs/blogs"; 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 blogs = await getAllBlogs(settings); const blogCount = blogs.length; const perPage = settings.sitemap.perPage; const pages = Math.ceil(blogCount / perPage); let sitemaps: SitemapIndex[] = []; for (let i = 0; i < pages; i++) { const selectedBlogs = blogs.slice( ((Number(i + 1) - 1) * settings.sitemap.perPage), Number(i + 1) * settings.sitemap.perPage - 1 ); let dates = [ settings.sitemap.lastModified, settings.blog.lastModified, settings.website.lastModified ]; selectedBlogs.forEach((blog) => { dates.push(blog.lastModified); }); const lastModified = dates.sort((a: Date, b: Date) => { return b.getTime() - a.getTime(); }); sitemaps.push({ url: `/sitemap/blogs-${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;