import { createCounter } from "@scandic-hotels/common/telemetry" import { router } from "../../.." import { notFound } from "../../../errors" import { GetStartPage, GetStartPageRefs, } from "../../../graphql/Query/StartPage/StartPage.graphql" import { request } from "../../../graphql/request" import { contentstackExtendedProcedureUID } from "../../../procedures" import { generateRefsResponseTag, generateTag, generateTagsFromSystem, } from "../../../utils/generateTag" import { startPageRefsSchema, startPageSchema } from "./output" import { getConnections } from "./utils" import type { z } from "zod" import type { TrackingPageData } from "../../types" import type { blocksSchema } from "./output" export interface GetStartPageData extends z.input {} export interface StartPage extends z.output {} export interface GetStartPageRefsSchema extends z.input< typeof startPageRefsSchema > {} export type Block = z.output export const startPageQueryRouter = router({ get: contentstackExtendedProcedureUID.query(async ({ ctx }) => { const { lang, uid } = ctx const getStartPageRefsCounter = createCounter( "trpc.contentstack.startPage.get.refs" ) const metricsGetStartPageRefs = getStartPageRefsCounter.init({ lang, uid }) metricsGetStartPageRefs.start() const refsResponse = await request( GetStartPageRefs, { locale: lang, uid, }, { key: generateRefsResponseTag(lang, uid), ttl: "max", } ) if (!refsResponse.data) { const notFoundError = notFound(refsResponse) metricsGetStartPageRefs.noDataError() throw notFoundError } const validatedRefsData = startPageRefsSchema.safeParse(refsResponse.data) if (!validatedRefsData.success) { metricsGetStartPageRefs.validationError(validatedRefsData.error) return null } metricsGetStartPageRefs.success() const getStartPageCounter = createCounter("trpc.contentstack.startPage.get") const metricsGetStartPage = getStartPageCounter.init({ lang, uid }) metricsGetStartPage.start() const connections = getConnections(validatedRefsData.data) const tags = [ generateTagsFromSystem(lang, connections), generateTag(lang, validatedRefsData.data.start_page.system.uid), ].flat() const response = await request( GetStartPage, { locale: lang, uid, }, { key: tags, ttl: "max", } ) if (!response.data) { const notFoundError = notFound(response) metricsGetStartPage.noDataError() throw notFoundError } const startPage = startPageSchema.safeParse(response.data) if (!startPage.success) { metricsGetStartPage.validationError(startPage.error) return null } metricsGetStartPage.success() const system = startPage.data.start_page.system const tracking: TrackingPageData = { pageName: "startpage", pageType: "startpage", pageId: system.uid, channel: "homepage", domainLanguage: lang, createDate: system.created_at, publishDate: system.updated_at, siteSections: "startpage", siteVersion: "new-web", } return { startPage: startPage.data.start_page, tracking, } }), })