This commit is contained in:
alma 2026-01-11 21:38:48 +01:00
parent 35b8d707d3
commit 17cb689753

View File

@ -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,