2026-08-15 14:46:19 +03:00

78 lines
2.5 KiB
TypeScript

import type { MetadataRoute } from 'next';
import {
getBuildingsForMod,
getMods,
getUnitsForMod,
SITE_URL,
} from '@/lib/api-server';
export const dynamic = 'force-dynamic';
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const mods = (await getMods()) ?? [];
const modEntries: MetadataRoute.Sitemap = mods.map((mod) => ({
url: `${SITE_URL}/mod/${mod.id}`,
lastModified: new Date(),
changeFrequency: 'weekly',
priority: 0.8,
}));
const entries: MetadataRoute.Sitemap = [...modEntries];
// Gather races/units/buildings per mod (limit parallelism)
const details = await Promise.all(
mods.slice(0, 20).map(async (mod) => {
const [units, buildings] = await Promise.all([
getUnitsForMod(mod.id),
getBuildingsForMod(mod.id),
]);
return { mod, units, buildings };
})
);
for (const { mod, units, buildings } of details) {
const raceIds = new Set<string>();
for (const unitGroup of units ?? []) raceIds.add(unitGroup.race.id);
for (const buildingGroup of buildings ?? []) raceIds.add(buildingGroup.race.id);
for (const raceId of raceIds) {
entries.push({
url: `${SITE_URL}/mod/${mod.id}/race/${raceId}`,
lastModified: new Date(),
changeFrequency: 'weekly',
priority: 0.7,
});
}
for (const unitGroup of units ?? []) {
for (const unit of [...unitGroup.infantry, ...unitGroup.support, ...unitGroup.tech]) {
entries.push({
url: `${SITE_URL}/mod/${mod.id}/race/${unitGroup.race.id}/unit/${unit.id}`,
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 0.5,
});
}
}
for (const buildingGroup of buildings ?? []) {
for (const building of [...buildingGroup.buildings, ...buildingGroup.buildingsAdvanced]) {
entries.push({
url: `${SITE_URL}/mod/${mod.id}/race/${buildingGroup.race.id}/building/${building.id}`,
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 0.5,
});
}
}
}
return [
{
url: SITE_URL,
lastModified: new Date(),
changeFrequency: 'daily',
priority: 1,
},
...entries,
];
}