diff --git a/app/api/users/route.ts b/app/api/users/route.ts index c56a6f13..8db098b2 100644 --- a/app/api/users/route.ts +++ b/app/api/users/route.ts @@ -75,11 +75,11 @@ export async function GET() { console.log("Filtered users count:", filteredUsers.length); - // Fetch groups for each user - const usersWithGroups = await Promise.all(filteredUsers.map(async (user: any) => { + // Fetch roles for each user + const usersWithRoles = await Promise.all(filteredUsers.map(async (user: any) => { try { - const groupsResponse = await fetch( - `${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users/${user.id}/groups`, + const rolesResponse = await fetch( + `${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users/${user.id}/role-mappings/realm`, { headers: { Authorization: `Bearer ${tokenData.access_token}`, @@ -88,11 +88,16 @@ export async function GET() { } ); - let groups = []; - if (groupsResponse.ok) { - const groupsData = await groupsResponse.json(); - groups = groupsData.map((group: any) => group.name); - console.log(`Groups for user ${user.username}:`, groups); + let roles = []; + if (rolesResponse.ok) { + const rolesData = await rolesResponse.json(); + roles = rolesData + .filter((role: any) => + !role.name.startsWith('default-roles-') && + !['offline_access', 'uma_authorization'].includes(role.name) + ) + .map((role: any) => role.name); + console.log(`Roles for user ${user.username}:`, roles); } return { @@ -102,10 +107,11 @@ export async function GET() { lastName: user.lastName || '', email: user.email, createdTimestamp: user.createdTimestamp, - roles: groups, + enabled: user.enabled, + roles: roles, }; } catch (error) { - console.error(`Error fetching groups for user ${user.id}:`, error); + console.error(`Error fetching roles for user ${user.id}:`, error); return { id: user.id, username: user.username, @@ -113,17 +119,18 @@ export async function GET() { lastName: user.lastName || '', email: user.email, createdTimestamp: user.createdTimestamp, + enabled: user.enabled, roles: [], }; } })); - console.log("Final users data:", usersWithGroups.map(u => ({ + console.log("Final users data:", usersWithRoles.map(u => ({ username: u.username, roles: u.roles, }))); - return NextResponse.json(usersWithGroups); + return NextResponse.json(usersWithRoles); } catch (error) { console.error("Error:", error); diff --git a/components/groups/groups-table.tsx b/components/groups/groups-table.tsx index 02fc4b98..5c66418d 100644 --- a/components/groups/groups-table.tsx +++ b/components/groups/groups-table.tsx @@ -41,6 +41,8 @@ interface User { id: string; username: string; email: string; + lastName: string; + firstName: string; } interface ApiError { @@ -249,22 +251,32 @@ export function GroupsTable({ userRole = [] }: GroupsTableProps) { body: JSON.stringify({ userId }), }); - if (!response.ok) throw new Error("Failed to add member"); + if (!response.ok) { + throw new Error("Failed to add member"); + } - const user = availableUsers.find(u => u.id === userId); - if (user) { - setGroupMembers(prev => [...prev, user]); + // Update the members list + const updatedMember = availableUsers.find(u => u.id === userId); + if (updatedMember) { + setGroupMembers(prev => [...prev, updatedMember]); setAvailableUsers(prev => prev.filter(u => u.id !== userId)); } + // Update the group's member count in the table + setGroups(prev => prev.map(group => + group.id === selectedGroup.id + ? { ...group, membersCount: group.membersCount + 1 } + : group + )); + toast({ - title: "Succès", - description: "Membre ajouté avec succès", + title: "Success", + description: "Member added successfully", }); } catch (error) { toast({ - title: "Erreur", - description: "Erreur lors de l'ajout du membre", + title: "Error", + description: error instanceof Error ? error.message : "An error occurred", variant: "destructive", }); } @@ -278,22 +290,32 @@ export function GroupsTable({ userRole = [] }: GroupsTableProps) { method: "DELETE", }); - if (!response.ok) throw new Error("Failed to remove member"); - - const user = groupMembers.find(u => u.id === userId); - if (user) { - setAvailableUsers(prev => [...prev, user]); - setGroupMembers(prev => prev.filter(u => u.id !== userId)); + if (!response.ok) { + throw new Error("Failed to remove member"); } + // Update the members list + const removedMember = groupMembers.find(u => u.id === userId); + if (removedMember) { + setGroupMembers(prev => prev.filter(u => u.id !== userId)); + setAvailableUsers(prev => [...prev, removedMember]); + } + + // Update the group's member count in the table + setGroups(prev => prev.map(group => + group.id === selectedGroup.id + ? { ...group, membersCount: Math.max(0, group.membersCount - 1) } + : group + )); + toast({ - title: "Succès", - description: "Membre retiré avec succès", + title: "Success", + description: "Member removed successfully", }); } catch (error) { toast({ - title: "Erreur", - description: "Erreur lors du retrait du membre", + title: "Error", + description: error instanceof Error ? error.message : "An error occurred", variant: "destructive", }); } @@ -439,16 +461,16 @@ export function GroupsTable({ userRole = [] }: GroupsTableProps) {
Aucun membre
+No members
) : ({member.username}
+{member.lastName} {member.firstName}
{member.email}
Aucun utilisateur disponible
+No users available
) : ({user.username}
-{user.email}
+ {availableUsers + .sort((a, b) => (a.lastName + a.firstName).localeCompare(b.lastName + b.firstName)) + .map((user) => ( +{user.lastName} {user.firstName}
+{user.email}
+