update api users and groups and users 8

This commit is contained in:
Alma 2025-04-09 21:12:54 +02:00
parent 5ff393d6ca
commit 198b2abe4b
2 changed files with 56 additions and 56 deletions

View File

@ -13,7 +13,7 @@ export async function PUT(
} }
try { try {
const { password } = await req.json(); const { password, temporary = true } = await req.json();
// Get client credentials token // Get client credentials token
const tokenResponse = await fetch( const tokenResponse = await fetch(
@ -38,7 +38,7 @@ export async function PUT(
return NextResponse.json({ error: "Failed to get token" }, { status: 500 }); return NextResponse.json({ error: "Failed to get token" }, { status: 500 });
} }
// Reset password // Reset password with temporary flag
const passwordResponse = await fetch( const passwordResponse = await fetch(
`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users/${params.userId}/reset-password`, `${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users/${params.userId}/reset-password`,
{ {
@ -50,7 +50,7 @@ export async function PUT(
body: JSON.stringify({ body: JSON.stringify({
type: "password", type: "password",
value: password, value: password,
temporary: false, temporary: temporary,
}), }),
} }
); );
@ -61,7 +61,10 @@ export async function PUT(
return NextResponse.json({ error: "Failed to reset password" }, { status: passwordResponse.status }); return NextResponse.json({ error: "Failed to reset password" }, { status: passwordResponse.status });
} }
return NextResponse.json({ success: true }); return NextResponse.json({
success: true,
temporary: temporary
});
} catch (error) { } catch (error) {
console.error("Error in reset password:", error); console.error("Error in reset password:", error);
return NextResponse.json({ error: "Internal server error" }, { status: 500 }); return NextResponse.json({ error: "Internal server error" }, { status: 500 });

View File

@ -179,7 +179,7 @@ export function UsersTable({ userRole = [] }: UsersTableProps) {
lastName: user.lastName || "", lastName: user.lastName || "",
email: user.email || "", email: user.email || "",
password: "", password: "",
roles: user.roles || [], roles: [],
enabled: user.enabled, enabled: user.enabled,
}); });
setEditUserDialog(true); setEditUserDialog(true);
@ -269,6 +269,15 @@ export function UsersTable({ userRole = [] }: UsersTableProps) {
await fetchUsers(); await fetchUsers();
setFormData({
username: "",
lastName: "",
firstName: "",
email: "",
password: "",
roles: [],
enabled: true,
});
setEditUserDialog(false); setEditUserDialog(false);
setSelectedUser(null); setSelectedUser(null);
@ -313,7 +322,7 @@ export function UsersTable({ userRole = [] }: UsersTableProps) {
}; };
const handleChangePassword = async (userId: string) => { const handleChangePassword = async (userId: string) => {
const newPassword = prompt("Entrez le nouveau mot de passe:"); const newPassword = prompt("Entrez le nouveau mot de passe temporaire:");
if (!newPassword) return; if (!newPassword) return;
try { try {
@ -322,7 +331,10 @@ export function UsersTable({ userRole = [] }: UsersTableProps) {
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
}, },
body: JSON.stringify({ password: newPassword }), body: JSON.stringify({
password: newPassword,
temporary: true
}),
}); });
if (!response.ok) { if (!response.ok) {
@ -331,7 +343,7 @@ export function UsersTable({ userRole = [] }: UsersTableProps) {
toast({ toast({
title: "Succès", title: "Succès",
description: "Le mot de passe a été modifié avec succès", description: "Le mot de passe temporaire a été défini avec succès. L'utilisateur devra le changer à sa première connexion.",
}); });
} catch (error) { } catch (error) {
toast({ toast({
@ -583,7 +595,21 @@ export function UsersTable({ userRole = [] }: UsersTableProps) {
</TableBody> </TableBody>
</Table> </Table>
<Dialog open={editUserDialog} onOpenChange={setEditUserDialog}> <Dialog open={editUserDialog} onOpenChange={(open) => {
if (!open) {
setFormData({
username: "",
lastName: "",
firstName: "",
email: "",
password: "",
roles: [],
enabled: true,
});
setSelectedUser(null);
}
setEditUserDialog(open);
}}>
<DialogContent> <DialogContent>
<DialogHeader> <DialogHeader>
<DialogTitle>Modifier l'utilisateur</DialogTitle> <DialogTitle>Modifier l'utilisateur</DialogTitle>
@ -614,57 +640,28 @@ export function UsersTable({ userRole = [] }: UsersTableProps) {
onChange={(e) => setFormData(prev => ({ ...prev, email: e.target.value }))} onChange={(e) => setFormData(prev => ({ ...prev, email: e.target.value }))}
/> />
</div> </div>
<div className="space-y-2"> <div className="flex justify-end space-x-2">
<Label htmlFor="edit-roles">Rôles</Label>
<div className="flex flex-wrap gap-2">
{roles.map((role) => (
<div key={role.id} className="flex items-center space-x-2">
<input
type="checkbox"
id={`edit-role-${role.id}`}
checked={formData.roles.includes(role.name)}
onChange={(e) => {
setFormData(prev => ({
...prev,
roles: e.target.checked
? [...prev.roles, role.name]
: prev.roles.filter(r => r !== role.name)
}));
}}
/>
<label htmlFor={`edit-role-${role.id}`}>{role.name}</label>
</div>
))}
</div>
<div className="flex flex-wrap gap-2 mt-2">
{formData.roles.map(role => (
<span key={role} className="px-2 py-1 bg-gray-100 rounded-md text-sm">
{role}
<button
type="button"
onClick={() => setFormData(prev => ({
...prev,
roles: prev.roles.filter(r => r !== role)
}))}
className="ml-2 text-gray-500 hover:text-gray-700"
>
×
</button>
</span>
))}
</div>
</div>
<div className="flex space-x-2">
<Button type="submit" className="flex-1">
Modifier
</Button>
<Button <Button
type="button" type="button"
variant="outline" variant="outline"
onClick={handleUpdateRoles} onClick={() => {
className="flex-1" setEditUserDialog(false);
setSelectedUser(null);
setFormData({
username: "",
lastName: "",
firstName: "",
email: "",
password: "",
roles: [],
enabled: true,
});
}}
> >
Mettre à jour les rôles Annuler
</Button>
<Button type="submit">
Modifier
</Button> </Button>
</div> </div>
</form> </form>