From 43d3713f5977da72ac8cc4e66a75e5f685480eb9 Mon Sep 17 00:00:00 2001 From: Anton Gunnarsson Date: Wed, 5 Mar 2025 08:17:02 +0000 Subject: [PATCH] Merged in feat/SW-1810-prevent-starting-link-flow-when-linked (pull request #1469) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prevent SAS link flow when already linked * Implement check for checking sas_eb membership when starting link flow Approved-by: Joakim Jäderberg --- apps/scandic-web/actions/editProfile.ts | 4 ++-- .../(sas)/(protected)/sas-x-scandic/link/page.tsx | 9 ++++++--- .../Overview/Stats/ExpiringPoints/index.tsx | 4 ++-- .../DynamicContent/Overview/Stats/Points/index.tsx | 4 ++-- apps/scandic-web/server/routers/booking/mutation.ts | 4 ++-- apps/scandic-web/server/routers/user/output.ts | 11 +++++------ apps/scandic-web/server/routers/user/query.ts | 10 +++++----- apps/scandic-web/utils/user.ts | 10 +++++++++- 8 files changed, 33 insertions(+), 23 deletions(-) diff --git a/apps/scandic-web/actions/editProfile.ts b/apps/scandic-web/actions/editProfile.ts index bcc4c0903..a44f1a4ea 100644 --- a/apps/scandic-web/actions/editProfile.ts +++ b/apps/scandic-web/actions/editProfile.ts @@ -10,7 +10,7 @@ import { protectedServerActionProcedure } from "@/server/trpc" import { editProfileSchema } from "@/components/Forms/Edit/Profile/schema" import { getIntl } from "@/i18n" -import { getMembership } from "@/utils/user" +import { getFriendsMembership } from "@/utils/user" import { phoneValidator } from "@/utils/zod/phoneValidator" import { Status } from "@/types/components/myPages/myProfile/edit" @@ -142,7 +142,7 @@ export const editProfile = protectedServerActionProcedure status: Status.success, } } else { - const membership = getMembership(profile.memberships) + const membership = getFriendsMembership(profile.memberships) console.log( `[edit profile: ${membership?.membershipNumber}] body keys: ${JSON.stringify(Object.keys(body))}` ) diff --git a/apps/scandic-web/app/[lang]/(partner)/(sas)/(protected)/sas-x-scandic/link/page.tsx b/apps/scandic-web/app/[lang]/(partner)/(sas)/(protected)/sas-x-scandic/link/page.tsx index 8dcc01c84..490b72972 100644 --- a/apps/scandic-web/app/[lang]/(partner)/(sas)/(protected)/sas-x-scandic/link/page.tsx +++ b/apps/scandic-web/app/[lang]/(partner)/(sas)/(protected)/sas-x-scandic/link/page.tsx @@ -3,6 +3,8 @@ import React from "react" import { getProfileSafely } from "@/lib/trpc/memoizedRequests" +import { getEurobonusMembership } from "@/utils/user" + import { SASModal } from "../components/SASModal" import { LinkAccountForm } from "./LinkAccountForm" @@ -13,10 +15,11 @@ export default async function SASxScandicLinkPage({ }: PageArgs) { const profile = await getProfileSafely() - // TODO check if already linked - const alreadyLinked = false + if (!profile) return null - if (alreadyLinked) { + const eurobonusMembership = getEurobonusMembership(profile.memberships) + + if (eurobonusMembership) { redirect(`/${params.lang}/sas-x-scandic/error?errorCode=alreadyLinked`) } diff --git a/apps/scandic-web/components/Blocks/DynamicContent/Overview/Stats/ExpiringPoints/index.tsx b/apps/scandic-web/components/Blocks/DynamicContent/Overview/Stats/ExpiringPoints/index.tsx index fd57b45fa..46b5dbeea 100644 --- a/apps/scandic-web/components/Blocks/DynamicContent/Overview/Stats/ExpiringPoints/index.tsx +++ b/apps/scandic-web/components/Blocks/DynamicContent/Overview/Stats/ExpiringPoints/index.tsx @@ -4,13 +4,13 @@ import { dt } from "@/lib/dt" import Body from "@/components/TempDesignSystem/Text/Body" import { getIntl } from "@/i18n" import { getLang } from "@/i18n/serverContext" -import { getMembership } from "@/utils/user" +import { getFriendsMembership } from "@/utils/user" import type { UserProps } from "@/types/components/myPages/user" export default async function ExpiringPoints({ user }: UserProps) { const intl = await getIntl() - const membership = getMembership(user.memberships) + const membership = getFriendsMembership(user.memberships) if (!membership || !membership.pointsToExpire) { // TODO: handle this case? diff --git a/apps/scandic-web/components/Blocks/DynamicContent/Overview/Stats/Points/index.tsx b/apps/scandic-web/components/Blocks/DynamicContent/Overview/Stats/Points/index.tsx index 364b3d064..545442c8f 100644 --- a/apps/scandic-web/components/Blocks/DynamicContent/Overview/Stats/Points/index.tsx +++ b/apps/scandic-web/components/Blocks/DynamicContent/Overview/Stats/Points/index.tsx @@ -2,7 +2,7 @@ import { MembershipLevelEnum } from "@/constants/membershipLevels" import { serverClient } from "@/lib/trpc/server" import { getIntl } from "@/i18n" -import { getMembership } from "@/utils/user" +import { getFriendsMembership } from "@/utils/user" import PointsContainer from "./Container" import { PointsColumn } from "./PointsColumn" @@ -12,7 +12,7 @@ import type { UserProps } from "@/types/components/myPages/user" export default async function Points({ user }: UserProps) { const intl = await getIntl() - const membership = getMembership(user.memberships) + const membership = getFriendsMembership(user.memberships) const nextLevel = membership?.nextLevel && MembershipLevelEnum[membership.nextLevel] diff --git a/apps/scandic-web/server/routers/booking/mutation.ts b/apps/scandic-web/server/routers/booking/mutation.ts index 73e82348e..137d1c74d 100644 --- a/apps/scandic-web/server/routers/booking/mutation.ts +++ b/apps/scandic-web/server/routers/booking/mutation.ts @@ -4,7 +4,7 @@ import * as api from "@/lib/api" import { getVerifiedUser } from "@/server/routers/user/query" import { router, safeProtectedServiceProcedure } from "@/server/trpc" -import { getMembership } from "@/utils/user" +import { getFriendsMembership } from "@/utils/user" import { addPackageInput, @@ -67,7 +67,7 @@ async function getMembershipNumber( return undefined } - const membership = getMembership(verifiedUser.data.memberships) + const membership = getFriendsMembership(verifiedUser.data.memberships) return membership?.membershipNumber } diff --git a/apps/scandic-web/server/routers/user/output.ts b/apps/scandic-web/server/routers/user/output.ts index 07636b899..838736bb9 100644 --- a/apps/scandic-web/server/routers/user/output.ts +++ b/apps/scandic-web/server/routers/user/output.ts @@ -2,7 +2,7 @@ import { z } from "zod" import { countriesMap } from "@/constants/countries" -import { getMembership, scandicMemberships } from "@/utils/user" +import { getFriendsMembership, scandicMemberships } from "@/utils/user" import { imageSchema } from "../hotels/schemas/image" @@ -18,11 +18,10 @@ const commonMembershipSchema = z.object({ tierExpirationDate: z.string().optional(), }) +const toLowerCaseString = z.string().transform((s) => s.toLowerCase()) const membershipType = (membershipType: scandicMemberships) => - z - .string() + toLowerCaseString // The memberships enum is in lower case so this makes sure it will match regardless of casing in the API response. - .transform((s) => s.toLowerCase()) .pipe(z.literal(membershipType)) const friendsMembershipSchema = z @@ -35,7 +34,7 @@ const friendsMembershipSchema = z const otherMembershipSchema = z .object({ - membershipType: z.string(), + membershipType: toLowerCaseString, membershipNumber: z.string().optional(), memberSince: z.string().optional(), }) @@ -75,7 +74,7 @@ export const getUserSchema = z .transform((apiResponse) => { return { ...apiResponse.data.attributes, - membership: getMembership(apiResponse.data.attributes.memberships), + membership: getFriendsMembership(apiResponse.data.attributes.memberships), name: `${apiResponse.data.attributes.firstName} ${apiResponse.data.attributes.lastName}`, } }) diff --git a/apps/scandic-web/server/routers/user/query.ts b/apps/scandic-web/server/routers/user/query.ts index 1db4ed0ba..95d9e03c2 100644 --- a/apps/scandic-web/server/routers/user/query.ts +++ b/apps/scandic-web/server/routers/user/query.ts @@ -11,7 +11,7 @@ import { import { cache } from "@/utils/cache" import * as maskValue from "@/utils/maskValue" -import { getMembership, getMembershipCards } from "@/utils/user" +import { getFriendsMembership, getMembershipCards } from "@/utils/user" import { friendTransactionsInput, @@ -184,7 +184,7 @@ export function parsedUser(data: User, isMFA: boolean) { firstName: data.firstName, language: data.language, lastName: data.lastName, - membership: getMembership(data.memberships), + membership: getFriendsMembership(data.memberships), memberships: data.memberships, name: `${data.firstName} ${data.lastName}`, phoneNumber: data.phoneNumber, @@ -341,7 +341,7 @@ export const userQueryRouter = router({ return null } - const membershipLevel = getMembership(verifiedData.data.memberships) + const membershipLevel = getFriendsMembership(verifiedData.data.memberships) return membershipLevel }), safeMembershipLevel: safeProtectedProcedure.query(async function ({ ctx }) { @@ -354,7 +354,7 @@ export const userQueryRouter = router({ return null } - const membershipLevel = getMembership(verifiedData.data.memberships) + const membershipLevel = getFriendsMembership(verifiedData.data.memberships) return membershipLevel }), userTrackingInfo: safeProtectedProcedure.query(async function ({ ctx }) { @@ -425,7 +425,7 @@ export const userQueryRouter = router({ getPreviousStaysSuccessCounter.add(1) console.info("api.booking.stays.past success", JSON.stringify({})) - const membership = getMembership(verifiedUserData.data.memberships) + const membership = getFriendsMembership(verifiedUserData.data.memberships) const loggedInUserTrackingData: TrackingSDKUserData = { loginStatus: "logged in", diff --git a/apps/scandic-web/utils/user.ts b/apps/scandic-web/utils/user.ts index 270cb0a0d..c837ab366 100644 --- a/apps/scandic-web/utils/user.ts +++ b/apps/scandic-web/utils/user.ts @@ -11,9 +11,10 @@ import type { getMembershipCardsSchema } from "@/server/routers/user/output" export enum scandicMemberships { guestpr = "guestpr", scandicfriends = "scandicfriend's", + sas_eb = "sas_eb", } -export function getMembership(memberships: Memberships) { +export function getFriendsMembership(memberships: Memberships) { return memberships?.find( (membership) => membership.membershipType.toLowerCase() === scandicMemberships.guestpr @@ -28,6 +29,13 @@ export type FriendsMembership = Omit< nextLevel: MembershipLevel } +export function getEurobonusMembership(memberships: Memberships) { + return memberships?.find( + (membership) => + membership.membershipType.toLowerCase() === scandicMemberships.sas_eb + ) +} + export function getMembershipCards( memberships: z.infer ) {