diff --git a/apps/partner-sas/auth.ts b/apps/partner-sas/auth.ts index 023595d5b..fc23d7980 100644 --- a/apps/partner-sas/auth.ts +++ b/apps/partner-sas/auth.ts @@ -79,6 +79,7 @@ const config: NextAuthConfig = { } : undefined, token: { + loginType: "sas", access_token: token.access_token, expires_at: token.expires_at, error: token.error, diff --git a/apps/partner-sas/components/Header/Header.tsx b/apps/partner-sas/components/Header/Header.tsx index 5fbc37105..dd3862859 100644 --- a/apps/partner-sas/components/Header/Header.tsx +++ b/apps/partner-sas/components/Header/Header.tsx @@ -6,6 +6,7 @@ import Image from "@scandic-hotels/design-system/Image" import Link from "@scandic-hotels/design-system/Link" import SkeletonShimmer from "@scandic-hotels/design-system/SkeletonShimmer" import { Typography } from "@scandic-hotels/design-system/Typography" +import { trpc } from "@scandic-hotels/trpc/client" import useLang from "@/hooks/useLang" @@ -17,6 +18,14 @@ export function Header() { const lang = useLang() const session = useSession() + const { + data: profileData, + isLoading, + isSuccess, + } = trpc.partner.sas.getEuroBonusProfile.useQuery(undefined, { + enabled: session.status === "authenticated", + }) + return ( <>
@@ -45,6 +54,15 @@ export function Header() { {session.data?.user && <>{session.data.user.email}} + {isLoading && } + {isSuccess && profileData && ( + + + {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */} + {profileData.points.total} Points + + + )} {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */} {"Logout"} diff --git a/apps/partner-sas/lib/trpc.ts b/apps/partner-sas/lib/trpc.ts index eada8f0fe..43570b570 100644 --- a/apps/partner-sas/lib/trpc.ts +++ b/apps/partner-sas/lib/trpc.ts @@ -6,6 +6,8 @@ import { configureServerClient, } from "@scandic-hotels/trpc/serverClient" +import { auth } from "@/auth" + import type { Lang } from "@scandic-hotels/common/constants/language" export async function createAppContext() { @@ -18,7 +20,8 @@ export async function createAppContext() { url: headersList.get("x-url")!, contentType: headersList.get("x-contenttype")!, auth: async () => { - return null + const session = await auth() + return session }, }) diff --git a/packages/trpc/env/server.ts b/packages/trpc/env/server.ts index 3cc5aef23..9bf661a3f 100644 --- a/packages/trpc/env/server.ts +++ b/packages/trpc/env/server.ts @@ -13,10 +13,10 @@ export const env = createEnv({ server: { API_BASEURL: z.string(), BOOKING_ENCRYPTION_KEY: z.string(), - SAS_API_ENDPOINT: z.string().default(""), - SAS_AUTH_ENDPOINT: z.string().default(""), - SAS_OCP_APIM: z.string().default(""), - SAS_AUTH_CLIENTID: z.string().default(""), + SAS_API_ENDPOINT: z.string(), + SAS_AUTH_ENDPOINT: z.string(), + SAS_OCP_APIM: z.string(), + SAS_AUTH_CLIENTID: z.string(), CACHE_TIME_HOTELS: z.coerce .number() .default(TWENTYFOUR_HOURS) diff --git a/packages/trpc/lib/routers/partners/sas/getEuroBonusProfile.ts b/packages/trpc/lib/routers/partners/sas/getEuroBonusProfile.ts new file mode 100644 index 000000000..dddec3eb9 --- /dev/null +++ b/packages/trpc/lib/routers/partners/sas/getEuroBonusProfile.ts @@ -0,0 +1,61 @@ +import { z } from "zod" + +import { createLogger } from "@scandic-hotels/common/logger/createLogger" + +import { env } from "../../../../env/server" +import { protectedProcedure } from "../../../procedures" + +const outputSchema = z.object({ + eurobonusNumber: z.string(), + linkStatus: z.enum(["UNLINKED", "LINKED"]), + isBlocked: z.boolean(), + enrollmentDate: z.string(), + birthdate: z.string(), + mobileNumber: z.string(), + email: z.string().email(), + points: z.object({ + balances: z.array(z.unknown()), + total: z.number(), + }), + tier: z.string(), + tierStartDate: z.string(), + tierEndDate: z.string().nullable(), + lifeTimeGold: z.boolean(), + tierBoostRequestedByScandic: z.boolean(), + firstName: z.string(), + lastName: z.string(), + whoBoosted: z.enum(["NO-BOOST", "BOOSTED"]), +}) + +const sasLogger = createLogger("SAS") +const url = new URL("/api/scandic-partnership/v1/profile", env.SAS_API_ENDPOINT) + +export const getEuroBonusProfile = protectedProcedure + .output(outputSchema) + .query(async function ({ ctx }) { + if (ctx.session.token.loginType !== "sas") { + throw new Error( + `Failed to fetch EuroBonus profile, expected loginType to be "sas" but was ${ctx.session.token.loginType}` + ) + } + + const response = await fetch(url, { + headers: { + "Content-Type": "application/json", + "Ocp-Apim-Subscription-Key": env.SAS_OCP_APIM, + Authorization: `Bearer ${ctx.session?.token?.access_token}`, + }, + }) + + if (!response.ok) { + sasLogger.error( + `Failed to get EuroBonus profile, status: ${response.status}, statusText: ${response.statusText}` + ) + throw new Error("Failed to fetch EuroBonus profile", { + cause: { status: response.status, statusText: response.statusText }, + }) + } + + const data = await response.json() + return data + }) diff --git a/packages/trpc/lib/routers/partners/sas/index.ts b/packages/trpc/lib/routers/partners/sas/index.ts index 2bd2b2283..ce596c2f1 100644 --- a/packages/trpc/lib/routers/partners/sas/index.ts +++ b/packages/trpc/lib/routers/partners/sas/index.ts @@ -1,6 +1,7 @@ import { router } from "../../.." import { requestOtp } from "./otp/request/requestOtp" import { verifyOtp } from "./otp/verify/verifyOtp" +import { getEuroBonusProfile } from "./getEuroBonusProfile" import { linkAccount } from "./linkAccount" import { performLevelUpgrade } from "./performLevelUpgrade" import { transferPoints } from "./transferPoints" @@ -13,4 +14,5 @@ export const sasRouter = router({ unlinkAccount, performLevelUpgrade, transferPoints, + getEuroBonusProfile, })