feat(SW-739): use new allTiers endpoint and add feature flag

This commit is contained in:
Chuma McPhoy
2024-11-08 14:50:18 +01:00
parent 35a527be05
commit 48af26a772
7 changed files with 107 additions and 8 deletions

View File

@@ -91,6 +91,22 @@ export const validateApiTierRewardsSchema = z.record(
)
)
export const validateApiAllTiersSchema = z.record(
z.nativeEnum(TierKey).transform((data) => {
return TierKey[data as unknown as Key]
}),
z.array(
z.object({
id: z.string().optional(),
status: z.string().optional(),
rewardId: z.string().optional(),
rewardTierLevel: z.string().optional(),
rewardType: z.string().optional(),
title: z.string().optional(),
})
)
)
export const validateCmsRewardsSchema = z
.object({
data: z.object({

View File

@@ -1,3 +1,4 @@
import { env } from "@/env/server"
import * as api from "@/lib/api"
import { notFound } from "@/server/errors/trpc"
import {
@@ -22,6 +23,7 @@ import {
getByLevelRewardCounter,
getByLevelRewardFailCounter,
getByLevelRewardSuccessCounter,
getCachedAllTierRewards,
getCmsRewards,
getCurrentRewardCounter,
getCurrentRewardFailCounter,
@@ -36,7 +38,10 @@ export const rewardQueryRouter = router({
.input(rewardsAllInput)
.query(async function ({ input, ctx }) {
getAllRewardCounter.add(1)
const allApiRewards = await getAllCachedApiRewards(ctx.serviceToken)
const allApiRewards = !!env.USE_NEW_REWARDS_ENDPOINT
? await getCachedAllTierRewards(ctx.serviceToken)
: await getAllCachedApiRewards(ctx.serviceToken)
if (!allApiRewards) {
return []
@@ -96,9 +101,9 @@ export const rewardQueryRouter = router({
getByLevelRewardCounter.add(1)
const { level_id } = input
const allUpcomingApiRewards = await getAllCachedApiRewards(
ctx.serviceToken
)
const allUpcomingApiRewards = !!env.USE_NEW_REWARDS_ENDPOINT
? await getCachedAllTierRewards(ctx.serviceToken)
: await getAllCachedApiRewards(ctx.serviceToken)
if (!allUpcomingApiRewards || !allUpcomingApiRewards[level_id]) {
getByLevelRewardFailCounter.add(1)

View File

@@ -11,6 +11,7 @@ import { generateLoyaltyConfigTag } from "@/utils/generateTag"
import {
CmsRewardsResponse,
validateApiAllTiersSchema,
validateApiTierRewardsSchema,
validateCmsRewardsSchema,
} from "./output"
@@ -52,7 +53,8 @@ export function getUniqueRewardIds(rewardIds: string[]) {
}
/**
* Cached for 1 hour.
* Uses profile/v1/Profile/tierRewards.
* Will be removed when new endpoint is out in production.
*/
export const getAllCachedApiRewards = unstable_cache(
async function (token) {
@@ -110,6 +112,68 @@ export const getAllCachedApiRewards = unstable_cache(
{ revalidate: ONE_HOUR }
)
/**
* Cached for 1 hour.
*/
export const getCachedAllTierRewards = unstable_cache(
async function (token) {
const apiResponse = await api.get(
api.endpoints.v1.Profile.Reward.allTiers,
{
headers: {
Authorization: `Bearer ${token}`,
},
}
)
if (!apiResponse.ok) {
const text = await apiResponse.text()
getAllRewardFailCounter.add(1, {
error_type: "http_error",
error: JSON.stringify({
status: apiResponse.status,
statusText: apiResponse.statusText,
text,
}),
})
console.error(
"api.rewards.allTiers error ",
JSON.stringify({
error: {
status: apiResponse.status,
statusText: apiResponse.statusText,
text,
},
})
)
throw apiResponse
}
const data = await apiResponse.json()
const validatedApiAllTierRewards = validateApiAllTiersSchema.safeParse(data)
if (!validatedApiAllTierRewards.success) {
getAllRewardFailCounter.add(1, {
error_type: "validation_error",
error: JSON.stringify(validatedApiAllTierRewards.error),
})
console.error(validatedApiAllTierRewards.error)
console.error(
"api.rewards validation error",
JSON.stringify({
error: validatedApiAllTierRewards.error,
})
)
throw validatedApiAllTierRewards.error
}
return validatedApiAllTierRewards.data
},
["getApiAllTierRewards"],
{ revalidate: ONE_HOUR }
)
export async function getCmsRewards(locale: Lang, rewardIds: string[]) {
const tags = rewardIds.map((id) =>
generateLoyaltyConfigTag(locale, "reward", id)