diff --git a/apps/scandic-web/constants/membershipLevels.ts b/apps/scandic-web/constants/membershipLevels.ts index 8883c7bf3..e238bbd2e 100644 --- a/apps/scandic-web/constants/membershipLevels.ts +++ b/apps/scandic-web/constants/membershipLevels.ts @@ -1,5 +1,15 @@ import type { EurobonusTier } from "@/types/user" +export const FriendsMembershipLevels = [ + "L1", + "L2", + "L3", + "L4", + "L5", + "L6", + "L7", +] as const + export enum membershipLevels { L1 = 1, L2 = 2, diff --git a/apps/scandic-web/server/routers/partners/sas/performLevelUpgrade.ts b/apps/scandic-web/server/routers/partners/sas/performLevelUpgrade.ts index fea75fb27..128fe56c2 100644 --- a/apps/scandic-web/server/routers/partners/sas/performLevelUpgrade.ts +++ b/apps/scandic-web/server/routers/partners/sas/performLevelUpgrade.ts @@ -2,10 +2,14 @@ import * as Sentry from "@sentry/nextjs" import { cookies } from "next/headers" import { z } from "zod" +import { FriendsMembershipLevels } from "@/constants/membershipLevels" import * as api from "@/lib/api" import { protectedProcedure } from "@/server/trpc" import { getUserSchema } from "../../user/output" +import { getVerifiedUser } from "../../user/utils" + +import type { FriendsTier } from "@/types/user" const matchedSchema = z.object({ tierMatchState: z.enum(["matched"]), @@ -26,6 +30,12 @@ export const performLevelUpgrade = protectedProcedure return { tierMatchState: "cached" } } + const profile = await getVerifiedUser({ session: ctx.session }) + if (!profile || "error" in profile || !profile.data.membership) { + return { tierMatchState: "error" } + } + const currentLevel = profile.data.membership.membershipLevel + console.log("[SAS] tier match started") const apiResponse = await api.post(api.endpoints.v1.Profile.matchTier, { @@ -43,8 +53,8 @@ export const performLevelUpgrade = protectedProcedure httpOnly: true, }) - const boosted = apiResponse.status === 200 - if (boosted) { + const updated = apiResponse.status === 200 + if (updated) { console.log("[SAS] tier match complete - boosted") const result = await apiResponse.json() const user = getUserSchema.parse(result) @@ -57,8 +67,12 @@ export const performLevelUpgrade = protectedProcedure return { tierMatchState: "error" } } - const afterLevel = user.membership.membershipLevel - return { tierMatchState: "matched", toLevel: afterLevel } + const newLevel = user.membership.membershipLevel + + if (isHigherLevel(newLevel, currentLevel)) { + return { tierMatchState: "matched", toLevel: newLevel } + } + return { tierMatchState: "alreadyMatched" } } const matchedNoChange = apiResponse.status === 204 @@ -81,3 +95,12 @@ export const performLevelUpgrade = protectedProcedure Sentry.captureException(new Error(tierMatchErrorMessage)) return { tierMatchState: "error" } }) + +function isHigherLevel( + newLevel: FriendsTier, + currentLevel: FriendsTier +): boolean { + const currentIndex = FriendsMembershipLevels.indexOf(currentLevel) + const newIndex = FriendsMembershipLevels.indexOf(newLevel) + return newIndex > currentIndex +} diff --git a/apps/scandic-web/types/user.ts b/apps/scandic-web/types/user.ts index 052db1a5b..be06d7118 100644 --- a/apps/scandic-web/types/user.ts +++ b/apps/scandic-web/types/user.ts @@ -29,3 +29,4 @@ export type EurobonusMembership = z.output export type FriendsMembership = ReturnType export type EurobonusTier = EurobonusMembership["tier"] +export type FriendsTier = NativeFriendsMembership["tier"]