48 lines
1.6 KiB
TypeScript
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} />
|
|
}
|