import { createCounter } from "@scandic-hotels/common/telemetry" import { router } from "../../.." import { notFoundError } from "../../../errors" import { GetPromoCampaignPage } from "../../../graphql/Query/PromoCampaignPage/PromoCampaignPage.graphql" import { request } from "../../../graphql/request" import { contentStackUidWithServiceProcedure } from "../../../procedures" import { generateTag } from "../../../utils/generateTag" import { promoCampaignPageSchema } from "./output" import type { GetPromoCampaignPageData } from "../../../types/promoCampaignPage" import type { TrackingPageData } from "../../types" export const promoCampaignPageQueryRouter = router({ get: contentStackUidWithServiceProcedure.query(async ({ ctx }) => { const { lang, uid } = ctx const cacheKey = generateTag(lang, uid) const getPromoCampaignPageCounter = createCounter( "trpc.contentstack.promoCampaignPage.get" ) const metricsGetPromoCampaignPage = getPromoCampaignPageCounter.init({ lang, uid, }) metricsGetPromoCampaignPage.start() const response = await request( GetPromoCampaignPage, { locale: lang, uid, }, { key: `${cacheKey}:promoCampaignPage`, ttl: "max", } ) if (!response.data) { metricsGetPromoCampaignPage.noDataError() throw notFoundError({ message: "GetPromoCampaignPage returned no data", errorDetails: { lang, uid }, }) } const validatedResponse = promoCampaignPageSchema.safeParse(response.data) if (!validatedResponse.success) { metricsGetPromoCampaignPage.validationError(validatedResponse.error) return null } const { promo_campaign_page, trackingProps } = validatedResponse.data metricsGetPromoCampaignPage.success() const system = promo_campaign_page.system const pageName = trackingProps.url const tracking: TrackingPageData = { pageId: system.uid, domainLanguage: system.locale, publishDate: system.updated_at, createDate: system.created_at, channel: "promo-campaign", pageType: "promocampaignpage", pageName, siteSections: pageName, siteVersion: "new-web", } return { promo_campaign_page, tracking, } }), })