import GetLoyaltyPage from "@/lib/graphql/Query/LoyaltyPage.graphql" import { request } from "@/lib/graphql/request" import { badRequestError } from "@/server/errors/trpc" import { publicProcedure, router } from "@/server/trpc" import { getLoyaltyPageInput } from "./input" import { type LoyaltyPage, type LoyaltyPageDataRaw, validateLoyaltyPageSchema, } from "./output" import { LoyaltyBlocksTypenameEnum, SidebarTypenameEnum, } from "@/types/components/loyalty/enums" import { Embeds } from "@/types/requests/embeds" import { Edges } from "@/types/requests/utils/edges" import { RTEDocument } from "@/types/rte/node" export const loyaltyPageQueryRouter = router({ get: publicProcedure.input(getLoyaltyPageInput).query(async ({ input }) => { try { const loyaltyPageRes = await request(GetLoyaltyPage, { locale: input.locale, url: input.href, }) if (!loyaltyPageRes.data) { throw badRequestError() } const validatedLoyaltyPage = validateLoyaltyPageSchema.safeParse( loyaltyPageRes.data ) if (!validatedLoyaltyPage.success) { console.error(validatedLoyaltyPage.error) throw badRequestError() } const sidebar = validatedLoyaltyPage.data.all_loyalty_page.items[0].sidebar.map( (block) => { if ( block.__typename == SidebarTypenameEnum.LoyaltyPageSidebarContent ) { return { ...block, content: { content: { json: block.content.content.json as RTEDocument, embedded_itemsConnection: block.content.content .embedded_itemsConnection as Edges, }, }, } } else { return block } } ) const blocks = validatedLoyaltyPage.data.all_loyalty_page.items[0].blocks.map( (block) => { switch (block.__typename) { case LoyaltyBlocksTypenameEnum.LoyaltyPageBlocksCardGrid: return { ...block, card_grid: { ...block.card_grid, cards: block.card_grid.cards.map((card) => { return { ...card, link: card.referenceConnection.totalCount ? { href: card.referenceConnection.edges[0].node.url, title: card.referenceConnection.edges[0].node.title, } : undefined, } }), }, } case LoyaltyBlocksTypenameEnum.LoyaltyPageBlocksDynamicContent: return { ...block, dynamic_content: { ...block.dynamic_content, link: block.dynamic_content.link.pageConnection.totalCount ? { text: block.dynamic_content.link.text, href: block.dynamic_content.link.pageConnection .edges[0].node.url, title: block.dynamic_content.link.pageConnection.edges[0] .node.title, } : undefined, }, } case LoyaltyBlocksTypenameEnum.LoyaltyPageBlocksContent: return { ...block, content: { content: { json: block.content.content.json as RTEDocument, embedded_itemsConnection: block.content.content .embedded_itemsConnection as Edges, }, }, } case LoyaltyBlocksTypenameEnum.LoyaltyPageBlocksShortcuts: return { ...block, shortcuts: { ...block.shortcuts, shortcuts: block.shortcuts.shortcuts.map((shortcut) => ({ text: shortcut.text, openInNewTab: shortcut.open_in_new_tab, ...shortcut.linkConnection.edges[0].node, url: shortcut.linkConnection.edges[0].node.web ?.original_url || `/${shortcut.linkConnection.edges[0].node.system.locale}${shortcut.linkConnection.edges[0].node.url}`, })), }, } default: return block } } ) const loyaltyPage = { ...validatedLoyaltyPage.data.all_loyalty_page.items[0], blocks, sidebar, } as LoyaltyPage return loyaltyPage } catch (error) { console.info(`Get Loyalty Page Error`) console.error(error) throw badRequestError() } }), })