Files
Linus Flood 5fc93472f4 Merged in feat/rework-contentstack (pull request #3493)
Feat(SW-3708): refactor contentstack fetching (removing all refs) and cache invalidation

* Remove all REFS

* Revalidate correct language

* PR fixes

* PR fixes

* Throw when errors from contentstack api


Approved-by: Joakim Jäderberg
2026-01-27 12:38:36 +00:00

113 lines
3.2 KiB
TypeScript

import { createCounter } from "@scandic-hotels/common/telemetry"
import { router } from "../../.."
import { batchRequest } from "../../../graphql/batchRequest"
import {
GetContentPage,
GetContentPageBlocksBatch1,
GetContentPageBlocksBatch2,
} from "../../../graphql/Query/ContentPage/ContentPage.graphql"
import { contentstackExtendedProcedureUID } from "../../../procedures"
import { generateTag } from "../../../utils/generateTag"
import { contentPageSchema } from "./output"
import type { GetContentPageSchema } from "../../../types/contentPage"
import type { TrackingPageData } from "../../types"
export const contentPageQueryRouter = router({
get: contentstackExtendedProcedureUID.query(async ({ ctx }) => {
const { lang, uid } = ctx
// by fetching references when a child entry is published
const cacheKey = generateTag(lang, uid)
const getContentPageCounter = createCounter(
"trpc.contentstack.contentPage.get"
)
const metricsGetContentPage = getContentPageCounter.init({
lang,
uid,
})
metricsGetContentPage.start()
const contentPageRequest = await batchRequest<GetContentPageSchema>([
{
document: GetContentPage,
variables: { locale: lang, uid },
cacheOptions: {
key: `${cacheKey}:contentPage`,
ttl: "max",
},
},
{
document: GetContentPageBlocksBatch1,
variables: { locale: lang, uid },
cacheOptions: {
key: `${cacheKey}:contentPageBlocksBatch1`,
ttl: "max",
},
},
{
document: GetContentPageBlocksBatch2,
variables: { locale: lang, uid },
cacheOptions: {
key: `${cacheKey}:contentPageBlocksBatch2`,
ttl: "max",
},
},
])
const contentPage = contentPageSchema.safeParse(contentPageRequest.data)
if (!contentPage.success) {
metricsGetContentPage.validationError(contentPage.error)
return null
}
metricsGetContentPage.success()
const tracking: TrackingPageData = {
pageId: contentPage.data.content_page.system.uid,
domainLanguage: lang,
publishDate: contentPage.data.content_page.system.updated_at,
createDate: contentPage.data.content_page.system.created_at,
channel: createChannel(contentPage.data.content_page.system.uid),
pageType: createPageType(contentPage.data.content_page.system.uid),
pageName: contentPage.data.trackingProps.url,
siteSections: contentPage.data.trackingProps.url,
siteVersion: "new-web",
}
return {
contentPage: contentPage.data.content_page,
tracking,
}
}),
})
const signupContentPageUid = "blt0e6bd6c4d7224f07"
const signupVerifyContentPageUid = "blt3247a2a29b34a8e8"
export function createChannel(uid: string): TrackingPageData["channel"] {
switch (uid) {
case signupContentPageUid:
case signupVerifyContentPageUid:
return "scandic-friends"
default:
return "static-content-page"
}
}
export function createPageType(uid: string): string {
switch (uid) {
case signupContentPageUid:
return "memberprofilecreatepage"
case signupVerifyContentPageUid:
return "memberprofilecreatesuccesspage"
default:
return "staticcontentpage"
}
}