Merged in feat/SW-1745-language-switcher-non-contentstack-pages (pull request #1501)
feat(SW-1745): Query for language switcher returns just current pathname for non-contentstack pages except for hotelreservation paths * feat(SW-1745): Query for language switcher returns just current pathname for non-contentstack pages except for hotelreservation paths Approved-by: Linus Flood
This commit is contained in:
@@ -1 +1,228 @@
|
||||
import { Lang } from "@/constants/languages"
|
||||
import { batchRequest } from "@/lib/graphql/batchRequest"
|
||||
import {
|
||||
GetDaDeEnUrlsAccountPage,
|
||||
GetFiNoSvUrlsAccountPage,
|
||||
} from "@/lib/graphql/Query/AccountPage/AccountPage.graphql"
|
||||
import {
|
||||
GetDaDeEnUrlsCollectionPage,
|
||||
GetFiNoSvUrlsCollectionPage,
|
||||
} from "@/lib/graphql/Query/CollectionPage/CollectionPage.graphql"
|
||||
import {
|
||||
GetDaDeEnUrlsContentPage,
|
||||
GetFiNoSvUrlsContentPage,
|
||||
} from "@/lib/graphql/Query/ContentPage/ContentPage.graphql"
|
||||
import {
|
||||
GetDaDeEnUrlsCurrentBlocksPage,
|
||||
GetFiNoSvUrlsCurrentBlocksPage,
|
||||
} from "@/lib/graphql/Query/Current/LanguageSwitcher.graphql"
|
||||
import {
|
||||
GetDaDeEnUrlsDestinationCityPage,
|
||||
GetFiNoSvUrlsDestinationCityPage,
|
||||
} from "@/lib/graphql/Query/DestinationCityPage/DestinationCityPage.graphql"
|
||||
import {
|
||||
GetDaDeEnUrlsDestinationCountryPage,
|
||||
GetFiNoSvUrlsDestinationCountryPage,
|
||||
} from "@/lib/graphql/Query/DestinationCountryPage/DestinationCountryPage.graphql"
|
||||
import {
|
||||
GetDaDeEnUrlsDestinationOverviewPage,
|
||||
GetFiNoSvUrlsDestinationOverviewPage,
|
||||
} from "@/lib/graphql/Query/DestinationOverviewPage/DestinationOverviewPage.graphql"
|
||||
import {
|
||||
GetDaDeEnUrlsHotelPage,
|
||||
GetFiNoSvUrlsHotelPage,
|
||||
} from "@/lib/graphql/Query/HotelPage/HotelPage.graphql"
|
||||
import {
|
||||
GetDaDeEnUrlsLoyaltyPage,
|
||||
GetFiNoSvUrlsLoyaltyPage,
|
||||
} from "@/lib/graphql/Query/LoyaltyPage/LoyaltyPage.graphql"
|
||||
import {
|
||||
GetDaDeEnUrlsStartPage,
|
||||
GetFiNoSvUrlsStartPage,
|
||||
} from "@/lib/graphql/Query/StartPage/StartPage.graphql"
|
||||
import { internalServerError } from "@/server/errors/trpc"
|
||||
|
||||
import { generateTag } from "@/utils/generateTag"
|
||||
|
||||
import { validateLanguageSwitcherData } from "./output"
|
||||
import {
|
||||
getLanguageSwitcherCounter,
|
||||
getLanguageSwitcherFailCounter,
|
||||
getLanguageSwitcherSuccessCounter,
|
||||
} from "./telemetry"
|
||||
|
||||
import { PageContentTypeEnum } from "@/types/requests/contentType"
|
||||
import type {
|
||||
LanguageSwitcherData,
|
||||
LanguageSwitcherQueryDataRaw,
|
||||
} from "@/types/requests/languageSwitcher"
|
||||
|
||||
export const languageSwitcherAffix = "languageSwitcher"
|
||||
|
||||
export async function getUrlsOfAllLanguages(
|
||||
lang: Lang,
|
||||
uid: string,
|
||||
contentType: string
|
||||
) {
|
||||
getLanguageSwitcherCounter.add(1, {
|
||||
uid,
|
||||
lang,
|
||||
contentType,
|
||||
})
|
||||
console.info(
|
||||
"contentstack.languageSwitcher start",
|
||||
JSON.stringify({
|
||||
query: {
|
||||
uid,
|
||||
lang,
|
||||
contentType,
|
||||
},
|
||||
})
|
||||
)
|
||||
|
||||
const variables = { uid }
|
||||
const tagsDaDeEn = [
|
||||
generateTag(Lang.da, uid, languageSwitcherAffix),
|
||||
generateTag(Lang.de, uid, languageSwitcherAffix),
|
||||
generateTag(Lang.en, uid, languageSwitcherAffix),
|
||||
]
|
||||
const tagsFiNoSv = [
|
||||
generateTag(Lang.fi, uid, languageSwitcherAffix),
|
||||
generateTag(Lang.no, uid, languageSwitcherAffix),
|
||||
generateTag(Lang.sv, uid, languageSwitcherAffix),
|
||||
]
|
||||
let daDeEnDocument = null
|
||||
let fiNoSvDocument = null
|
||||
switch (contentType) {
|
||||
case PageContentTypeEnum.accountPage:
|
||||
daDeEnDocument = GetDaDeEnUrlsAccountPage
|
||||
fiNoSvDocument = GetFiNoSvUrlsAccountPage
|
||||
break
|
||||
case PageContentTypeEnum.currentBlocksPage:
|
||||
daDeEnDocument = GetDaDeEnUrlsCurrentBlocksPage
|
||||
fiNoSvDocument = GetFiNoSvUrlsCurrentBlocksPage
|
||||
break
|
||||
case PageContentTypeEnum.loyaltyPage:
|
||||
daDeEnDocument = GetDaDeEnUrlsLoyaltyPage
|
||||
fiNoSvDocument = GetFiNoSvUrlsLoyaltyPage
|
||||
break
|
||||
case PageContentTypeEnum.hotelPage:
|
||||
daDeEnDocument = GetDaDeEnUrlsHotelPage
|
||||
fiNoSvDocument = GetFiNoSvUrlsHotelPage
|
||||
break
|
||||
case PageContentTypeEnum.contentPage:
|
||||
daDeEnDocument = GetDaDeEnUrlsContentPage
|
||||
fiNoSvDocument = GetFiNoSvUrlsContentPage
|
||||
break
|
||||
case PageContentTypeEnum.collectionPage:
|
||||
daDeEnDocument = GetDaDeEnUrlsCollectionPage
|
||||
fiNoSvDocument = GetFiNoSvUrlsCollectionPage
|
||||
break
|
||||
case PageContentTypeEnum.destinationOverviewPage:
|
||||
daDeEnDocument = GetDaDeEnUrlsDestinationOverviewPage
|
||||
fiNoSvDocument = GetFiNoSvUrlsDestinationOverviewPage
|
||||
break
|
||||
case PageContentTypeEnum.destinationCountryPage:
|
||||
daDeEnDocument = GetDaDeEnUrlsDestinationCountryPage
|
||||
fiNoSvDocument = GetFiNoSvUrlsDestinationCountryPage
|
||||
break
|
||||
case PageContentTypeEnum.destinationCityPage:
|
||||
daDeEnDocument = GetDaDeEnUrlsDestinationCityPage
|
||||
fiNoSvDocument = GetFiNoSvUrlsDestinationCityPage
|
||||
break
|
||||
case PageContentTypeEnum.startPage:
|
||||
daDeEnDocument = GetDaDeEnUrlsStartPage
|
||||
fiNoSvDocument = GetFiNoSvUrlsStartPage
|
||||
break
|
||||
default:
|
||||
console.error(`type: [${contentType}]`)
|
||||
console.error(`Trying to get a content type that is not supported`)
|
||||
throw internalServerError()
|
||||
}
|
||||
|
||||
if (!daDeEnDocument || !fiNoSvDocument) {
|
||||
throw internalServerError()
|
||||
}
|
||||
|
||||
const response = await batchRequest<LanguageSwitcherQueryDataRaw>([
|
||||
{
|
||||
document: daDeEnDocument,
|
||||
variables,
|
||||
options: {
|
||||
cache: "force-cache",
|
||||
next: {
|
||||
tags: tagsDaDeEn,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
document: fiNoSvDocument,
|
||||
variables,
|
||||
options: {
|
||||
cache: "force-cache",
|
||||
next: {
|
||||
tags: tagsFiNoSv,
|
||||
},
|
||||
},
|
||||
},
|
||||
])
|
||||
|
||||
const urls = Object.keys(response.data).reduce<LanguageSwitcherData>(
|
||||
(acc, key) => {
|
||||
const item = response.data[key as Lang]
|
||||
|
||||
const url = item
|
||||
? item.web?.original_url || `/${key}${item.url}`
|
||||
: undefined
|
||||
|
||||
return {
|
||||
...acc,
|
||||
[key]: { url, isExternal: !!item?.web?.original_url },
|
||||
}
|
||||
},
|
||||
{}
|
||||
)
|
||||
|
||||
const validatedLanguageSwitcherData =
|
||||
validateLanguageSwitcherData.safeParse(urls)
|
||||
|
||||
if (!validatedLanguageSwitcherData.success) {
|
||||
getLanguageSwitcherFailCounter.add(1, {
|
||||
uid,
|
||||
lang,
|
||||
contentType,
|
||||
error_type: "validation_error",
|
||||
error: JSON.stringify(validatedLanguageSwitcherData.error),
|
||||
})
|
||||
console.error(
|
||||
"contentstack.languageSwitcher validation error",
|
||||
JSON.stringify({
|
||||
query: {
|
||||
uid,
|
||||
lang,
|
||||
contentType,
|
||||
},
|
||||
error: validatedLanguageSwitcherData.error,
|
||||
})
|
||||
)
|
||||
return null
|
||||
}
|
||||
|
||||
getLanguageSwitcherSuccessCounter.add(1, {
|
||||
uid,
|
||||
lang,
|
||||
contentType,
|
||||
})
|
||||
console.info(
|
||||
"contentstack.languageSwitcher success",
|
||||
JSON.stringify({
|
||||
query: {
|
||||
uid,
|
||||
lang,
|
||||
contentType,
|
||||
},
|
||||
})
|
||||
)
|
||||
|
||||
return urls
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user