From 2886f537ee1817157d0976aa5ec97b5f0621f78f Mon Sep 17 00:00:00 2001 From: Christel Westerberg Date: Wed, 9 Oct 2024 15:20:00 +0200 Subject: [PATCH] fix: wrap tier rewards endpoint in unstable_cache --- server/routers/contentstack/reward/query.ts | 98 +++++++++++---------- 1 file changed, 51 insertions(+), 47 deletions(-) diff --git a/server/routers/contentstack/reward/query.ts b/server/routers/contentstack/reward/query.ts index ea6023fee..f6af86315 100644 --- a/server/routers/contentstack/reward/query.ts +++ b/server/routers/contentstack/reward/query.ts @@ -1,10 +1,10 @@ import { metrics } from "@opentelemetry/api" +import { unstable_cache } from "next/cache" import { Lang } from "@/constants/languages" import * as api from "@/lib/api" import { GetRewards } from "@/lib/graphql/Query/Rewards.graphql" import { request } from "@/lib/graphql/request" -import { Context } from "@/server/context" import { notFound } from "@/server/errors/trpc" import { contentStackBaseWithProtectedProcedure, @@ -62,69 +62,71 @@ const getAllRewardFailCounter = meter.createCounter( "trpc.contentstack.reward.all-fail" ) +const ONE_HOUR = 60 * 60 + function getUniqueRewardIds(rewardIds: string[]) { const uniqueRewardIds = new Set(rewardIds) return Array.from(uniqueRewardIds) } -async function getAllApiRewards(ctx: Context & { serviceToken: string }) { - const apiResponse = await api.get(api.endpoints.v1.tierRewards, { - cache: undefined, // override defaultOptions - headers: { - Authorization: `Bearer ${ctx.serviceToken}`, - }, - // One hour. Since the service token is refreshed every hour, this is the longest cache we can have. - next: { revalidate: 60 * 60 }, - }) - - if (!apiResponse.ok) { - const text = await apiResponse.text() - getCurrentRewardFailCounter.add(1, { - error_type: "http_error", - error: JSON.stringify({ - status: apiResponse.status, - statusText: apiResponse.statusText, - text, - }), +const getAllCachedApiRewards = unstable_cache( + async function (token) { + const apiResponse = await api.get(api.endpoints.v1.tierRewards, { + headers: { + Authorization: `Bearer ${token}`, + }, }) - console.error( - "api.rewards.tierRewards error ", - JSON.stringify({ - error: { + + if (!apiResponse.ok) { + const text = await apiResponse.text() + getCurrentRewardFailCounter.add(1, { + error_type: "http_error", + error: JSON.stringify({ status: apiResponse.status, statusText: apiResponse.statusText, text, - }, + }), }) - ) - } + console.error( + "api.rewards.tierRewards error ", + JSON.stringify({ + error: { + status: apiResponse.status, + statusText: apiResponse.statusText, + text, + }, + }) + ) + } - const data = await apiResponse.json() - const validatedApiTierRewards = validateApiTierRewardsSchema.safeParse(data) + const data = await apiResponse.json() + const validatedApiTierRewards = validateApiTierRewardsSchema.safeParse(data) - if (!validatedApiTierRewards.success) { - getAllRewardFailCounter.add(1, { - error_type: "validation_error", - error: JSON.stringify(validatedApiTierRewards.error), - }) - console.error(validatedApiTierRewards.error) - console.error( - "api.rewards validation error", - JSON.stringify({ - error: validatedApiTierRewards.error, + if (!validatedApiTierRewards.success) { + getAllRewardFailCounter.add(1, { + error_type: "validation_error", + error: JSON.stringify(validatedApiTierRewards.error), }) - ) - return null - } + console.error(validatedApiTierRewards.error) + console.error( + "api.rewards validation error", + JSON.stringify({ + error: validatedApiTierRewards.error, + }) + ) + return null + } - return validatedApiTierRewards.data -} + return validatedApiTierRewards.data + }, + ["getAllApiRewards"], + { revalidate: ONE_HOUR } +) async function getCmsRewards(locale: Lang, rewardIds: string[]) { const tags = rewardIds.map((id) => generateLoyaltyConfigTag(locale, "reward", id) ) - const cmsRewardsResponse = await request( GetRewards, { @@ -266,7 +268,9 @@ export const rewardQueryRouter = router({ getByLevelRewardCounter.add(1) const { level_id } = input - const allUpcomingApiRewards = await getAllApiRewards(ctx) + const allUpcomingApiRewards = await getAllCachedApiRewards( + ctx.serviceToken + ) if (!allUpcomingApiRewards || !allUpcomingApiRewards[level_id]) { getByLevelRewardFailCounter.add(1) @@ -314,7 +318,7 @@ export const rewardQueryRouter = router({ .input(rewardsAllInput) .query(async function ({ input, ctx }) { getAllRewardCounter.add(1) - const allApiRewards = await getAllApiRewards(ctx) + const allApiRewards = await getAllCachedApiRewards(ctx.serviceToken) if (!allApiRewards) { return []