diff --git a/cms/sveltekit/src/routes/sitemap.xml/+server.ts b/cms/sveltekit/src/routes/sitemap.xml/+server.ts new file mode 100644 index 0000000..0128bd4 --- /dev/null +++ b/cms/sveltekit/src/routes/sitemap.xml/+server.ts @@ -0,0 +1,57 @@ +import type { RequestHandler } from './$types'; +import { useDirectus } from '$lib/directus/directus'; +import { getRequestEvent } from '$app/server'; + +export const GET: RequestHandler = async ({ url, setHeaders }) => { + const { getDirectus, readItems } = useDirectus(); + const directus = getDirectus(); + + try { + const [pages, posts] = await Promise.all([ + directus.request( + readItems('pages', { + fields: ['permalink'], + }) + ), + directus.request( + readItems('posts', { + filter: { status: { _eq: 'published' } }, + fields: ['slug'], + }) + ) + ]); + + // Get the site URL from the request event + const siteUrl = url.origin; + + const urls = [ + ...pages.map((page: any) => `${siteUrl}${page.permalink}`), + ...posts.map((post: any) => `${siteUrl}/blog/${post.slug}`), + ]; + + setHeaders({ + 'content-type': 'application/xml; charset=utf-8', + 'cache-control': 'public, max-age=0, s-maxage=600, stale-while-revalidate=86400' + }); + return new Response( + ` + + + + ${urls.map((url) => ` ${url}`).join('\n')} + `.trim() + ); + + } catch { + + setHeaders({ + 'content-type': 'application/xml; charset=utf-8', + }); + + return new Response( + '' + ); + } +}; + +