import { GetLoyaltyPage, GetLoyaltyPageRefs, } from "@/lib/graphql/Query/LoyaltyPage/LoyaltyPage.graphql" import { request } from "@/lib/graphql/request" import { notFound } from "@/server/errors/trpc" import { createCounter } from "@/server/telemetry" import { contentstackExtendedProcedureUID, router } from "@/server/trpc" import { generateRefsResponseTag, generateTag, generateTagsFromSystem, } from "@/utils/generateTag" import { loyaltyPageRefsSchema, loyaltyPageSchema } from "./output" import { getConnections } from "./utils" import { TrackingChannelEnum, type TrackingSDKPageData, } from "@/types/components/tracking" import type { GetLoyaltyPageRefsSchema, GetLoyaltyPageSchema, } from "@/types/trpc/routers/contentstack/loyaltyPage" export const loyaltyPageQueryRouter = router({ get: contentstackExtendedProcedureUID.query(async ({ ctx }) => { const { lang, uid } = ctx const getLoyaltyPageRefsCounter = createCounter( "trpc.contentstack", "loyaltyPage.get.refs" ) const metricsGetLoyaltyPageRefs = getLoyaltyPageRefsCounter.init({ lang, uid, }) metricsGetLoyaltyPageRefs.start() const variables = { locale: lang, uid } const refsResponse = await request( GetLoyaltyPageRefs, variables, { key: generateRefsResponseTag(lang, uid), ttl: "max", } ) if (!refsResponse.data) { const notFoundError = notFound(refsResponse) metricsGetLoyaltyPageRefs.noDataError() throw notFoundError } const validatedLoyaltyPageRefs = loyaltyPageRefsSchema.safeParse( refsResponse.data ) if (!validatedLoyaltyPageRefs.success) { metricsGetLoyaltyPageRefs.validationError(validatedLoyaltyPageRefs.error) return null } metricsGetLoyaltyPageRefs.success() const connections = getConnections(validatedLoyaltyPageRefs.data) const tags = [ generateTagsFromSystem(lang, connections), generateTag(lang, validatedLoyaltyPageRefs.data.loyalty_page.system.uid), ].flat() const getLoyaltyPageCounter = createCounter( "trpc.contentstack", "loyaltyPage.get" ) const metricsGetLoyaltyPage = getLoyaltyPageCounter.init({ lang, uid }) metricsGetLoyaltyPage.start() const response = await request( GetLoyaltyPage, variables, { key: tags, ttl: "max", } ) if (!response.data) { const notFoundError = notFound(response) metricsGetLoyaltyPage.noDataError() throw notFoundError } const validatedLoyaltyPage = loyaltyPageSchema.safeParse(response.data) if (!validatedLoyaltyPage.success) { metricsGetLoyaltyPage.validationError(validatedLoyaltyPage.error) return null } const loyaltyPage = validatedLoyaltyPage.data.loyalty_page const loyaltyTrackingData: TrackingSDKPageData = { pageId: loyaltyPage.system.uid, domainLanguage: lang, publishDate: loyaltyPage.system.updated_at, createDate: loyaltyPage.system.created_at, channel: TrackingChannelEnum["scandic-friends"], pageType: "loyaltycontentpage", pageName: validatedLoyaltyPage.data.trackingProps.url, siteSections: validatedLoyaltyPage.data.trackingProps.url, siteVersion: "new-web", } metricsGetLoyaltyPage.success() // Assert LoyaltyPage type to get correct typings for RTE fields return { loyaltyPage, tracking: loyaltyTrackingData, } }), })