feat: improve structure and error handling

This commit is contained in:
Michael Zetterberg
2024-05-14 15:55:46 +02:00
parent 01587d7fd5
commit f5108d1a8e
104 changed files with 1505 additions and 1570 deletions
@@ -1,8 +0,0 @@
import { z } from "zod"
import { Lang } from "@/constants/languages"
export const getBreadcrumbsInput = z.object({
href: z.string().min(1, { message: "href is required" }),
locale: z.nativeEnum(Lang),
})
@@ -3,8 +3,12 @@ import {
GetMyPagesBreadcrumbsRefs,
} from "@/lib/graphql/Query/BreadcrumbsMyPages.graphql"
import { request } from "@/lib/graphql/request"
import { badRequestError, internalServerError } from "@/server/errors/trpc"
import { publicProcedure, router } from "@/server/trpc"
import {
badRequestError,
internalServerError,
notFound,
} from "@/server/errors/trpc"
import { contentstackProcedure, router } from "@/server/trpc"
import {
generateRefsResponseTag,
@@ -13,7 +17,6 @@ import {
} from "@/utils/generateTag"
import { removeMultipleSlashes } from "@/utils/url"
import { getBreadcrumbsInput } from "./input"
import {
getBreadcrumbsSchema,
validateBreadcrumbsConstenstackSchema,
@@ -27,98 +30,81 @@ import type {
} from "@/types/requests/myPages/breadcrumbs"
export const breadcrumbsQueryRouter = router({
get: publicProcedure.input(getBreadcrumbsInput).query(async ({ input }) => {
try {
const refsResponse = await request<GetMyPagesBreadcrumbsRefsData>(
GetMyPagesBreadcrumbsRefs,
{ locale: input.locale, url: input.href },
{
next: {
tags: [generateRefsResponseTag(input.locale, input.href, affix)],
},
get: contentstackProcedure.query(async ({ ctx }) => {
const refsResponse = await request<GetMyPagesBreadcrumbsRefsData>(
GetMyPagesBreadcrumbsRefs,
{ locale: ctx.lang, url: ctx.pathname },
{
next: {
tags: [generateRefsResponseTag(ctx.lang, ctx.pathname, affix)],
},
}
)
if (!refsResponse.data) {
throw notFound(refsResponse)
}
const validatedRefsData =
validateBreadcrumbsRefsConstenstackSchema.safeParse(refsResponse.data)
if (!validatedRefsData.success) {
throw internalServerError(validatedRefsData.error)
}
const connections = getConnections(validatedRefsData.data)
const tags = generateTags(ctx.lang, connections)
const page = validatedRefsData.data.all_account_page.items[0]
tags.push(generateTag(ctx.lang, page.system.uid, affix))
const response = await request<GetMyPagesBreadcrumbsData>(
GetMyPagesBreadcrumbs,
{ locale: ctx.lang, url: ctx.pathname },
{ next: { tags } }
)
if (!response.data) {
throw notFound(response)
}
const validatedBreadcrumbsData =
validateBreadcrumbsConstenstackSchema.safeParse(response.data)
if (!validatedBreadcrumbsData.success) {
throw internalServerError(validatedBreadcrumbsData.error)
}
const parentBreadcrumbs =
validatedBreadcrumbsData.data.all_account_page.items[0].breadcrumbs.parentsConnection.edges.map(
(breadcrumb) => {
return {
href: removeMultipleSlashes(
`/${breadcrumb.node.system.locale}/${breadcrumb.node.url}`
),
title: breadcrumb.node.breadcrumbs.title,
uid: breadcrumb.node.system.uid,
}
}
)
if (!refsResponse.data) {
console.error("Bad response for `GetMyPagesBreadcrumbsRefs`")
console.error({ refsResponse })
throw internalServerError()
}
const pageBreadcrumb =
validatedBreadcrumbsData.data.all_account_page.items.map((breadcrumb) => {
return {
title: breadcrumb.breadcrumbs.title,
uid: breadcrumb.system.uid,
}
})
const validatedRefsData =
validateBreadcrumbsRefsConstenstackSchema.safeParse(refsResponse.data)
if (!validatedRefsData.success) {
console.info("Bad validation for `GetMyPagesBreadcrumbsRefs`")
console.error(validatedRefsData.error)
throw badRequestError()
}
const breadcrumbs = [
homeBreadcrumbs[ctx.lang],
parentBreadcrumbs,
pageBreadcrumb,
].flat()
const connections = getConnections(validatedRefsData.data)
const tags = generateTags(input.locale, connections)
const page = validatedRefsData.data.all_account_page.items[0]
tags.push(generateTag(input.locale, page.system.uid, affix))
const response = await request<GetMyPagesBreadcrumbsData>(
GetMyPagesBreadcrumbs,
{ locale: input.locale, url: input.href },
{ next: { tags } }
)
if (!response.data) {
console.error("Bad response for `GetMyPagesBreadcrumbs`")
console.error({ input })
console.error({ response })
throw internalServerError()
}
const validatedBreadcrumbsData =
validateBreadcrumbsConstenstackSchema.safeParse(response.data)
if (!validatedBreadcrumbsData.success) {
console.error("Bad validation for `GetMyPagesBreadcrumbs`")
console.error(validatedBreadcrumbsData.error)
throw badRequestError()
}
const parentBreadcrumbs =
validatedBreadcrumbsData.data.all_account_page.items[0].breadcrumbs.parentsConnection.edges.map(
(breadcrumb) => {
return {
href: removeMultipleSlashes(
`/${breadcrumb.node.system.locale}/${breadcrumb.node.url}`
),
title: breadcrumb.node.breadcrumbs.title,
uid: breadcrumb.node.system.uid,
}
}
)
const pageBreadcrumb =
validatedBreadcrumbsData.data.all_account_page.items.map(
(breadcrumb) => {
return {
title: breadcrumb.breadcrumbs.title,
uid: breadcrumb.system.uid,
}
}
)
const breadcrumbs = [
homeBreadcrumbs[input.locale],
parentBreadcrumbs,
pageBreadcrumb,
].flat()
const validatedBreadcrumbs = getBreadcrumbsSchema.safeParse(breadcrumbs)
if (!validatedBreadcrumbs.success) {
console.info("Bad validation for `validatedBreadcrumbs`")
console.error(validatedBreadcrumbs.error)
throw badRequestError()
}
return validatedBreadcrumbs.data
} catch (error) {
console.info(`Get My Pages Breadcrumbs Error`)
console.error(error)
throw internalServerError()
const validatedBreadcrumbs = getBreadcrumbsSchema.safeParse(breadcrumbs)
if (!validatedBreadcrumbs.success) {
throw internalServerError(validatedBreadcrumbs.error)
}
return validatedBreadcrumbs.data
}),
})