48 lines
1.6 KiB
TypeScript

/* eslint-disable @typescript-eslint/no-explicit-any */
import { redirect } from 'next/navigation'
import { createClient } from '@/lib/supabase/server'
import { createAdminClient } from '@/lib/supabase/server'
import UsersClient from './UsersClient'
export default async function AdminUsersPage() {
const supabase = await createClient()
const db = supabase as any
const { data: { user } } = await supabase.auth.getUser()
if (!user) redirect('/login')
const { data: callerProfile } = await db
.from('profiles')
.select('role')
.eq('id', user.id)
.single()
if (callerProfile?.role !== 'admin') redirect('/dashboard')
// Utilise le client admin pour bypass RLS
const admin = createAdminClient()
const adminDb = admin as any
// Récupérer les données auth via la fonction SECURITY DEFINER (évite listUsers défaillant)
const [authResult, profilesResult] = await Promise.all([
adminDb.rpc('get_all_users_admin'),
adminDb.from('profiles').select('id, username, role, created_at').order('created_at', { ascending: false }),
])
const profileMap = new Map((profilesResult.data ?? []).map((p: any) => [p.id, p]))
const users = (authResult.data ?? []).map((authUser: any) => {
const profile: any = profileMap.get(authUser.id) ?? {}
return {
id: authUser.id,
email: authUser.email ?? '',
username: profile.username ?? authUser.email?.split('@')[0] ?? '—',
role: profile.role ?? 'formateur',
created_at: profile.created_at ?? authUser.created_at,
last_sign_in: authUser.last_sign_in_at ?? null,
}
})
return <UsersClient initialUsers={users} currentUserId={user.id} />
}