56 lines
1.8 KiB
TypeScript
56 lines
1.8 KiB
TypeScript
import { GetMyPagesBreadcrumbs } 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 { getBreadcrumbsInput } from "./input"
|
|
import { validateBreadcrumbsConstenstackSchema } from "./output"
|
|
|
|
import { GetMyPagesBreadcrumbsData } from "@/types/requests/myPages/breadcrumbs"
|
|
|
|
export const breadcrumbsQueryRouter = router({
|
|
get: publicProcedure.input(getBreadcrumbsInput).query(async ({ input }) => {
|
|
try {
|
|
const response = await request<GetMyPagesBreadcrumbsData>(
|
|
GetMyPagesBreadcrumbs,
|
|
{ locale: input.locale, url: input.href }
|
|
)
|
|
if (!response.data) {
|
|
throw badRequestError()
|
|
}
|
|
|
|
const validatedBreadcrumbs =
|
|
validateBreadcrumbsConstenstackSchema.safeParse(response.data)
|
|
if (!validatedBreadcrumbs.success) {
|
|
throw badRequestError()
|
|
}
|
|
|
|
const parentBreadcrumbs =
|
|
validatedBreadcrumbs.data.all_account_page.items[0].breadcrumbs.parents.edges.map(
|
|
(breadcrumb) => {
|
|
return {
|
|
href: breadcrumb.node.url,
|
|
title: breadcrumb.node.breadcrumbs.title,
|
|
uid: breadcrumb.node.system.uid,
|
|
}
|
|
}
|
|
)
|
|
const pageBreadcrumb =
|
|
validatedBreadcrumbs.data.all_account_page.items.map((breadcrumb) => {
|
|
return {
|
|
href: "",
|
|
title: breadcrumb.breadcrumbs.title,
|
|
uid: breadcrumb.system.uid,
|
|
}
|
|
})
|
|
const breadcrumbs = [parentBreadcrumbs, pageBreadcrumb].flat()
|
|
|
|
return breadcrumbs
|
|
} catch (error) {
|
|
console.info(`Get My Pages Breadcrumbs Error`)
|
|
console.error(error)
|
|
throw internalServerError()
|
|
}
|
|
}),
|
|
})
|