diff --git a/app/api/users/[userId]/route.ts b/app/api/users/[userId]/route.ts index e5273307..7f84ce76 100644 --- a/app/api/users/[userId]/route.ts +++ b/app/api/users/[userId]/route.ts @@ -2,6 +2,46 @@ import { getServerSession } from "next-auth"; import { authOptions } from "@/app/api/auth/[...nextauth]/route"; import { NextResponse } from "next/server"; +// Helper function to delete user from Leantime +async function deleteLeantimeUser(userId: string): Promise<{ success: boolean; error?: string }> { + try { + const response = await fetch('https://agilite.slm-lab.net/api/jsonrpc', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-API-Key': process.env.LEANTIME_TOKEN || '', + }, + body: JSON.stringify({ + method: 'leantime.rpc.Users.Users.deleteUser', + jsonrpc: '2.0', + id: 1, + params: { + id: userId + } + }) + }); + + const data = await response.json(); + console.log('Leantime delete response:', data); + + if (!response.ok || !data.result) { + console.error('Leantime user deletion failed:', data); + return { + success: false, + error: data.error?.message || 'Failed to delete user in Leantime' + }; + } + + return { success: true }; + } catch (error) { + console.error('Error deleting Leantime user:', error); + return { + success: false, + error: 'Error deleting user in Leantime' + }; + } +} + //TODO: Ajouter la suppression automatique du compte Nextcloud export async function DELETE( req: Request, @@ -40,8 +80,28 @@ export async function DELETE( ); } - // Delete user using admin token - const response = await fetch( + // Get user details before deletion to get their username + const userResponse = await fetch( + `${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users/${params.userId}`, + { + headers: { + Authorization: `Bearer ${tokenData.access_token}`, + }, + } + ); + + if (!userResponse.ok) { + console.error("Failed to get user details:", await userResponse.text()); + return NextResponse.json( + { error: "Erreur lors de la récupération des détails de l'utilisateur" }, + { status: userResponse.status } + ); + } + + const userDetails = await userResponse.json(); + + // Delete user from Keycloak + const deleteResponse = await fetch( `${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users/${params.userId}`, { method: "DELETE", @@ -51,20 +111,29 @@ export async function DELETE( } ); - console.log("Delete response:", { - status: response.status, - ok: response.ok + console.log("Keycloak delete response:", { + status: deleteResponse.status, + ok: deleteResponse.ok }); - if (!response.ok) { - const errorText = await response.text(); + if (!deleteResponse.ok) { + const errorText = await deleteResponse.text(); console.error("Delete error:", errorText); return NextResponse.json( { error: "Erreur lors de la suppression", details: errorText }, - { status: response.status } + { status: deleteResponse.status } ); } + // Delete user from Leantime + const leantimeResult = await deleteLeantimeUser(userDetails.username); + + if (!leantimeResult.success) { + console.error("Leantime user deletion failed:", leantimeResult.error); + // We don't return an error here since Keycloak user was deleted successfully + // We just log the error and continue + } + return NextResponse.json({ success: true }); } catch (error) { console.error("Error deleting user:", error); diff --git a/app/api/users/route.ts b/app/api/users/route.ts index 3f8ce4dc..b27dab19 100644 --- a/app/api/users/route.ts +++ b/app/api/users/route.ts @@ -207,8 +207,18 @@ async function createLeantimeUser(userData: { lastName: string; email: string; password: string; + roles: string[]; }): Promise<{ success: boolean; error?: string }> { try { + // Map Keycloak roles to Leantime roles + const getLeantimeRole = (roles: string[]) => { + if (roles.includes('admin')) return 'admin'; + if (roles.includes('teacher')) return 'manager'; + return 'user'; + }; + + const leantimeRole = getLeantimeRole(userData.roles); + const response = await fetch('https://agilite.slm-lab.net/api/jsonrpc', { method: 'POST', headers: { @@ -227,7 +237,17 @@ async function createLeantimeUser(userData: { email: userData.email, password: userData.password, status: 'active', - role: 'user', // Default role in Leantime + role: leantimeRole, + phone: '', + jobTitle: '', + jobLevel: '', + department: '', + clientId: 0, + source: 'keycloak', + pwReset: false, + lastlogin: null, + created: new Date().toISOString(), + modified: new Date().toISOString(), } } }) @@ -417,6 +437,7 @@ export async function POST(req: Request) { lastName: data.lastName, email: data.email, password: data.password, + roles: validRoles, }); if (!leantimeResult.success) {