846fd904a6
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
93 lines
2.7 KiB
TypeScript
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" }
|
|
)
|
|
}
|
|
}
|