Merged in feat/rework-contentstack (pull request #3493)
Feat(SW-3708): refactor contentstack fetching (removing all refs) and cache invalidation * Remove all REFS * Revalidate correct language * PR fixes * PR fixes * Throw when errors from contentstack api Approved-by: Joakim Jäderberg
This commit is contained in:
@@ -5,57 +5,31 @@ import { createCounter } from "@scandic-hotels/common/telemetry"
|
||||
import { router } from "../../.."
|
||||
import { notFoundError } from "../../../errors"
|
||||
import { GetContactConfig } from "../../../graphql/Query/ContactConfig.graphql"
|
||||
import { GetFooter, GetFooterRef } from "../../../graphql/Query/Footer.graphql"
|
||||
import { GetHeader, GetHeaderRef } from "../../../graphql/Query/Header.graphql"
|
||||
import {
|
||||
GetSiteConfig,
|
||||
GetSiteConfigRef,
|
||||
} from "../../../graphql/Query/SiteConfig.graphql"
|
||||
import {
|
||||
GetSitewideCampaignBanner,
|
||||
GetSitewideCampaignBannerRef,
|
||||
} from "../../../graphql/Query/SitewideCampaignBanner.graphql"
|
||||
import { GetFooter } from "../../../graphql/Query/Footer.graphql"
|
||||
import { GetHeader } from "../../../graphql/Query/Header.graphql"
|
||||
import { GetSiteConfig } from "../../../graphql/Query/SiteConfig.graphql"
|
||||
import { GetSitewideCampaignBanner } from "../../../graphql/Query/SitewideCampaignBanner.graphql"
|
||||
import { request } from "../../../graphql/request"
|
||||
import { contentstackBaseProcedure } from "../../../procedures"
|
||||
import { langInput } from "../../../utils"
|
||||
import {
|
||||
generateRefsResponseTag,
|
||||
generateTag,
|
||||
generateTags,
|
||||
generateTagsFromSystem,
|
||||
} from "../../../utils/generateTag"
|
||||
import { generateTag } from "../../../utils/generateTag"
|
||||
import {
|
||||
type ContactConfigData,
|
||||
headerRefsSchema,
|
||||
headerSchema,
|
||||
siteConfigRefSchema,
|
||||
siteConfigSchema,
|
||||
sitewideCampaignBannerRefSchema,
|
||||
sitewideCampaignBannerSchema,
|
||||
validateContactConfigSchema,
|
||||
validateFooterConfigSchema,
|
||||
validateFooterRefConfigSchema,
|
||||
} from "./output"
|
||||
import {
|
||||
getAlertPhoneContactData,
|
||||
getConnections,
|
||||
getFooterConnections,
|
||||
getSiteConfigConnections,
|
||||
getSitewideCampaignBannerConnections,
|
||||
} from "./utils"
|
||||
import { getAlertPhoneContactData } from "./utils"
|
||||
|
||||
import type { Lang } from "@scandic-hotels/common/constants/language"
|
||||
|
||||
import type { FooterDataRaw, FooterRefDataRaw } from "../../../types/footer"
|
||||
import type {
|
||||
GetHeader as GetHeaderData,
|
||||
GetHeaderRefs,
|
||||
} from "../../../types/header"
|
||||
import type { FooterDataRaw } from "../../../types/footer"
|
||||
import type { GetHeader as GetHeaderData } from "../../../types/header"
|
||||
import type {
|
||||
GetSiteConfigData,
|
||||
GetSiteConfigRefData,
|
||||
GetSitewideCampaignBannerData,
|
||||
GetSitewideCampaignBannerRefData,
|
||||
} from "../../../types/siteConfig"
|
||||
|
||||
const getContactConfig = cache(async (lang: Lang) => {
|
||||
@@ -103,51 +77,13 @@ export const baseQueryRouter = router({
|
||||
}),
|
||||
header: contentstackBaseProcedure.query(async ({ ctx }) => {
|
||||
const { lang } = ctx
|
||||
|
||||
const getHeaderRefsCounter = createCounter(
|
||||
"trpc.contentstack.header.get.refs"
|
||||
)
|
||||
const metricsGetHeaderRefs = getHeaderRefsCounter.init({ lang })
|
||||
|
||||
metricsGetHeaderRefs.start()
|
||||
|
||||
const variables = { locale: lang }
|
||||
const responseRef = await request<GetHeaderRefs>(GetHeaderRef, variables, {
|
||||
key: generateRefsResponseTag(lang, "header"),
|
||||
ttl: "max",
|
||||
})
|
||||
|
||||
if (!responseRef.data) {
|
||||
metricsGetHeaderRefs.noDataError()
|
||||
throw notFoundError({
|
||||
message: "GetHeaderRef returned no data",
|
||||
errorDetails: variables,
|
||||
})
|
||||
}
|
||||
|
||||
const validatedHeaderRefs = headerRefsSchema.safeParse(responseRef.data)
|
||||
|
||||
if (!validatedHeaderRefs.success) {
|
||||
metricsGetHeaderRefs.validationError(validatedHeaderRefs.error)
|
||||
return null
|
||||
}
|
||||
|
||||
metricsGetHeaderRefs.success()
|
||||
|
||||
const connections = getConnections(validatedHeaderRefs.data)
|
||||
|
||||
const getHeaderCounter = createCounter("trpc.contentstack.header.get")
|
||||
const metricsGetHeader = getHeaderCounter.init({ lang })
|
||||
|
||||
metricsGetHeader.start()
|
||||
|
||||
const tags = [
|
||||
generateTagsFromSystem(lang, connections),
|
||||
generateTag(lang, validatedHeaderRefs.data.header.system.uid),
|
||||
].flat()
|
||||
|
||||
const variables = { locale: lang }
|
||||
const response = await request<GetHeaderData>(GetHeader, variables, {
|
||||
key: tags,
|
||||
key: generateTag(lang, "header"),
|
||||
ttl: "max",
|
||||
})
|
||||
|
||||
@@ -168,64 +104,17 @@ export const baseQueryRouter = router({
|
||||
|
||||
metricsGetHeader.success()
|
||||
|
||||
return {
|
||||
data: validatedHeaderConfig.data.header,
|
||||
}
|
||||
return { data: validatedHeaderConfig.data.header }
|
||||
}),
|
||||
footer: contentstackBaseProcedure.query(async ({ ctx }) => {
|
||||
const { lang } = ctx
|
||||
|
||||
const getFooterRefsCounter = createCounter(
|
||||
"trpc.contentstack.footer.get.refs"
|
||||
)
|
||||
const metricsGetFooterRefs = getFooterRefsCounter.init({ lang })
|
||||
|
||||
metricsGetFooterRefs.start()
|
||||
|
||||
const variables = { locale: lang }
|
||||
const responseRef = await request<FooterRefDataRaw>(
|
||||
GetFooterRef,
|
||||
variables,
|
||||
{
|
||||
key: generateRefsResponseTag(lang, "footer"),
|
||||
ttl: "max",
|
||||
}
|
||||
)
|
||||
|
||||
if (!responseRef.data) {
|
||||
metricsGetFooterRefs.noDataError()
|
||||
throw notFoundError({
|
||||
message: "GetFooterRef returned no data",
|
||||
errorDetails: variables,
|
||||
})
|
||||
}
|
||||
|
||||
const validatedFooterRefs = validateFooterRefConfigSchema.safeParse(
|
||||
responseRef.data
|
||||
)
|
||||
|
||||
if (!validatedFooterRefs.success) {
|
||||
metricsGetFooterRefs.validationError(validatedFooterRefs.error)
|
||||
return null
|
||||
}
|
||||
|
||||
metricsGetFooterRefs.success()
|
||||
|
||||
const connections = getFooterConnections(validatedFooterRefs.data)
|
||||
const footerUID = responseRef.data.all_footer.items[0].system.uid
|
||||
|
||||
const getFooterCounter = createCounter("trpc.contentstack.footer.get")
|
||||
const metricsGetFooter = getFooterCounter.init({ lang })
|
||||
|
||||
metricsGetFooter.start()
|
||||
|
||||
const tags = [
|
||||
generateTags(lang, connections),
|
||||
generateTag(lang, footerUID),
|
||||
].flat()
|
||||
|
||||
const variables = { locale: lang }
|
||||
const response = await request<FooterDataRaw>(GetFooter, variables, {
|
||||
key: tags,
|
||||
key: generateTag(lang, "footer"),
|
||||
ttl: "max",
|
||||
})
|
||||
|
||||
@@ -256,52 +145,6 @@ export const baseQueryRouter = router({
|
||||
.query(async ({ input, ctx }) => {
|
||||
const lang = input.lang ?? ctx.lang
|
||||
|
||||
const getSitewideCampaignBannerRefsCounter = createCounter(
|
||||
"trpc.contentstack.sitewideCampaignBanner.get.refs"
|
||||
)
|
||||
const metricsGetSitewideCampaignBannerRefs =
|
||||
getSitewideCampaignBannerRefsCounter.init({
|
||||
lang,
|
||||
})
|
||||
|
||||
metricsGetSitewideCampaignBannerRefs.start()
|
||||
|
||||
const refVariables = { locale: lang }
|
||||
const responseRef = await request<GetSitewideCampaignBannerRefData>(
|
||||
GetSitewideCampaignBannerRef,
|
||||
refVariables,
|
||||
{
|
||||
key: generateRefsResponseTag(lang, "sitewide_campaign_banner"),
|
||||
ttl: "max",
|
||||
}
|
||||
)
|
||||
|
||||
if (!responseRef.data) {
|
||||
metricsGetSitewideCampaignBannerRefs.noDataError()
|
||||
throw notFoundError({
|
||||
message: "GetSitewideCampaignBannerRef returned no data",
|
||||
errorDetails: refVariables,
|
||||
})
|
||||
}
|
||||
|
||||
const validatedSitewideCampaignBannerRef =
|
||||
sitewideCampaignBannerRefSchema.safeParse(responseRef.data)
|
||||
|
||||
if (!validatedSitewideCampaignBannerRef.success) {
|
||||
metricsGetSitewideCampaignBannerRefs.validationError(
|
||||
validatedSitewideCampaignBannerRef.error
|
||||
)
|
||||
return null
|
||||
}
|
||||
|
||||
const connections = getSitewideCampaignBannerConnections(
|
||||
validatedSitewideCampaignBannerRef.data
|
||||
)
|
||||
|
||||
const tags = [generateTagsFromSystem(lang, connections)].flat()
|
||||
|
||||
metricsGetSitewideCampaignBannerRefs.success()
|
||||
|
||||
const getSitewideCampaignBannerCounter = createCounter(
|
||||
"trpc.contentstack.sitewideCampaignBanner.get"
|
||||
)
|
||||
@@ -317,7 +160,7 @@ export const baseQueryRouter = router({
|
||||
await request<GetSitewideCampaignBannerData>(
|
||||
GetSitewideCampaignBanner,
|
||||
variables,
|
||||
{ key: tags, ttl: "max" }
|
||||
{ key: generateTag(lang, "sitewide_campaign_banner"), ttl: "max" }
|
||||
)
|
||||
|
||||
if (!sitewideCampaignBannerResponse.data) {
|
||||
@@ -351,52 +194,6 @@ export const baseQueryRouter = router({
|
||||
.query(async ({ input, ctx }) => {
|
||||
const lang = input.lang ?? ctx.lang
|
||||
|
||||
const getSiteConfigRefsCounter = createCounter(
|
||||
"trpc.contentstack.siteConfig.get.refs"
|
||||
)
|
||||
const metricsGetSiteConfigRefs = getSiteConfigRefsCounter.init({ lang })
|
||||
|
||||
metricsGetSiteConfigRefs.start()
|
||||
|
||||
const refVariables = {
|
||||
locale: lang,
|
||||
}
|
||||
const responseRef = await request<GetSiteConfigRefData>(
|
||||
GetSiteConfigRef,
|
||||
refVariables,
|
||||
{
|
||||
key: generateRefsResponseTag(lang, "site_config"),
|
||||
ttl: "max",
|
||||
}
|
||||
)
|
||||
|
||||
if (!responseRef.data) {
|
||||
metricsGetSiteConfigRefs.noDataError()
|
||||
throw notFoundError({
|
||||
message: "SiteConfigRefs returned no data",
|
||||
errorDetails: refVariables,
|
||||
})
|
||||
}
|
||||
|
||||
const validatedSiteConfigRef = siteConfigRefSchema.safeParse(
|
||||
responseRef.data
|
||||
)
|
||||
|
||||
if (!validatedSiteConfigRef.success) {
|
||||
metricsGetSiteConfigRefs.validationError(validatedSiteConfigRef.error)
|
||||
return null
|
||||
}
|
||||
|
||||
const connections = getSiteConfigConnections(validatedSiteConfigRef.data)
|
||||
const siteConfigUid = responseRef.data.all_site_config.items[0].system.uid
|
||||
|
||||
const tags = [
|
||||
generateTagsFromSystem(lang, connections),
|
||||
generateTag(lang, siteConfigUid),
|
||||
].flat()
|
||||
|
||||
metricsGetSiteConfigRefs.success()
|
||||
|
||||
const getSiteConfigCounter = createCounter(
|
||||
"trpc.contentstack.siteConfig.get"
|
||||
)
|
||||
@@ -407,7 +204,7 @@ export const baseQueryRouter = router({
|
||||
const variables = { locale: lang }
|
||||
const [siteConfigResponse, contactConfig] = await Promise.all([
|
||||
request<GetSiteConfigData>(GetSiteConfig, variables, {
|
||||
key: tags,
|
||||
key: generateTag(lang, "site_config"),
|
||||
ttl: "max",
|
||||
}),
|
||||
getContactConfig(lang),
|
||||
|
||||
Reference in New Issue
Block a user