import type { Route } from './+types/route' import { redirect } from 'react-router' import { createAuth, type User } from '@repo/auth/auth' import { requestIdContext, cloudflareContext } from '@repo/auth/context' import { createSessionStorage } from '@repo/auth/session' export async function loader({ request, context }: Route.LoaderArgs) { const url = new URL(request.url) const cloudflare = context.get(cloudflareContext) const requestId = context.get(requestIdContext) const sessionStorage = createSessionStorage(cloudflare.env) const session = await sessionStorage.getSession(request.headers.get('cookie')) const user = session.get('user') const returnTo = (session.get('returnTo') as string | undefined) ?? '/' if (user) { return redirect(returnTo) } try { const authenticator = createAuth(cloudflare.env, `${url.origin}/login`) const authenticatedUser = (await authenticator.authenticate( 'oidc', request )) as User session.set('user', authenticatedUser) session.unset('returnTo') console.log(`[${requestId}] Redirecting the user to ${returnTo}`) // Redirect to the home page after successful login return redirect(returnTo, { headers: { 'Set-Cookie': await sessionStorage.commitSession(session) } }) } catch (error) { console.error(`[${requestId}]`, error) if (error instanceof Error) { return Response.json( { error: error.message }, { status: 400, headers: { 'Content-Type': 'application/json; utf-8' } } ) } // Re-throw any other errors (including redirects) throw error } }