Files
web/server/routers/contentstack/config/query.ts
2024-06-05 10:23:14 +02:00

240 lines
6.6 KiB
TypeScript

import { Lang } from "@/constants/languages"
import { batchRequest } from "@/lib/graphql/batchRequest"
import {
GetDaDeEnUrlsAccountPage,
GetFiNoSvUrlsAccountPage,
} from "@/lib/graphql/Query/AccountPage.graphql"
import { GetContactConfig } from "@/lib/graphql/Query/ContactConfig.graphql"
import {
GetCurrentFooter,
GetCurrentFooterRef,
} from "@/lib/graphql/Query/CurrentFooter.graphql"
import {
GetCurrentHeader,
GetCurrentHeaderRef,
} from "@/lib/graphql/Query/CurrentHeader.graphql"
import {
GetDaDeEnUrlsCurrentBlocksPage,
GetFiNoSvUrlsCurrentBlocksPage,
} from "@/lib/graphql/Query/LanguageSwitcherCurrent.graphql"
import {
GetDaDeEnUrlsLoyaltyPage,
GetFiNoSvUrlsLoyaltyPage,
} from "@/lib/graphql/Query/LoyaltyPage.graphql"
import { request } from "@/lib/graphql/request"
import { internalServerError, notFound } from "@/server/errors/trpc"
import { contentstackProcedure, publicProcedure, router } from "@/server/trpc"
import { generateTag } from "@/utils/generateTag"
import {
type ContactConfigData,
FooterDataRaw,
FooterRefDataRaw,
HeaderData,
HeaderDataRaw,
HeaderRefDataRaw,
validateContactConfigSchema,
validateFooterConfigSchema,
validateHeaderConfigSchema,
validateLanguageSwitcherData,
} from "./output"
import {
LanguageSwitcherData,
LanguageSwitcherQueryDataRaw,
} from "@/types/requests/languageSwitcher"
import { PageTypeEnum } from "@/types/requests/pageType"
export const configQueryRouter = router({
contact: contentstackProcedure.query(async ({ ctx }) => {
const { lang } = ctx
const response = await request<ContactConfigData>(GetContactConfig, {
locale: lang,
})
if (!response.data) {
throw notFound(response)
}
const validatedContactConfigConfig = validateContactConfigSchema.safeParse(
response.data
)
if (!validatedContactConfigConfig.success) {
throw internalServerError(validatedContactConfigConfig.error)
}
return validatedContactConfigConfig.data.all_contact_config.items[0]
}),
header: publicProcedure.query(async ({ ctx }) => {
const responseRef = await request<HeaderRefDataRaw>(GetCurrentHeaderRef, {
locale: ctx.lang,
})
const response = await request<HeaderDataRaw>(
GetCurrentHeader,
{ locale: ctx.lang },
{
next: {
tags: [
generateTag(
ctx.lang,
responseRef.data.all_current_header.items[0].system.uid
),
],
},
}
)
if (!response.data) {
throw notFound(response)
}
const validatedHeaderConfig = validateHeaderConfigSchema.safeParse(
response.data
)
if (!validatedHeaderConfig.success) {
throw internalServerError(validatedHeaderConfig.error)
}
const logo =
validatedHeaderConfig.data.all_current_header.items[0].logoConnection
.edges?.[0]?.node
return {
...validatedHeaderConfig.data.all_current_header.items[0],
logo,
} as HeaderData
}),
footer: contentstackProcedure.query(async ({ ctx }) => {
const responseRef = await request<FooterRefDataRaw>(GetCurrentFooterRef, {
locale: ctx.lang,
})
const response = await request<FooterDataRaw>(
GetCurrentFooter,
{
locale: ctx.lang,
},
{
next: {
tags: [
generateTag(
ctx.lang,
responseRef.data.all_current_footer.items[0].system.uid
),
],
},
}
)
const validatedFooterConfig = validateFooterConfigSchema.safeParse(
response.data
)
if (!validatedFooterConfig.success) {
throw internalServerError(validatedFooterConfig.error)
}
return validatedFooterConfig.data.all_current_footer.items[0]
}),
languageSwitcher: contentstackProcedure.query(async ({ ctx }) => {
const variables = { uid: ctx.uid, locale: ctx.lang }
let urls: LanguageSwitcherData
switch (ctx.contentType) {
case PageTypeEnum.accountPage:
const accountPageRes = await batchRequest<LanguageSwitcherQueryDataRaw>(
[
{
document: GetDaDeEnUrlsAccountPage,
variables,
},
{
document: GetFiNoSvUrlsAccountPage,
variables,
},
]
)
const accountPageUrls = Object.keys(
accountPageRes.data
).reduce<LanguageSwitcherData>((acc, key) => {
const item = accountPageRes.data[key as Lang]?.items?.[0]
const url = item
? { url: `/${key}${item.url}`, isExternal: false }
: undefined
return { ...acc, [key]: url }
}, {} as LanguageSwitcherData)
const validatedAccountLanguageSwitcherData =
validateLanguageSwitcherData.safeParse(accountPageUrls)
if (!validatedAccountLanguageSwitcherData.success) {
throw internalServerError(validatedAccountLanguageSwitcherData.error)
}
urls = validatedAccountLanguageSwitcherData.data
break
case PageTypeEnum.loyaltyPage:
const loyaltyPageRes = await batchRequest<LanguageSwitcherQueryDataRaw>(
[
{
document: GetDaDeEnUrlsLoyaltyPage,
variables,
},
{
document: GetFiNoSvUrlsLoyaltyPage,
variables,
},
]
)
const loyaltyPageUrls = Object.keys(
loyaltyPageRes.data
).reduce<LanguageSwitcherData>((acc, key) => {
const item = loyaltyPageRes.data[key as Lang]?.items?.[0]
const url = item
? {
url: item.web?.original_url || `/${key}${item.url}`,
isExternal: !!item?.web?.original_url,
}
: undefined
return {
...acc,
[key]: url,
}
}, {} as LanguageSwitcherData)
const validatedLoyaltyLanguageSwitcherData =
validateLanguageSwitcherData.safeParse(loyaltyPageUrls)
if (!validatedLoyaltyLanguageSwitcherData.success) {
throw internalServerError(validatedLoyaltyLanguageSwitcherData.error)
}
urls = validatedLoyaltyLanguageSwitcherData.data
break
case PageTypeEnum.currentBlocksPage:
const { data } = await batchRequest<LanguageSwitcherData>([
{
document: GetDaDeEnUrlsCurrentBlocksPage,
variables,
},
{
document: GetFiNoSvUrlsCurrentBlocksPage,
variables,
},
])
urls = data
break
default:
urls = [] as unknown as LanguageSwitcherData
}
return { urls, lang: ctx.lang }
}),
})