import { dt } from "@scandic-hotels/common/dt" import { createCounter } from "@scandic-hotels/common/telemetry" import { GetCampaignPagesByHotelUid } from "../../../graphql/Query/CampaignPage/CampaignPagesByHotelUid.graphql" import { request } from "../../../graphql/request" import { generateTag } from "../../../utils/generateTag" import { campaignPagesByHotelUidSchema } from "./output" import type { Lang } from "@scandic-hotels/common/constants/language" import type { CarouselCardsBlock, GetCampaignPagesByHotelUidData, } from "../../../types/campaignPage" export function getCarouselCardsBlockWithBookingCodeLinks( block: CarouselCardsBlock, bookingCode: string | null ): CarouselCardsBlock { if (!bookingCode) { return block } const { link, cards, ...carousel_cards } = block.carousel_cards return { ...block, carousel_cards: { ...carousel_cards, link: link ? { ...link, href: `${link.href}?bookingCode=${bookingCode}`, } : undefined, cards: cards.map(({ link, ...card }) => ({ ...card, link: link ? { ...link, href: `${link.href}?bookingCode=${bookingCode}`, } : undefined, })), }, } } export async function getCampaignPagesByHotelPageUid( hotelPageUid: string, lang: Lang ) { const today = dt().format("YYYY-MM-DD") const getCampaignPagesByHotelUidCounter = createCounter( "trpc.contentstack.campaignPage.byHotelUid.get" ) const metricsGetCampaignPagesByHotelUid = getCampaignPagesByHotelUidCounter.init({ lang, hotelPageUid, today, }) metricsGetCampaignPagesByHotelUid.start() const variables = { locale: lang, hotelPageUid, today, } const response = await request( GetCampaignPagesByHotelUid, variables, { key: generateTag(lang, `${hotelPageUid}-${today}`), ttl: "1d", } ) if (!response.data) { metricsGetCampaignPagesByHotelUid.noDataError() return null } const validatedResponse = campaignPagesByHotelUidSchema.safeParse( response.data ) if (!validatedResponse.success) { metricsGetCampaignPagesByHotelUid.validationError(validatedResponse.error) return null } metricsGetCampaignPagesByHotelUid.success() return validatedResponse.data }