```typescript shouldWrap
// File: app/protected/page.tsx (Supabase)
import { redirect } from 'next/navigation'
import { createClient } from '@/lib/supabase/server'
export default async function PrivatePage() {
const supabase = await createClient()
const { data, error } = await supabase.auth.getUser()
if (error || !data?.user) {
redirect('/login')
}
return Hello {data.user.email}
}
```
```typescript shouldWrap
// File: app/protected/page.tsx (Neon Auth)
import { redirect } from 'next/navigation'
import { stackServerApp } from '@/stack/server';
export default async function PrivatePage() {
const user = await stackServerApp.getUser();
if (!user || !user.id) {
redirect('/handler/login') // Redirect to Neon Auth's built-in login page
}
return Hello {user.primaryEmail}
}
```
#### 4.2. Data fetching and mutations (client-side)
Replace the `supabase` client instance with the new `usePostgrest()` hook for data operations. Notice how the query syntax remains unchanged.