From 17cb689753c7a9184e10722f8bfa9fc2ab8355dd Mon Sep 17 00:00:00 2001 From: alma Date: Sun, 11 Jan 2026 21:38:48 +0100 Subject: [PATCH] Groups --- app/api/groups/route.ts | 68 +++++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 12 deletions(-) diff --git a/app/api/groups/route.ts b/app/api/groups/route.ts index 4f7e88d..24d0382 100644 --- a/app/api/groups/route.ts +++ b/app/api/groups/route.ts @@ -83,27 +83,71 @@ export async function GET() { const groupsWithCounts = await Promise.all( groups.map(async (group: any) => { try { - const countResponse = await fetch( - `${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/groups/${group.id}/members/count`, - { - headers: { - Authorization: `Bearer ${token}`, - }, - } - ); + // Récupérer tous les membres du groupe avec pagination pour gérer les grands groupes + // L'endpoint /members/count ne fonctionne pas correctement, on récupère donc la liste + let totalCount = 0; + let first = 0; + const max = 100; // Taille de page pour la pagination + let hasMore = true; - let count = 0; - if (countResponse.ok) { - count = await countResponse.json(); + while (hasMore) { + const membersResponse = await fetch( + `${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/groups/${group.id}/members?briefRepresentation=true&first=${first}&max=${max}`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + + if (membersResponse.ok) { + const members = await membersResponse.json(); + const membersArray = Array.isArray(members) ? members : []; + totalCount += membersArray.length; + + // Si on a récupéré moins que max, on a tout récupéré + if (membersArray.length < max) { + hasMore = false; + } else { + first += max; + } + } else { + // Si l'endpoint échoue, essayer l'endpoint count en fallback + try { + const countResponse = await fetch( + `${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/groups/${group.id}/members/count`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + if (countResponse.ok) { + totalCount = await countResponse.json(); + } + } catch (countError) { + logger.debug('Failed to get member count for group', { + groupId: group.id, + groupName: group.name + }); + } + hasMore = false; + } } return { id: group.id, name: group.name, path: group.path, - membersCount: count, + membersCount: totalCount, }; } catch (error) { + logger.error('Error getting group members count', { + groupId: group.id, + groupName: group.name, + error: error instanceof Error ? error.message : String(error) + }); + return { id: group.id, name: group.name,