Files
web/apps/scandic-web/lib/trpc/server.ts
Anton Gunnarsson 6eeaa1cd40 Merged in feat/sw-2872-dependency-inject-app-context-in-trpc-package (pull request #2478)
feat(SW-2872) Dependency inject app context in trpc package

* Move appRouter to trpc package

* WIP Move serverClient to trpc package

Doesn't handle errors yet

* Don't use global

* Use trpc everywhere


Approved-by: Linus Flood
2025-07-01 08:49:33 +00:00

91 lines
2.5 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 { 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)
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)}`
console.error(
"Unautorized in webview, redirecting to: ",
redirectUrl
)
console.log(`[serverClient] onError redirecting to: ${redirectUrl}`)
redirect(redirectUrl)
}
const redirectUrl = `${login[lang]}?redirectTo=${encodeURIComponent(`/${lang}/${pathname}`)}`
console.log(`[serverClient] onError redirecting to: ${redirectUrl}`)
redirect(redirectUrl)
}
}
},
})
}