import { metrics } from "@opentelemetry/api" import { Lang } from "@/constants/languages" import { baseUrls } from "@/constants/routes/baseUrls" import { batchRequest } from "@/lib/graphql/batchRequest" import { GetDaDeEnUrlsAccountPage, GetFiNoSvUrlsAccountPage, } from "@/lib/graphql/Query/AccountPage.graphql" import { GetDaDeEnUrlsContentPage, GetFiNoSvUrlsContentPage, } from "@/lib/graphql/Query/ContentPage.graphql" import { GetDaDeEnUrlsHotelPage, GetFiNoSvUrlsHotelPage, } from "@/lib/graphql/Query/HotelPage.graphql" import { GetDaDeEnUrlsCurrentBlocksPage, GetFiNoSvUrlsCurrentBlocksPage, } from "@/lib/graphql/Query/LanguageSwitcherCurrent.graphql" import { GetDaDeEnUrlsLoyaltyPage, GetFiNoSvUrlsLoyaltyPage, } from "@/lib/graphql/Query/LoyaltyPage.graphql" import { internalServerError } from "@/server/errors/trpc" import { publicProcedure, router } from "@/server/trpc" import { generateTag } from "@/utils/generateTag" import { validateLanguageSwitcherData } from "./output" import { languageSwitcherAffix } from "./utils" import type { LanguageSwitcherData, LanguageSwitcherQueryDataRaw, } from "@/types/requests/languageSwitcher" import { PageTypeEnum } from "@/types/requests/pageType" interface LanguageSwitcherVariables { contentType: string uid: string } const meter = metrics.getMeter("trpc.contentstack.languageSwitcher") const getLanguageSwitcherCounter = meter.createCounter( "trpc.contentstack.languageSwitcher.get" ) const getLanguageSwitcherSuccessCounter = meter.createCounter( "trpc.contentstack.languageSwitcher.get-success" ) const getLanguageSwitcherFailCounter = meter.createCounter( "trpc.contentstack.languageSwitcher.get-fail" ) async function getLanguageSwitcher(options: LanguageSwitcherVariables) { const variables = { uid: options.uid } const tagsDaDeEn = [ generateTag(Lang.da, options.uid, languageSwitcherAffix), generateTag(Lang.de, options.uid, languageSwitcherAffix), generateTag(Lang.en, options.uid, languageSwitcherAffix), ] const tagsFiNoSv = [ generateTag(Lang.fi, options.uid, languageSwitcherAffix), generateTag(Lang.no, options.uid, languageSwitcherAffix), generateTag(Lang.sv, options.uid, languageSwitcherAffix), ] switch (options.contentType) { case PageTypeEnum.accountPage: return await batchRequest([ { document: GetDaDeEnUrlsAccountPage, variables, tags: tagsDaDeEn, }, { document: GetFiNoSvUrlsAccountPage, variables, tags: tagsFiNoSv, }, ]) case PageTypeEnum.currentBlocksPage: return await batchRequest([ { document: GetDaDeEnUrlsCurrentBlocksPage, variables, tags: tagsDaDeEn, }, { document: GetFiNoSvUrlsCurrentBlocksPage, variables, tags: tagsFiNoSv, }, ]) case PageTypeEnum.loyaltyPage: return await batchRequest([ { document: GetDaDeEnUrlsLoyaltyPage, variables, tags: tagsDaDeEn, }, { document: GetFiNoSvUrlsLoyaltyPage, variables, tags: tagsFiNoSv, }, ]) case PageTypeEnum.hotelPage: return await batchRequest([ { document: GetDaDeEnUrlsHotelPage, variables, tags: tagsDaDeEn, }, { document: GetFiNoSvUrlsHotelPage, variables, tags: tagsFiNoSv, }, ]) case PageTypeEnum.contentPage: return await batchRequest([ { document: GetDaDeEnUrlsContentPage, variables, tags: tagsDaDeEn, }, { document: GetFiNoSvUrlsContentPage, variables, tags: tagsFiNoSv, }, ]) default: console.error(`type: [${options.contentType}]`) console.error(`Trying to get a content type that is not supported`) throw internalServerError() } } export const languageSwitcherQueryRouter = router({ get: publicProcedure.query(async ({ ctx }) => { if (!ctx.uid || !ctx.lang) { return { lang: ctx.lang, urls: baseUrls } } getLanguageSwitcherCounter.add(1, { uid: ctx.uid, lang: ctx.lang, contentType: ctx.contentType, }) console.info( "contentstack.languageSwitcher start", JSON.stringify({ query: { uid: ctx.uid, lang: ctx.lang, contentType: ctx.contentType, }, }) ) const res = await getLanguageSwitcher({ contentType: ctx.contentType!, uid: ctx.uid, }) const urls = Object.keys(res.data).reduce( (acc, key) => { const item = res.data[key as Lang]?.items[0] const url = item ? item.web?.original_url || `/${key}${item.url}` : undefined return { ...acc, [key]: { url, isExternal: !!item?.web?.original_url }, } }, {} as LanguageSwitcherData ) const validatedLanguageSwitcherData = validateLanguageSwitcherData.safeParse(urls) if (!validatedLanguageSwitcherData.success) { getLanguageSwitcherFailCounter.add(1, { uid: ctx.uid, lang: ctx.lang, contentType: ctx.contentType, error_type: "validation_error", error: JSON.stringify(validatedLanguageSwitcherData.error), }) console.error( "contentstack.languageSwitcher validation error", JSON.stringify({ query: { uid: ctx.uid, lang: ctx.lang, contentType: ctx.contentType, }, error: validatedLanguageSwitcherData.error, }) ) return null } getLanguageSwitcherSuccessCounter.add(1, { uid: ctx.uid, lang: ctx.lang, contentType: ctx.contentType, }) console.info( "contentstack.languageSwitcher success", JSON.stringify({ query: { uid: ctx.uid, lang: ctx.lang, contentType: ctx.contentType, }, }) ) return { lang: ctx.lang, urls, } }), })