From d30cc7e2be6c19ebbc6ea6a0b87a1777f7f69a9e Mon Sep 17 00:00:00 2001 From: Linus Flood Date: Tue, 8 Apr 2025 10:27:26 +0000 Subject: [PATCH] Merged in fix/site-config-revalidate (pull request #1751) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: site-config - use correct cache keys and invalidate them * fix: site-config - use correct cache keys and invalidate them Approved-by: Joakim Jäderberg --- .../app/api/web/revalidate/route.ts | 9 + .../server/routers/contentstack/base/query.ts | 306 +++++++++--------- 2 files changed, 157 insertions(+), 158 deletions(-) diff --git a/apps/scandic-web/app/api/web/revalidate/route.ts b/apps/scandic-web/app/api/web/revalidate/route.ts index b26f7ad89..6fc7a08a9 100644 --- a/apps/scandic-web/app/api/web/revalidate/route.ts +++ b/apps/scandic-web/app/api/web/revalidate/route.ts @@ -23,6 +23,7 @@ const validateJsonBody = z.object({ data: z.object({ content_type: z.object({ uid: z.string(), + content_type_uid: z.string(), }), entry: z.object({ breadcrumbs: z @@ -90,6 +91,14 @@ export async function POST(request: NextRequest) { const cacheClient = await getCacheClient() + const contentTypeUidTag = generateTag( + entryLocale, + content_type.content_type_uid + ) + console.info(`Revalidating tag by content_type_uid: ${contentTypeUidTag}`) + revalidateTag(contentTypeUidTag) + await cacheClient.deleteKey(contentTypeUidTag, { fuzzy: true }) + console.info(`Revalidating refsTag: ${refsTag}`) revalidateTag(refsTag) await cacheClient.deleteKey(refsTag, { fuzzy: true }) diff --git a/apps/scandic-web/server/routers/contentstack/base/query.ts b/apps/scandic-web/server/routers/contentstack/base/query.ts index 3030a7384..6aaf97c23 100644 --- a/apps/scandic-web/server/routers/contentstack/base/query.ts +++ b/apps/scandic-web/server/routers/contentstack/base/query.ts @@ -20,7 +20,6 @@ import { notFound } from "@/server/errors/trpc" import { contentstackBaseProcedure, router } from "@/server/trpc" import { langInput } from "@/server/utils" -import { getCacheClient } from "@/services/dataCache" import { generateRefsResponseTag, generateTag, @@ -605,164 +604,155 @@ export const baseQueryRouter = router({ .input(langInput) .query(async ({ input, ctx }) => { const lang = input.lang ?? ctx.lang - const cacheClient = await getCacheClient() - return await cacheClient.cacheOrGet( - generateRefsResponseTag(lang, "site_config", "root"), - async () => { - getSiteConfigRefCounter.add(1, { lang }) - console.info( - "contentstack.siteConfig.ref start", - JSON.stringify({ query: { lang } }) - ) - const responseRef = await request( - GetSiteConfigRef, - { - locale: lang, - }, - { - key: generateRefsResponseTag(lang, "site_config"), - ttl: "max", - } - ) - if (!responseRef.data) { - const notFoundError = notFound(responseRef) - getSiteConfigRefFailCounter.add(1, { - lang, - error_type: "not_found", - error: JSON.stringify({ code: notFoundError.code }), - }) - console.error( - "contentstack.siteConfig.refs not found error", - JSON.stringify({ - query: { - lang, - }, - error: { code: notFoundError.code }, - }) - ) - throw notFoundError - } - - const validatedSiteConfigRef = siteConfigRefSchema.safeParse( - responseRef.data - ) - - if (!validatedSiteConfigRef.success) { - getSiteConfigRefFailCounter.add(1, { - lang, - error_type: "validation_error", - error: JSON.stringify(validatedSiteConfigRef.error), - }) - console.error( - "contentstack.siteConfig.refs validation error", - JSON.stringify({ - query: { - lang, - }, - error: 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() - - getSiteConfigRefSuccessCounter.add(1, { lang }) - console.info( - "contentstack.siteConfig.refs success", - JSON.stringify({ query: { lang } }) - ) - - getSiteConfigCounter.add(1, { lang }) - console.info( - "contentstack.siteConfig start", - JSON.stringify({ query: { lang } }) - ) - const [siteConfigResponse, contactConfig] = await Promise.all([ - request( - GetSiteConfig, - { - locale: lang, - }, - { - key: tags, - ttl: "max", - } - ), - getContactConfig(lang), - ]) - - if (!siteConfigResponse.data) { - const notFoundError = notFound(siteConfigResponse) - - getSiteConfigFailCounter.add(1, { - lang, - error_type: "not_found", - error: JSON.stringify({ code: notFoundError.code }), - }) - - console.error( - "contentstack.siteConfig not found error", - JSON.stringify({ - query: { lang }, - error: { code: notFoundError.code }, - }) - ) - - throw notFoundError - } - - const validatedSiteConfig = siteConfigSchema.safeParse( - siteConfigResponse.data - ) - - if (!validatedSiteConfig.success) { - getSiteConfigFailCounter.add(1, { - lang, - error_type: "validation_error", - error: JSON.stringify(validatedSiteConfig.error), - }) - console.error( - "contentstack.siteConfig validation error", - JSON.stringify({ - query: { lang }, - error: validatedSiteConfig.error, - }) - ) - return null - } - - getSiteConfigSuccessCounter.add(1, { lang }) - console.info( - "contentstack.siteConfig success", - JSON.stringify({ query: { lang } }) - ) - - const { sitewideAlert } = validatedSiteConfig.data - - return { - ...validatedSiteConfig.data, - sitewideAlert: sitewideAlert - ? { - ...sitewideAlert, - phoneContact: contactConfig - ? getAlertPhoneContactData(sitewideAlert, contactConfig) - : null, - } - : null, - } - }, - "max" + getSiteConfigRefCounter.add(1, { lang }) + console.info( + "contentstack.siteConfig.ref start", + JSON.stringify({ query: { lang } }) ) + const responseRef = await request( + GetSiteConfigRef, + { + locale: lang, + }, + { + key: generateRefsResponseTag(lang, "site_config"), + ttl: "max", + } + ) + + if (!responseRef.data) { + const notFoundError = notFound(responseRef) + getSiteConfigRefFailCounter.add(1, { + lang, + error_type: "not_found", + error: JSON.stringify({ code: notFoundError.code }), + }) + console.error( + "contentstack.siteConfig.refs not found error", + JSON.stringify({ + query: { + lang, + }, + error: { code: notFoundError.code }, + }) + ) + throw notFoundError + } + + const validatedSiteConfigRef = siteConfigRefSchema.safeParse( + responseRef.data + ) + + if (!validatedSiteConfigRef.success) { + getSiteConfigRefFailCounter.add(1, { + lang, + error_type: "validation_error", + error: JSON.stringify(validatedSiteConfigRef.error), + }) + console.error( + "contentstack.siteConfig.refs validation error", + JSON.stringify({ + query: { + lang, + }, + error: 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() + + getSiteConfigRefSuccessCounter.add(1, { lang }) + console.info( + "contentstack.siteConfig.refs success", + JSON.stringify({ query: { lang } }) + ) + + getSiteConfigCounter.add(1, { lang }) + console.info( + "contentstack.siteConfig start", + JSON.stringify({ query: { lang } }) + ) + const [siteConfigResponse, contactConfig] = await Promise.all([ + request( + GetSiteConfig, + { + locale: lang, + }, + { + key: tags, + ttl: "max", + } + ), + getContactConfig(lang), + ]) + + if (!siteConfigResponse.data) { + const notFoundError = notFound(siteConfigResponse) + + getSiteConfigFailCounter.add(1, { + lang, + error_type: "not_found", + error: JSON.stringify({ code: notFoundError.code }), + }) + + console.error( + "contentstack.siteConfig not found error", + JSON.stringify({ + query: { lang }, + error: { code: notFoundError.code }, + }) + ) + + throw notFoundError + } + + const validatedSiteConfig = siteConfigSchema.safeParse( + siteConfigResponse.data + ) + + if (!validatedSiteConfig.success) { + getSiteConfigFailCounter.add(1, { + lang, + error_type: "validation_error", + error: JSON.stringify(validatedSiteConfig.error), + }) + console.error( + "contentstack.siteConfig validation error", + JSON.stringify({ + query: { lang }, + error: validatedSiteConfig.error, + }) + ) + return null + } + + getSiteConfigSuccessCounter.add(1, { lang }) + console.info( + "contentstack.siteConfig success", + JSON.stringify({ query: { lang } }) + ) + + const { sitewideAlert } = validatedSiteConfig.data + + return { + ...validatedSiteConfig.data, + sitewideAlert: sitewideAlert + ? { + ...sitewideAlert, + phoneContact: contactConfig + ? getAlertPhoneContactData(sitewideAlert, contactConfig) + : null, + } + : null, + } }), })