templates2.Content.Next/app/sitemap.ts
w4c-templates 3caefb8833
Some checks are pending
CI / quality (push) Waiting to run
chore(template): publish Content.Next
2026-10-11 23:29:57 +03:00

40 lines
2.2 KiB
TypeScript

import type { MetadataRoute } from 'next';
import { db } from '@/lib/server/db';
export const dynamic = 'force-dynamic';
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const base = (process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000').replace(/\/$/, '');
const now = new Date();
const staticPages: MetadataRoute.Sitemap = [
{ url: `${base}/`, lastModified: now, changeFrequency: 'weekly', priority: 1 },
{ url: `${base}/blog`, lastModified: now, changeFrequency: 'weekly', priority: 0.9 },
{ url: `${base}/docs`, lastModified: now, changeFrequency: 'weekly', priority: 0.8 },
{ url: `${base}/tags`, lastModified: now, changeFrequency: 'weekly', priority: 0.5 },
{ url: `${base}/search`, lastModified: now, changeFrequency: 'monthly', priority: 0.4 },
{ url: `${base}/pricing`, lastModified: now, changeFrequency: 'monthly', priority: 0.6 },
{ url: `${base}/legal/privacy`, lastModified: now, changeFrequency: 'yearly', priority: 0.3 },
{ url: `${base}/legal/terms`, lastModified: now, changeFrequency: 'yearly', priority: 0.3 },
];
let dynamicPages: MetadataRoute.Sitemap = [];
try {
const [posts, docs, tags, authors] = await Promise.all([
db.post.findMany({ where: { status: 'published' }, select: { slug: true, updatedAt: true } }),
db.doc.findMany({ where: { status: 'published' }, select: { slug: true, updatedAt: true } }),
db.tag.findMany({ select: { slug: true } }),
db.author.findMany({ select: { slug: true } }),
]);
dynamicPages = [
...posts.map((p) => ({ url: `${base}/blog/${p.slug}`, lastModified: p.updatedAt, changeFrequency: 'monthly' as const, priority: 0.7 })),
...docs.map((d) => ({ url: `${base}/docs/${d.slug}`, lastModified: d.updatedAt, changeFrequency: 'monthly' as const, priority: 0.6 })),
...tags.map((t) => ({ url: `${base}/tags/${t.slug}`, lastModified: now, changeFrequency: 'weekly' as const, priority: 0.4 })),
...authors.map((a) => ({ url: `${base}/authors/${a.slug}`, lastModified: now, changeFrequency: 'weekly' as const, priority: 0.4 })),
];
} catch {
dynamicPages = [];
}
return [...staticPages, ...dynamicPages];
}