11import { createServerClient } from '@supabase/ssr'
22import { NextResponse , type NextRequest } from 'next/server'
3+ import { isProtectedAppPath } from './lib/auth/app-redirect'
34
45export async function middleware ( request : NextRequest ) {
5- let supabaseResponse = NextResponse . next ( { request } )
6+ const requestHeaders = new Headers ( request . headers )
7+ requestHeaders . set ( 'x-th-pathname' , request . nextUrl . pathname )
8+ requestHeaders . set ( 'x-th-search' , request . nextUrl . search )
9+
10+ let supabaseResponse = NextResponse . next ( {
11+ request : { headers : requestHeaders } ,
12+ } )
613 const supabaseUrl = process . env . NEXT_PUBLIC_SUPABASE_URL
714 const supabaseAnonKey = process . env . NEXT_PUBLIC_SUPABASE_ANON_KEY
815
@@ -20,7 +27,9 @@ export async function middleware(request: NextRequest) {
2027 } ,
2128 setAll ( cookiesToSet ) {
2229 cookiesToSet . forEach ( ( { name, value } ) => request . cookies . set ( name , value ) )
23- supabaseResponse = NextResponse . next ( { request } )
30+ supabaseResponse = NextResponse . next ( {
31+ request : { headers : requestHeaders } ,
32+ } )
2433 cookiesToSet . forEach ( ( { name, value, options } ) =>
2534 supabaseResponse . cookies . set ( name , value , options )
2635 )
@@ -31,7 +40,20 @@ export async function middleware(request: NextRequest) {
3140
3241 // IMPORTANT: getUser() validates JWT and refreshes if needed
3342 // Do NOT use getSession() - it only validates locally
34- await supabase . auth . getUser ( )
43+ const {
44+ data : { user } ,
45+ } = await supabase . auth . getUser ( )
46+
47+ if ( ! user && isProtectedAppPath ( request . nextUrl . pathname ) ) {
48+ const url = new URL ( request . nextUrl . toString ( ) )
49+ url . pathname = '/login'
50+ url . search = ''
51+ url . searchParams . set (
52+ 'redirect' ,
53+ `${ request . nextUrl . pathname } ${ request . nextUrl . search } `
54+ )
55+ return NextResponse . redirect ( url )
56+ }
3557
3658 return supabaseResponse
3759}
0 commit comments