import { createCounter } from "@scandic-hotels/common/telemetry" import { router } from "../../.." import { notFoundError } from "../../../errors" import { GetPromoCampaignPage, GetPromoCampaignPageRefs, } from "../../../graphql/Query/PromoCampaignPage/PromoCampaignPage.graphql" import { request } from "../../../graphql/request" import { contentStackUidWithServiceProcedure } from "../../../procedures" import { generateRefsResponseTag } from "../../../utils/generateTag" import { promoCampaignPageRefsSchema, promoCampaignPageSchema } from "./output" import { generatePageTags } from "./utils" import type { GetPromoCampaignPageData, GetPromoCampaignPageRefsData, } from "../../../types/promoCampaignPage" import type { TrackingPageData } from "../../types" export const promoCampaignPageQueryRouter = router({ get: contentStackUidWithServiceProcedure.query(async ({ ctx }) => { const { lang, uid } = ctx const getPromoCampaignPageRefsCounter = createCounter( "trpc.contentstack.promoCampaignPage.get.refs" ) const metricsGetPromoCampaignPageRefs = getPromoCampaignPageRefsCounter.init({ lang, uid, }) metricsGetPromoCampaignPageRefs.start() const refsResponse = await request( GetPromoCampaignPageRefs, { locale: lang, uid }, { key: generateRefsResponseTag(lang, uid), ttl: "max", } ) if (!refsResponse.data) { metricsGetPromoCampaignPageRefs.noDataError() throw notFoundError({ message: "GetPromoCampaignPageRefs returned no data", errorDetails: { lang, uid }, }) } const validatedRefsData = promoCampaignPageRefsSchema.safeParse( refsResponse.data ) if (!validatedRefsData.success) { metricsGetPromoCampaignPageRefs.validationError(validatedRefsData.error) return null } metricsGetPromoCampaignPageRefs.success() const tags = generatePageTags(validatedRefsData.data, lang) const getPromoCampaignPageCounter = createCounter( "trpc.contentstack.promoCampaignPage.get" ) const metricsGetPromoCampaignPage = getPromoCampaignPageCounter.init({ lang, uid, }) metricsGetPromoCampaignPage.start() const response = await request( GetPromoCampaignPage, { locale: lang, uid, }, { key: tags, 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, } }), })