import { getUriWithOrg } from '@services/config/config';
import { getOrgCourses } from '@services/courses/courses';
import { getOrganizationContextInfo } from '@services/organizations/orgs';
import { getOrgCollections } from '@services/courses/collections';
import { NextRequest, NextResponse } from 'next/server';
export async function GET(request: NextRequest) {
const orgSlug = request.headers.get('X-Sitemap-Orgslug');
if (!orgSlug) {
return NextResponse.json({ error: 'Missing X-Sitemap-Orgslug header' }, { status: 400 });
}
const orgInfo = await getOrganizationContextInfo(orgSlug, null);
const courses = await getOrgCourses(orgSlug, null);
const collections = await getOrgCollections(orgInfo.id);
const host = request.headers.get('host');
if (!host) {
return NextResponse.json({ error: 'Missing host header' }, { status: 400 });
}
const baseUrl = getUriWithOrg(orgSlug, '/');
const sitemapUrls: SitemapUrl[] = [
{ loc: baseUrl, priority: 1.0, changefreq: 'daily' },
{ loc: `${baseUrl}collections`, priority: 0.9, changefreq: 'weekly' },
{ loc: `${baseUrl}courses`, priority: 0.9, changefreq: 'weekly' },
// Courses
...courses.map((course: { course_uuid: string }) => ({
loc: `${baseUrl}course/${course.course_uuid.replace('course_', '')}`,
priority: 0.7,
changefreq: 'weekly'
})),
// Collections
...collections.map((collection: { collection_uuid: string }) => ({
loc: `${baseUrl}collections/${collection.collection_uuid.replace('collection_', '')}`,
priority: 0.6,
changefreq: 'weekly'
}))
];
const sitemap = generateSitemap(baseUrl, sitemapUrls);
return new NextResponse(sitemap, {
headers: {
'Content-Type': 'application/xml',
},
});
}
interface SitemapUrl {
loc: string;
priority: number;
changefreq: string;
}
function generateSitemap(baseUrl: string, urls: SitemapUrl[]): string {
const urlEntries = urls.map(({ loc, priority, changefreq }) => `
${loc}
${priority.toFixed(1)}
${changefreq}
`).join('');
return `
${urlEntries}
`;
}