feat(WEB-205, WEB-206): get breadcrumbs for my pages from contentstack
This commit is contained in:
10
server/routers/contentstack/breadcrumbs/input.ts
Normal file
10
server/routers/contentstack/breadcrumbs/input.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { z } from "zod";
|
||||
|
||||
import { Lang } from "@/constants/languages";
|
||||
|
||||
const langs = Object.keys(Lang) as [keyof typeof Lang]
|
||||
|
||||
export const getBreadcrumbsInput = z.object({
|
||||
href: z.string().min(1, { message: "href is required" }),
|
||||
locale: z.enum(langs),
|
||||
})
|
||||
@@ -1,8 +1,40 @@
|
||||
import { z } from "zod"
|
||||
|
||||
export const validateBreadcrumbsConstenstackSchema = z.object({
|
||||
all_account_page: z.object({
|
||||
items: z.array(
|
||||
z.object({
|
||||
breadcrumbs: z.object({
|
||||
title: z.string(),
|
||||
parents: z.object({
|
||||
edges: z.array(
|
||||
z.object({
|
||||
node: z.object({
|
||||
breadcrumbs: z.object({
|
||||
title: z.string(),
|
||||
}),
|
||||
system: z.object({
|
||||
uid: z.string(),
|
||||
}),
|
||||
url: z.string(),
|
||||
}),
|
||||
})
|
||||
),
|
||||
}),
|
||||
}),
|
||||
system: z.object({
|
||||
uid: z.string(),
|
||||
}),
|
||||
})
|
||||
),
|
||||
total: z.number(),
|
||||
}),
|
||||
})
|
||||
|
||||
export const getBreadcrumbsSchema = z.array(
|
||||
z.object({
|
||||
href: z.string().optional(),
|
||||
title: z.string(),
|
||||
uid: z.string(),
|
||||
})
|
||||
)
|
||||
|
||||
@@ -1,43 +1,54 @@
|
||||
import { z } from "zod"
|
||||
|
||||
import { badRequestError } from "@/server/errors/trpc"
|
||||
import { getBreadcrumbsSchema } from "./output"
|
||||
import { badRequestError, internalServerError } from "@/server/errors/trpc"
|
||||
import { validateBreadcrumbsConstenstackSchema } from "./output"
|
||||
import { publicProcedure, router } from "@/server/trpc"
|
||||
|
||||
const rootMyPagesBreadcrumb = {
|
||||
href: "/en/my-pages",
|
||||
title: "My Pages",
|
||||
}
|
||||
|
||||
enum paths {
|
||||
"/my-pages",
|
||||
"/my-pages/benefits",
|
||||
"/my-pages/overview",
|
||||
"/my-pages/profile",
|
||||
}
|
||||
|
||||
const keys = Object.keys(paths) as [keyof typeof paths]
|
||||
|
||||
const possibleBreadcrumbs: Record<string, { title: string; href?: string }[]> =
|
||||
{
|
||||
"/my-pages": [
|
||||
{
|
||||
title: rootMyPagesBreadcrumb.title,
|
||||
},
|
||||
],
|
||||
"/my-pages/benefits": [rootMyPagesBreadcrumb, { title: "Benefits" }],
|
||||
"/my-pages/overview": [rootMyPagesBreadcrumb, { title: "Overview" }],
|
||||
"/my-pages/profile": [rootMyPagesBreadcrumb, { title: "Profile" }],
|
||||
}
|
||||
import { request } from "@/lib/graphql/request"
|
||||
import { GetMyPagesBreadcrumbs } from "@/lib/graphql/Query/BreadcrumbsMyPages.graphql"
|
||||
import { getBreadcrumbsInput } from "./input"
|
||||
import { GetMyPagesBreadcrumbsData } from "@/types/requests/myPages/breadcrumbs"
|
||||
|
||||
export const breadcrumbsQueryRouter = router({
|
||||
get: publicProcedure.input(z.object({ href: z.enum(keys) })).query((opts) => {
|
||||
const breadcrumbs = possibleBreadcrumbs[opts.input.href]
|
||||
const validatedBreadcrumbs = getBreadcrumbsSchema.safeParse(breadcrumbs)
|
||||
if (validatedBreadcrumbs.success) {
|
||||
return breadcrumbs
|
||||
}
|
||||
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()
|
||||
}
|
||||
|
||||
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()
|
||||
}
|
||||
}),
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user