diff --git a/server/routers/contentstack/base/query.ts b/server/routers/contentstack/base/query.ts index 388e5f1a9..959098653 100644 --- a/server/routers/contentstack/base/query.ts +++ b/server/routers/contentstack/base/query.ts @@ -56,77 +56,81 @@ export const baseQueryRouter = router({ return validatedContactConfigConfig.data.all_contact_config.items[0] }), - header: publicProcedure.input(langInput).query(async ({ input }) => { - const responseRef = await request(GetCurrentHeaderRef, { - locale: input.lang, - }) - - const response = await request( - GetCurrentHeader, - { locale: input.lang }, - { - tags: [ - generateTag( - input.lang, - responseRef.data.all_current_header.items[0].system.uid - ), - ], - } - ) - - if (!response.data) { - throw notFound(response) - } - - const validatedHeaderConfig = validateHeaderConfigSchema.safeParse( - response.data - ) - - if (!validatedHeaderConfig.success) { - console.info(`Failed to validate Header - (lang: ${input.lang})`) - console.error(validatedHeaderConfig.error) - return null - } - - const logo = - validatedHeaderConfig.data.all_current_header.items[0].logoConnection - .edges?.[0]?.node - - return { - ...validatedHeaderConfig.data.all_current_header.items[0], - logo, - } as HeaderData - }), - footer: publicProcedure.input(langInput).query(async ({ input }) => { - const responseRef = await request(GetCurrentFooterRef, { - locale: input.lang, - }) - - const response = await request( - GetCurrentFooter, - { + header: contentstackBaseProcedure + .input(langInput) + .query(async ({ input }) => { + const responseRef = await request(GetCurrentHeaderRef, { locale: input.lang, - }, - { - tags: [ - generateTag( - input.lang, - responseRef.data.all_current_footer.items[0].system.uid - ), - ], + }) + + const response = await request( + GetCurrentHeader, + { locale: input.lang }, + { + tags: [ + generateTag( + input.lang, + responseRef.data.all_current_header.items[0].system.uid + ), + ], + } + ) + + if (!response.data) { + throw notFound(response) } - ) - const validatedFooterConfig = validateFooterConfigSchema.safeParse( - response.data - ) + const validatedHeaderConfig = validateHeaderConfigSchema.safeParse( + response.data + ) - if (!validatedFooterConfig.success) { - console.info(`Failed to validate Footer - (lang: ${input.lang})`) - console.error(validatedFooterConfig.error) - return null - } + if (!validatedHeaderConfig.success) { + console.info(`Failed to validate Header - (lang: ${input.lang})`) + console.error(validatedHeaderConfig.error) + return null + } - return validatedFooterConfig.data.all_current_footer.items[0] - }), + const logo = + validatedHeaderConfig.data.all_current_header.items[0].logoConnection + .edges?.[0]?.node + + return { + ...validatedHeaderConfig.data.all_current_header.items[0], + logo, + } as HeaderData + }), + footer: contentstackBaseProcedure + .input(langInput) + .query(async ({ input }) => { + const responseRef = await request(GetCurrentFooterRef, { + locale: input.lang, + }) + + const response = await request( + GetCurrentFooter, + { + locale: input.lang, + }, + { + tags: [ + generateTag( + input.lang, + responseRef.data.all_current_footer.items[0].system.uid + ), + ], + } + ) + + const validatedFooterConfig = validateFooterConfigSchema.safeParse( + response.data + ) + + if (!validatedFooterConfig.success) { + console.info(`Failed to validate Footer - (lang: ${input.lang})`) + console.error(validatedFooterConfig.error) + return null + } + + return validatedFooterConfig.data.all_current_footer.items[0] + }), }) diff --git a/server/trpc.ts b/server/trpc.ts index 4fe644388..1363e34ab 100644 --- a/server/trpc.ts +++ b/server/trpc.ts @@ -4,6 +4,7 @@ import { env } from "@/env/server" import { badRequestError, sessionExpiredError } from "./errors/trpc" import { transformer } from "./transformer" +import { langInput } from "./utils" import type { Meta } from "@/types/trpc/meta" import type { Context } from "./context" @@ -12,9 +13,19 @@ const t = initTRPC.context().meta().create({ transformer }) export const { createCallerFactory, mergeRouters, router } = t export const publicProcedure = t.procedure -export const contentstackBaseProcedure = t.procedure.use(function (opts) { +export const contentstackBaseProcedure = t.procedure.use(async function (opts) { if (!opts.ctx.lang) { - throw badRequestError("Missing Lang in tRPC context") + const input = await opts.getRawInput() + + const parsedInput = langInput.safeParse(input) + if (!parsedInput.success) { + throw badRequestError("Missing Lang in tRPC context") + } + return opts.next({ + ctx: { + lang: parsedInput.data.lang, + }, + }) } return opts.next({ ctx: { diff --git a/server/utils.ts b/server/utils.ts new file mode 100644 index 000000000..1a03530fb --- /dev/null +++ b/server/utils.ts @@ -0,0 +1,7 @@ +import { z } from "zod" + +import { Lang } from "@/constants/languages" + +export const langInput = z.object({ + lang: z.nativeEnum(Lang), +})