diff --git a/apps/scandic-web/app/api/web/sitemap/utils.ts b/apps/scandic-web/app/api/web/sitemap/utils.ts index af7711f8a..7c87b1093 100644 --- a/apps/scandic-web/app/api/web/sitemap/utils.ts +++ b/apps/scandic-web/app/api/web/sitemap/utils.ts @@ -1,10 +1,10 @@ -import { Lang } from "@/constants/languages" import { env } from "@/env/server" import { createCounter } from "@/server/telemetry" import { removeTrailingSlash } from "@/utils/url" -import type { SitemapEntry, SyncItem } from "@/types/sitemap" +import type { SyncItem } from "@/types/sitemap" +import type { Lang } from "@/constants/languages" export function mergeEntries( currentEntries: SyncItem[], @@ -62,8 +62,8 @@ export function mapEntriesToSitemapData(entries: SyncItem[]) { const entriesByUid = groupEntriesByUid(filteredEntries) const sitemapEntries = Object.entries(entriesByUid) - .map(([_, entries]) => mapEntriesToSitemapEntry(entries)) - .filter((entry): entry is SitemapEntry => !!entry) + .map(([_, entries]) => mapEntriesToSitemapEntries(entries)) + .flat() metricsEntriesTransform.success({ entriesCount: entries.length, @@ -94,72 +94,25 @@ function groupEntriesByUid(entries: SyncItem[]) { }, {}) } -function mapEntriesToSitemapEntry(entries: SyncItem[]) { - // Main entry is always English. Without English, there can't be other pages in ContentStack. - const mainEntry = entries.find((entry) => entry.data.locale === Lang.en) - const alternates = getAlternates(entries) - const lastModified = getLastModified(entries) - const changeFrequency = getChangeFrequency(entries) - const priority = getPriority(entries) - - if (mainEntry) { - const { locale, url } = mainEntry.data - const sitemapEntry: SitemapEntry = { - url: removeTrailingSlash(`${env.PUBLIC_URL}/${locale}${url}`), - lastModified, - changeFrequency, - priority, - alternates, - } - return sitemapEntry - } +function mapEntriesToSitemapEntries(entries: SyncItem[]) { + const alternates = mapToAlternates(entries) + return entries.map((currentEntry) => ({ + url: removeTrailingSlash( + `${env.PUBLIC_URL}/${currentEntry.data.locale}${currentEntry.data.url}` + ), + lastModified: currentEntry.data.updated_at, + changeFrequency: + currentEntry.data.web?.seo_metadata?.sitemap?.change_frequency ?? "daily", + priority: currentEntry.data.web?.seo_metadata?.sitemap?.priority ?? 0.5, + alternates, + })) } -function getLastModified(entries: SyncItem[]) { - // Localized versions of the data can have a different last modified value. - // We make sure we take the latest. - return entries.reduce((latest, entry) => { - const entryDate = entry.data.updated_at - return entryDate > latest ? entryDate : latest - }, "") -} - -function getChangeFrequency(entries: SyncItem[]) { - // Localized versions of the data can have a different changeFrequency value. - // We make sure we take the highest. - const changeFrequencyPriority: SitemapEntry["changeFrequency"][] = [ - "never", - "yearly", - "monthly", - "weekly", - "daily", - "hourly", - "always", - ] - return entries.reduce((highest, entry) => { - const changeFrequency = - entry.data.web?.seo_metadata?.sitemap?.change_frequency ?? "daily" - return changeFrequencyPriority.indexOf(changeFrequency) > - changeFrequencyPriority.indexOf(highest) - ? changeFrequency - : highest - }, "never") -} - -function getPriority(entries: SyncItem[]) { - // Localized versions of the data can have a different priority. - // We make sure we take the highest. - return entries.reduce((highest, entry) => { - const priority = entry.data.web?.seo_metadata?.sitemap?.priority ?? 0.5 - return priority > highest ? priority : highest - }, 0.0) -} - -function getAlternates(entries: SyncItem[]) { - return entries - .filter((entry) => entry.data.locale !== Lang.en) - .reduce>>((acc, { data }) => { - acc[data.locale] = `${env.PUBLIC_URL}/${data.locale}${data.url}` - return acc - }, {}) +function mapToAlternates(entries: SyncItem[]) { + return entries.reduce>>((acc, entry) => { + acc[entry.data.locale] = removeTrailingSlash( + `${env.PUBLIC_URL}/${entry.data.locale}${entry.data.url}` + ) + return acc + }, {}) }