diff --git a/lib/graphql/Query/HotelPage.graphql b/lib/graphql/Query/HotelPage.graphql new file mode 100644 index 000000000..7bf4041d4 --- /dev/null +++ b/lib/graphql/Query/HotelPage.graphql @@ -0,0 +1,7 @@ +query GetHotelPage($locale: String!, $uid: String!) { + hotel_page(locale: $locale, uid: $uid) { + hotel_page_id + url + title + } +} diff --git a/lib/graphql/Query/ResolveEntry.graphql b/lib/graphql/Query/ResolveEntry.graphql index 016cee594..278ed1cbe 100644 --- a/lib/graphql/Query/ResolveEntry.graphql +++ b/lib/graphql/Query/ResolveEntry.graphql @@ -33,4 +33,12 @@ query ResolveEntryByUrl($locale: String!, $url: String!) { } total } + all_hotel_page(where: { url: $url }, locale: $locale) { + items { + system { + ...System + } + } + total + } } diff --git a/server/routers/contentstack/hotelPage/index.ts b/server/routers/contentstack/hotelPage/index.ts new file mode 100644 index 000000000..5517dbb3e --- /dev/null +++ b/server/routers/contentstack/hotelPage/index.ts @@ -0,0 +1,5 @@ +import { mergeRouters } from "@/server/trpc" + +import { hotelPageQueryRouter } from "./query" + +export const hotelPageRouter = mergeRouters(hotelPageQueryRouter) diff --git a/server/routers/contentstack/hotelPage/output.ts b/server/routers/contentstack/hotelPage/output.ts new file mode 100644 index 000000000..3c002e50a --- /dev/null +++ b/server/routers/contentstack/hotelPage/output.ts @@ -0,0 +1,16 @@ +import { z } from "zod" + +export const validateHotelPageSchema = z.object({ + hotel_page: z.object({ + hotel_page_id: z.string(), + title: z.string(), + url: z.string(), + }), +}) + +// Will be extended once we introduce more functionality to our entries. +export type HotelPageDataRaw = z.infer + +type HotelPageRaw = HotelPageDataRaw["hotel_page"] + +export type HotelPage = HotelPageRaw diff --git a/server/routers/contentstack/hotelPage/query.ts b/server/routers/contentstack/hotelPage/query.ts new file mode 100644 index 000000000..bd649da0f --- /dev/null +++ b/server/routers/contentstack/hotelPage/query.ts @@ -0,0 +1,35 @@ +import { GetHotelPage } from "@/lib/graphql/Query/HotelPage.graphql" +import { request } from "@/lib/graphql/request" +import { notFound } from "@/server/errors/trpc" +import { contentstackBaseProcedure, router } from "@/server/trpc" + +import { HotelPage, HotelPageDataRaw, validateHotelPageSchema } from "./output" + +export const hotelPageQueryRouter = router({ + get: contentstackBaseProcedure.query(async ({ ctx }) => { + const { lang, uid } = ctx + const response = await request(GetHotelPage, { + locale: lang, + uid, + }) + if (!response.data) { + throw notFound(response) + } + + const validatedHotelPage = validateHotelPageSchema.safeParse(response.data) + + if (!validatedHotelPage.success) { + console.info( + `Failed to validate Hotel Page - (uid: ${uid}, lang: ${lang})` + ) + console.error(validatedHotelPage.error) + return null + } + + const hotelPage = { + ...validatedHotelPage.data.hotel_page, + } as HotelPage + + return hotelPage + }), +}) diff --git a/server/routers/contentstack/index.ts b/server/routers/contentstack/index.ts index 205d9ea6b..be1ef1ed3 100644 --- a/server/routers/contentstack/index.ts +++ b/server/routers/contentstack/index.ts @@ -3,6 +3,7 @@ import { router } from "@/server/trpc" import { accountPageRouter } from "./accountPage" import { baseRouter } from "./base" import { breadcrumbsRouter } from "./breadcrumbs" +import { hotelPageRouter } from "./hotelPage" import { languageSwitcherRouter } from "./languageSwitcher" import { loyaltyPageRouter } from "./loyaltyPage" import { myPagesRouter } from "./myPages" @@ -11,6 +12,7 @@ export const contentstackRouter = router({ accountPage: accountPageRouter, base: baseRouter, breadcrumbs: breadcrumbsRouter, + hotelPage: hotelPageRouter, languageSwitcher: languageSwitcherRouter, loyaltyPage: loyaltyPageRouter, myPages: myPagesRouter, diff --git a/types/params.ts b/types/params.ts index 0ea8f134a..fff91effc 100644 --- a/types/params.ts +++ b/types/params.ts @@ -17,7 +17,7 @@ export type StatusParams = { } export type ContentTypeParams = { - contentType: "loyalty-page" | "content-page" + contentType: "loyalty-page" | "content-page" | "hotel-page" } export type ContentTypeWebviewParams = { diff --git a/types/requests/entry.ts b/types/requests/entry.ts index a104d2134..e86b1a4ca 100644 --- a/types/requests/entry.ts +++ b/types/requests/entry.ts @@ -17,4 +17,5 @@ export const validateEntryResolveSchema = z.object({ all_content_page: entryResolveSchema, all_loyalty_page: entryResolveSchema, all_current_blocks_page: entryResolveSchema, + all_hotel_page: entryResolveSchema, })