Files
web/apps/scandic-web/lib/trpc/server.ts
Joakim Jäderberg daf765f3d5 Merged in feature/wrap-logging (pull request #2511)
Feature/wrap logging

* feat: change all logging to go through our own logger function so that we can control log levels

* move packages/trpc to using our own logger

* merge


Approved-by: Linus Flood
2025-07-03 12:37:04 +00:00

94 lines
2.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 { createLogger } from "@scandic-hotels/common/logger/createLogger"
import { createContext } from "@scandic-hotels/trpc/context"
import {
appServerClient,
configureServerClient,
} from "@scandic-hotels/trpc/serverClient"
import { login } from "@/constants/routes/handleAuth"
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")
const ctx = createContext({
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 () => {
const session = await auth()
const webToken = webviewTokenCookie?.value
if (!session?.token && !webToken) {
return null
}
return (
session ||
({
token: { access_token: webToken, loginType },
} as Session)
)
},
})
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.error(
"Unautorized in webview, redirecting to: ",
redirectUrl
)
redirect(redirectUrl)
}
const redirectUrl = `${login[lang]}?redirectTo=${encodeURIComponent(`/${lang}/${pathname}`)}`
serverClientLogger.error(
`[serverClient] onError redirecting to: ${redirectUrl}`
)
redirect(redirectUrl)
}
}
},
})
}