Files
web/apps/scandic-web/app/api/web/sitemap/route.ts
T
Anton Gunnarsson 846fd904a6 Merged in feat/sw-2859-set-up-shared-trpc-package (pull request #2319)
feat(SW-2859): Create trpc package

* Add isEdge, safeTry and dataCache to new common package

* Add eslint and move prettier config

* Clean up tests

* Create trpc package and move initialization

* Move errors and a few procedures

* Move telemetry to common package

* Move tokenManager to common package

* Add Sentry to procedures

* Clean up procedures

* Fix self-referencing imports

* Add exports to packages and lint rule to prevent relative imports

* Add env to trpc package

* Add eslint to trpc package

* Apply lint rules

* Use direct imports from trpc package

* Add lint-staged config to trpc

* Move lang enum to common

* Restructure trpc package folder structure

* Fix lang imports


Approved-by: Linus Flood
2025-06-18 12:14:20 +00:00

93 lines
2.7 KiB
TypeScript

import { type NextRequest, NextResponse } from "next/server"
import { createCounter } from "@scandic-hotels/common/telemetry"
import { env } from "@/env/server"
import { dt } from "@/lib/dt"
import {
getEntries,
getSyncToken,
saveEntries,
saveLastUpdatedDate,
saveSitemapData,
saveSyncToken,
} from "@/utils/sitemap"
import { contentstackSync } from "./sync"
import { mapEntriesToSitemapData, mergeEntries } from "./utils"
export const dynamic = "force-dynamic"
export async function GET(request: NextRequest) {
const generateSitemapCounter = createCounter("sitemap", "generate")
const metricsGenerateSitemap = generateSitemapCounter.init()
try {
metricsGenerateSitemap.start()
const headersList = request.headers
const secret = headersList.get("x-sitemap-sync-secret")
if (secret !== env.SITEMAP_SYNC_SECRET) {
throw Error(
`Can't sync and generate sitemap, invalid secret, received secret: ${secret}`
)
}
const syncToken = await getSyncToken()
const currentEntries = await getEntries()
const responseData = await contentstackSync(syncToken)
const mergedEntries = mergeEntries(currentEntries, responseData.entries)
const entriesSaveCounter = createCounter("sitemap", "entries.save")
const metricsEntriesSave = entriesSaveCounter.init({
entriesCount: mergedEntries.length,
})
metricsEntriesSave.start()
await saveEntries(mergedEntries)
metricsEntriesSave.success()
const sitemapData = mapEntriesToSitemapData(mergedEntries)
const lastUpdated = dt().utc().format()
const saveDataCounter = createCounter("sitemap", "data.save")
const metricsDataSave = saveDataCounter.init({
sitemapEntriesCount: sitemapData.length,
lastUpdated,
})
metricsDataSave.start()
await saveSitemapData(sitemapData)
await saveLastUpdatedDate(lastUpdated)
metricsDataSave.success()
if (syncToken !== responseData.syncToken) {
const syncTokenSaveCounter = createCounter("sitemap", "syncToken.save")
const metricsSyncTokenSave = syncTokenSaveCounter.init({
syncToken: responseData.syncToken,
})
metricsSyncTokenSave.start()
await saveSyncToken(responseData.syncToken)
metricsSyncTokenSave.success()
}
metricsGenerateSitemap.success()
return NextResponse.json({
message: "Sitemap data generated and stored successfully!",
now: dt().utc().format(),
})
} catch (error) {
metricsGenerateSitemap.fail(error)
return NextResponse.json(
{
error: "Failed to generate sitemap",
now: dt().utc().format(),
},
{ status: 500, statusText: "Internal Server Error" }
)
}
}