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
This commit is contained in:
Linus Flood
2026-01-27 12:38:36 +00:00
parent a5e214f783
commit 5fc93472f4
193 changed files with 489 additions and 9018 deletions

View File

@@ -6,105 +6,35 @@ import { createCounter } from "@scandic-hotels/common/telemetry"
import { router } from "../../.."
import { PageContentTypeEnum } from "../../../enums/contentType"
import { notFoundError } from "../../../errors"
import {
GetMyPagesBreadcrumbs,
GetMyPagesBreadcrumbsRefs,
} from "../../../graphql/Query/Breadcrumbs/AccountPage.graphql"
import {
GetCampaignOverviewPageBreadcrumbs,
GetCampaignOverviewPageBreadcrumbsRefs,
} from "../../../graphql/Query/Breadcrumbs/CampaignOverviewPage.graphql"
import {
GetCampaignPageBreadcrumbs,
GetCampaignPageBreadcrumbsRefs,
} from "../../../graphql/Query/Breadcrumbs/CampaignPage.graphql"
import {
GetCollectionPageBreadcrumbs,
GetCollectionPageBreadcrumbsRefs,
} from "../../../graphql/Query/Breadcrumbs/CollectionPage.graphql"
import {
GetContentPageBreadcrumbs,
GetContentPageBreadcrumbsRefs,
} from "../../../graphql/Query/Breadcrumbs/ContentPage.graphql"
import {
GetDestinationCityPageBreadcrumbs,
GetDestinationCityPageBreadcrumbsRefs,
} from "../../../graphql/Query/Breadcrumbs/DestinationCityPage.graphql"
import {
GetDestinationCountryPageBreadcrumbs,
GetDestinationCountryPageBreadcrumbsRefs,
} from "../../../graphql/Query/Breadcrumbs/DestinationCountryPage.graphql"
import {
GetDestinationOverviewPageBreadcrumbs,
GetDestinationOverviewPageBreadcrumbsRefs,
} from "../../../graphql/Query/Breadcrumbs/DestinationOverviewPage.graphql"
import {
GetHotelPageBreadcrumbs,
GetHotelPageBreadcrumbsRefs,
} from "../../../graphql/Query/Breadcrumbs/HotelPage.graphql"
import {
GetLoyaltyPageBreadcrumbs,
GetLoyaltyPageBreadcrumbsRefs,
} from "../../../graphql/Query/Breadcrumbs/LoyaltyPage.graphql"
import {
GetPromoCampaignPageBreadcrumbs,
GetPromoCampaignPageBreadcrumbsRefs,
} from "../../../graphql/Query/Breadcrumbs/PromoCampaignPage.graphql"
import { GetMyPagesBreadcrumbs } from "../../../graphql/Query/Breadcrumbs/AccountPage.graphql"
import { GetCampaignOverviewPageBreadcrumbs } from "../../../graphql/Query/Breadcrumbs/CampaignOverviewPage.graphql"
import { GetCampaignPageBreadcrumbs } from "../../../graphql/Query/Breadcrumbs/CampaignPage.graphql"
import { GetCollectionPageBreadcrumbs } from "../../../graphql/Query/Breadcrumbs/CollectionPage.graphql"
import { GetContentPageBreadcrumbs } from "../../../graphql/Query/Breadcrumbs/ContentPage.graphql"
import { GetDestinationCityPageBreadcrumbs } from "../../../graphql/Query/Breadcrumbs/DestinationCityPage.graphql"
import { GetDestinationCountryPageBreadcrumbs } from "../../../graphql/Query/Breadcrumbs/DestinationCountryPage.graphql"
import { GetDestinationOverviewPageBreadcrumbs } from "../../../graphql/Query/Breadcrumbs/DestinationOverviewPage.graphql"
import { GetHotelPageBreadcrumbs } from "../../../graphql/Query/Breadcrumbs/HotelPage.graphql"
import { GetLoyaltyPageBreadcrumbs } from "../../../graphql/Query/Breadcrumbs/LoyaltyPage.graphql"
import { GetPromoCampaignPageBreadcrumbs } from "../../../graphql/Query/Breadcrumbs/PromoCampaignPage.graphql"
import { request } from "../../../graphql/request"
import { contentstackExtendedProcedureUID } from "../../../procedures"
import { generateRefsResponseTag } from "../../../utils/generateTag"
import { breadcrumbsRefsSchema, breadcrumbsSchema } from "./output"
import { getTags } from "./utils"
import { generateTag } from "../../../utils/generateTag"
import { breadcrumbsSchema } from "./output"
import type { Lang } from "@scandic-hotels/common/constants/language"
import type {
BreadcrumbsRefsSchema,
RawBreadcrumbsSchema,
} from "../../../types/breadcrumbs"
import type { RawBreadcrumbsSchema } from "../../../types/breadcrumbs"
interface BreadcrumbsPageData<T> {
dataKey: keyof T
refQuery: string | DocumentNode
query: string | DocumentNode
}
const getBreadcrumbs = cache(async function fetchMemoizedBreadcrumbs<T>(
{ dataKey, refQuery, query }: BreadcrumbsPageData<T>,
{ dataKey, query }: BreadcrumbsPageData<T>,
{ uid, lang }: { uid: string; lang: Lang }
) {
const getBreadcrumbsRefsCounter = createCounter(
"trpc.contentstack.breadcrumbs.get.refs"
)
const metricsGetBreadcrumbsRefs = getBreadcrumbsRefsCounter.init({
lang,
uid,
})
metricsGetBreadcrumbsRefs.start()
const refsResponse = await request<{ [K in keyof T]: BreadcrumbsRefsSchema }>(
refQuery,
{ locale: lang, uid },
{
key: generateRefsResponseTag(lang, uid, "breadcrumbs"),
ttl: "max",
}
)
const validatedRefsData = breadcrumbsRefsSchema.safeParse(
refsResponse.data[dataKey]
)
if (!validatedRefsData.success) {
metricsGetBreadcrumbsRefs.validationError(validatedRefsData.error)
return []
}
metricsGetBreadcrumbsRefs.success()
const tags = getTags(validatedRefsData.data, lang)
const getBreadcrumbsCounter = createCounter(
"trpc.contentstack.breadcrumbs.get"
)
@@ -117,7 +47,7 @@ const getBreadcrumbs = cache(async function fetchMemoizedBreadcrumbs<T>(
const variables = { locale: lang, uid }
const response = await request<T>(query, variables, {
key: tags,
key: generateTag(lang, uid),
ttl: "max",
})
@@ -158,7 +88,6 @@ export const breadcrumbsQueryRouter = router({
}>(
{
dataKey: "account_page",
refQuery: GetMyPagesBreadcrumbsRefs,
query: GetMyPagesBreadcrumbs,
},
variables
@@ -169,7 +98,6 @@ export const breadcrumbsQueryRouter = router({
}>(
{
dataKey: "campaign_overview_page",
refQuery: GetCampaignOverviewPageBreadcrumbsRefs,
query: GetCampaignOverviewPageBreadcrumbs,
},
variables
@@ -180,7 +108,6 @@ export const breadcrumbsQueryRouter = router({
}>(
{
dataKey: "campaign_page",
refQuery: GetCampaignPageBreadcrumbsRefs,
query: GetCampaignPageBreadcrumbs,
},
variables
@@ -191,7 +118,6 @@ export const breadcrumbsQueryRouter = router({
}>(
{
dataKey: "collection_page",
refQuery: GetCollectionPageBreadcrumbsRefs,
query: GetCollectionPageBreadcrumbs,
},
variables
@@ -202,7 +128,6 @@ export const breadcrumbsQueryRouter = router({
}>(
{
dataKey: "content_page",
refQuery: GetContentPageBreadcrumbsRefs,
query: GetContentPageBreadcrumbs,
},
variables
@@ -213,7 +138,6 @@ export const breadcrumbsQueryRouter = router({
}>(
{
dataKey: "destination_overview_page",
refQuery: GetDestinationOverviewPageBreadcrumbsRefs,
query: GetDestinationOverviewPageBreadcrumbs,
},
variables
@@ -224,7 +148,6 @@ export const breadcrumbsQueryRouter = router({
}>(
{
dataKey: "destination_country_page",
refQuery: GetDestinationCountryPageBreadcrumbsRefs,
query: GetDestinationCountryPageBreadcrumbs,
},
variables
@@ -235,7 +158,6 @@ export const breadcrumbsQueryRouter = router({
}>(
{
dataKey: "destination_city_page",
refQuery: GetDestinationCityPageBreadcrumbsRefs,
query: GetDestinationCityPageBreadcrumbs,
},
variables
@@ -246,7 +168,6 @@ export const breadcrumbsQueryRouter = router({
}>(
{
dataKey: "hotel_page",
refQuery: GetHotelPageBreadcrumbsRefs,
query: GetHotelPageBreadcrumbs,
},
variables
@@ -257,7 +178,6 @@ export const breadcrumbsQueryRouter = router({
}>(
{
dataKey: "loyalty_page",
refQuery: GetLoyaltyPageBreadcrumbsRefs,
query: GetLoyaltyPageBreadcrumbs,
},
variables
@@ -268,7 +188,6 @@ export const breadcrumbsQueryRouter = router({
}>(
{
dataKey: "promo_campaign_page",
refQuery: GetPromoCampaignPageBreadcrumbsRefs,
query: GetPromoCampaignPageBreadcrumbs,
},
variables