Files
web/apps/scandic-web/lib/trpc/server.ts
Joakim Jäderberg 3b3e7308cc Merged in feat/SW-3549-pass-scandic-token (pull request #2989)
Feat/SW-3549 pass scandic token

* WIP pass scandic token

* pass scandic token when booking

* Merge branch 'master' of bitbucket.org:scandic-swap/web into feat/SW-3549-pass-scandic-token

* pass user token when doing availability search

* undo changes

* merge

* Merged in fix/sw-3551-rsc-bookingflowconfig (pull request #2988)

fix(SW-3551): Fix issue with BookingConfigProvider in RSC

* wip move config to pages

* Move config providing to pages

* Merged in fix/update-promo-error-modal-text (pull request #2990)

fix: update promo error modal text

* fix: update promo error modal text


Approved-by: Emma Zettervall

* Merged in fix/sw-3514-missing-membership-input-for-multiroom (pull request #2991)

fix(SW-3514): Show join Scandic Friends card for SAS multiroom

* Show join card for room 2+


Approved-by: Hrishikesh Vaipurkar

* Merged in feat/lokalise-rebuild (pull request #2993)

Feat/lokalise rebuild

* chore(lokalise): update translation ids

* chore(lokalise): easier to switch between projects

* chore(lokalise): update translation ids

* .

* .

* .

* .

* .

* .

* chore(lokalise): update translation ids

* chore(lokalise): update translation ids

* .

* .

* .

* chore(lokalise): update translation ids

* chore(lokalise): update translation ids

* .

* .

* chore(lokalise): update translation ids

* chore(lokalise): update translation ids

* chore(lokalise): new translations

* merge

* switch to errors for missing id's

* merge

* sync translations


Approved-by: Linus Flood

* Merged in feat/SW-3552-logout-from-social-session-when- (pull request #2994)

feat(SW-3552): Removed scandic session on logout

Approved-by: Joakim Jäderberg

* merge

* replace getRedemptionTokenSafely() with context based instead

* Refactor user verification and error handling across multiple components; implement safeTry utility for safer async calls

* Refactor user verification and error handling across multiple components; implement safeTry utility for safer async calls

* merge

* Merge branch 'master' of bitbucket.org:scandic-swap/web into feat/SW-3549-pass-scandic-token

* add booking scope

remove unused getMembershipNumber()


Approved-by: Anton Gunnarsson
Approved-by: Hrishikesh Vaipurkar
2025-10-24 13:17:02 +00:00

130 lines
3.6 KiB
TypeScript

import { TRPCError } from "@trpc/server"
import { cookies, headers } from "next/headers"
import { redirect } from "next/navigation"
import { Lang } from "@scandic-hotels/common/constants/language"
import { login } from "@scandic-hotels/common/constants/routes/handleAuth"
import { createLogger } from "@scandic-hotels/common/logger/createLogger"
import { createContext } from "@scandic-hotels/trpc/context"
import { getVerifiedUser } from "@scandic-hotels/trpc/routers/user/utils/getVerifiedUser"
import {
appServerClient,
configureServerClient,
} from "@scandic-hotels/trpc/serverClient"
import { webviews } from "@/constants/routes/webviews"
import { auth } from "@/auth"
import type { Session } from "next-auth"
export async function createAppContext() {
const headersList = await headers()
const cookie = await cookies()
const webviewTokenCookie = cookie.get("webviewToken")
const loginType = headersList.get("loginType")
async function getUserSession(): Promise<Session | null> {
const session = await auth()
const webToken = webviewTokenCookie?.value
if (!session?.token && !webToken) {
return null
}
return (
session ||
({
token: { access_token: webToken, loginType },
} as Session)
)
}
const ctx = createContext({
app: "scandic-web",
lang: headersList.get("x-lang") as Lang,
pathname: headersList.get("x-pathname")!,
uid: headersList.get("x-uid"),
url: headersList.get("x-url")!,
webToken: webviewTokenCookie?.value,
contentType: headersList.get("x-contenttype")!,
auth: async () => await getUserSession(),
getScandicUserToken: async () => {
const session = await getUserSession()
return session?.token?.access_token ?? null
},
getUserPointsBalance: async () => {
const session = await getUserSession()
if (!session) return null
const user = await getVerifiedUser({
token: {
expires_at: session.token.expires_at ?? 0,
access_token: session.token.access_token,
},
})
if (!user) {
return null
}
return user.membership?.currentPoints ?? 0
},
getScandicUser: async () => {
const session = await getUserSession()
if (!session) return null
return await getVerifiedUser({
token: {
expires_at: session.token.expires_at ?? 0,
access_token: session.token.access_token,
},
})
},
})
return ctx
}
configureServerClient(createAppContext)
const serverClientLogger = createLogger("serverClient")
export async function serverClient() {
const ctx = await createAppContext()
return appServerClient(ctx, {
onError: ({ ctx, error }) => {
if (error instanceof TRPCError) {
if (error.code === "UNAUTHORIZED") {
let lang = Lang.en
let pathname = "/"
let fullUrl = "/"
if (ctx) {
lang = ctx.lang
pathname = ctx.pathname
fullUrl = ctx.url
}
const fullPathname = new URL(fullUrl).pathname
if (webviews.includes(fullPathname)) {
const redirectUrl = `/${lang}/webview/refresh?returnurl=${encodeURIComponent(fullPathname)}`
serverClientLogger.debug(
"Unautorized in webview, redirecting to: ",
redirectUrl
)
redirect(redirectUrl)
}
const redirectUrl = `${login[lang]}?redirectTo=${encodeURIComponent(`/${lang}/${pathname}`)}`
serverClientLogger.debug(
`[serverClient] onError redirecting to: ${redirectUrl}`
)
redirect(redirectUrl)
}
}
},
})
}