From a7c9651690a1e18cb626b51d66a8538e30be552c Mon Sep 17 00:00:00 2001 From: Alma Date: Wed, 9 Apr 2025 22:03:18 +0200 Subject: [PATCH] update api users and groups and users 15 --- app/api/users/route.ts | 33 ++++++---- components/groups/groups-table.tsx | 96 +++++++++++++++++++----------- components/users/users-table.tsx | 44 ++++++++------ 3 files changed, 105 insertions(+), 68 deletions(-) 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) {
- +
{groupMembers.length === 0 ? ( -

Aucun membre

+

No members

) : (
{groupMembers.map((member) => (
-

{member.username}

+

{member.lastName} {member.firstName}

{member.email}

- +
{availableUsers.length === 0 ? ( -

Aucun utilisateur disponible

+

No users available

) : (
- {availableUsers.map((user) => ( -
-
-

{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}

+
+
- -
))}
)} diff --git a/components/users/users-table.tsx b/components/users/users-table.tsx index 7f994de6..7de49f53 100644 --- a/components/users/users-table.tsx +++ b/components/users/users-table.tsx @@ -507,12 +507,12 @@ export function UsersTable({ userRole = [] }: UsersTableProps) { - Nom d'utilisateur - Prénom - Nom + Username + First Name + Last Name Email - Date d'inscription - Rôles + Created At + Roles Actions @@ -526,7 +526,15 @@ export function UsersTable({ userRole = [] }: UsersTableProps) { {new Date(user.createdTimestamp).toLocaleDateString()} - {(user.roles || []).join(", ") || "-"} + +
+ {(user.roles || []).map((role) => ( + + {role} + + ))} +
+
@@ -695,34 +703,32 @@ export function UsersTable({ userRole = [] }: UsersTableProps) { }}> - Gérer les rôles de {selectedUser?.username} + Manage roles for {selectedUser?.username}
- -
+ +
{roles.map((role) => (
- { + onCheckedChange={(checked) => { setFormData(prev => ({ ...prev, - roles: e.target.checked + roles: checked ? [...prev.roles, role.name] : prev.roles.filter(r => r !== role.name) })); }} - className="h-4 w-4 text-primary focus:ring-primary" /> - +
))}
@@ -736,10 +742,10 @@ export function UsersTable({ userRole = [] }: UsersTableProps) { setFormData(prev => ({ ...prev, roles: [] })); }} > - Annuler + Cancel