fix: only zod validate output from trpc

This commit is contained in:
Christel Westerberg
2024-05-22 12:45:10 +02:00
parent 38872567bf
commit c5e36018e1
3 changed files with 64 additions and 184 deletions
@@ -15,27 +15,16 @@ import {
import { removeEmptyObjects } from "../../utils"
import {
CardsRaw,
type LoyaltyPage,
type LoyaltyPageDataRaw,
LoyaltyPage,
type LoyaltyPageRefsDataRaw,
validateLoyaltyPageRefsSchema,
validateLoyaltyPageSchema,
} from "./output"
import { getConnections } from "./utils"
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"
import { LoyaltyBlocksTypenameEnum } from "@/types/components/loyalty/enums"
function makeButtonObject(
button: CardsRaw["primary_button" | "secondary_button"]
) {
if (!button) return undefined
function makeButtonObject(button: any) {
return {
openInNewTab: button.open_in_new_tab,
title:
@@ -93,7 +82,7 @@ export const loyaltyPageQueryRouter = router({
generateTag(lang, validatedLoyaltyPageRefs.data.loyalty_page.system.uid),
].flat()
const response = await request<LoyaltyPageDataRaw>(
const response = await request<any>(
GetLoyaltyPage,
{
locale: lang,
@@ -106,36 +95,8 @@ export const loyaltyPageQueryRouter = router({
throw notFound(response)
}
const validatedLoyaltyPage = validateLoyaltyPageSchema.safeParse(
response.data
)
if (!validatedLoyaltyPage.success) {
throw internalServerError(validatedLoyaltyPage.error)
}
const sidebar = validatedLoyaltyPage.data.loyalty_page.sidebar
? validatedLoyaltyPage.data.loyalty_page.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<Embeds>,
},
},
}
} else {
return block
}
})
: null
const blocks = validatedLoyaltyPage.data.loyalty_page.blocks
? validatedLoyaltyPage.data.loyalty_page.blocks.map((block) => {
const blocks = response.data.loyalty_page.blocks
? response.data.loyalty_page.blocks.map((block: any) => {
switch (block.__typename) {
case LoyaltyBlocksTypenameEnum.LoyaltyPageBlocksDynamicContent:
return {
@@ -153,23 +114,12 @@ export const loyaltyPageQueryRouter = router({
: undefined,
},
}
case LoyaltyBlocksTypenameEnum.LoyaltyPageBlocksContent:
return {
...block,
content: {
content: {
json: block.content.content.json as RTEDocument,
embedded_itemsConnection: block.content.content
.embedded_itemsConnection as Edges<Embeds>,
},
},
}
case LoyaltyBlocksTypenameEnum.LoyaltyPageBlocksShortcuts:
return {
...block,
shortcuts: {
...block.shortcuts,
shortcuts: block.shortcuts.shortcuts.map((shortcut) => ({
shortcuts: block.shortcuts.shortcuts.map((shortcut: any) => ({
text: shortcut.text,
openInNewTab: shortcut.open_in_new_tab,
...shortcut.linkConnection.edges[0].node,
@@ -185,13 +135,15 @@ export const loyaltyPageQueryRouter = router({
cards_grid: {
...block.cards_grid,
cards: block.cards_grid.cardConnection.edges.map(
({ node: card }) => {
({ node: card }: { node: any }) => {
return {
...card,
primaryButton: makeButtonObject(card.primary_button),
secondaryButton: makeButtonObject(
card.secondary_button
),
primaryButton: card.has_primary_button
? makeButtonObject(card.primary_button)
: undefined,
secondaryButton: card.has_secondary_button
? makeButtonObject(card.secondary_button)
: undefined,
}
}
),
@@ -204,11 +156,20 @@ export const loyaltyPageQueryRouter = router({
: null
const loyaltyPage = {
...validatedLoyaltyPage.data.loyalty_page,
heading: response.data.loyalty_page.heading,
system: response.data.loyalty_page.system,
blocks,
sidebar,
} as LoyaltyPage
sidebar: response.data.loyalty_page.sidebar,
}
return loyaltyPage
const validatedLoyaltyPage =
validateLoyaltyPageSchema.safeParse(loyaltyPage)
if (!validatedLoyaltyPage.success) {
throw internalServerError(validatedLoyaltyPage.error)
}
// Assert LoyaltyPage type to get correct typings for RTE fields
return validatedLoyaltyPage.data as LoyaltyPage
}),
})