import { NextRequest, NextResponse } from "next/server" import { AuthError } from "next-auth" import { Lang } from "@/constants/languages" import { env } from "@/env/server" import { badRequest, internalServerError } from "@/server/errors/next" import { signIn } from "@/auth" export async function GET( request: NextRequest, context: { params: { lang: Lang } } ) { const returnUrl = request.headers.get("x-returnurl") // If all else fails, always redirect to startpage const finalDestination = returnUrl || request.headers.get("x-redirect-to") || request.nextUrl.searchParams.get("redirectTo") || request.headers.get("Referer") || "/" let redirectTo = finalDestination if (!returnUrl) { // This is a regular login request, not a seamless login request // We should initiate the seamless login flow try { let redirectUrlValue switch (context.params.lang) { case Lang.da: redirectUrlValue = env.SEAMLESS_LOGIN_DA break case Lang.de: redirectUrlValue = env.SEAMLESS_LOGIN_DE break case Lang.en: redirectUrlValue = env.SEAMLESS_LOGIN_EN break case Lang.fi: redirectUrlValue = env.SEAMLESS_LOGIN_FI break case Lang.no: redirectUrlValue = env.SEAMLESS_LOGIN_NO break case Lang.sv: redirectUrlValue = env.SEAMLESS_LOGIN_SV break } const redirectUrl = new URL(redirectUrlValue) redirectUrl.searchParams.set("returnurl", finalDestination) redirectTo = redirectUrl.toString() } catch (e) { console.error("Unable to create URL for seamless login") console.error(e) return internalServerError() } } try { /** * Passing `redirect: false` to `signIn` will return the URL instead of * automatically redirecting to it inside of `signIn`. * https://github.com/nextauthjs/next-auth/blob/3c035ec/packages/next-auth/src/lib/actions.ts#L76 */ const url = await signIn( "curity", { redirectTo, redirect: false, }, { ui_locales: context.params.lang, } ) if (url) { return NextResponse.redirect(url) } } catch (error) { if (error instanceof AuthError) { console.log({ signInAuthError: error }) } else { console.log({ signInError: error }) } } return badRequest() }