update api users and groups and users 8
This commit is contained in:
parent
5ff393d6ca
commit
198b2abe4b
@ -13,7 +13,7 @@ export async function PUT(
|
||||
}
|
||||
|
||||
try {
|
||||
const { password } = await req.json();
|
||||
const { password, temporary = true } = await req.json();
|
||||
|
||||
// Get client credentials token
|
||||
const tokenResponse = await fetch(
|
||||
@ -38,7 +38,7 @@ export async function PUT(
|
||||
return NextResponse.json({ error: "Failed to get token" }, { status: 500 });
|
||||
}
|
||||
|
||||
// Reset password
|
||||
// Reset password with temporary flag
|
||||
const passwordResponse = await fetch(
|
||||
`${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({
|
||||
type: "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({ success: true });
|
||||
return NextResponse.json({
|
||||
success: true,
|
||||
temporary: temporary
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Error in reset password:", error);
|
||||
return NextResponse.json({ error: "Internal server error" }, { status: 500 });
|
||||
|
||||
@ -179,7 +179,7 @@ export function UsersTable({ userRole = [] }: UsersTableProps) {
|
||||
lastName: user.lastName || "",
|
||||
email: user.email || "",
|
||||
password: "",
|
||||
roles: user.roles || [],
|
||||
roles: [],
|
||||
enabled: user.enabled,
|
||||
});
|
||||
setEditUserDialog(true);
|
||||
@ -269,6 +269,15 @@ export function UsersTable({ userRole = [] }: UsersTableProps) {
|
||||
|
||||
await fetchUsers();
|
||||
|
||||
setFormData({
|
||||
username: "",
|
||||
lastName: "",
|
||||
firstName: "",
|
||||
email: "",
|
||||
password: "",
|
||||
roles: [],
|
||||
enabled: true,
|
||||
});
|
||||
setEditUserDialog(false);
|
||||
setSelectedUser(null);
|
||||
|
||||
@ -313,7 +322,7 @@ export function UsersTable({ userRole = [] }: UsersTableProps) {
|
||||
};
|
||||
|
||||
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;
|
||||
|
||||
try {
|
||||
@ -322,7 +331,10 @@ export function UsersTable({ userRole = [] }: UsersTableProps) {
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({ password: newPassword }),
|
||||
body: JSON.stringify({
|
||||
password: newPassword,
|
||||
temporary: true
|
||||
}),
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
@ -331,7 +343,7 @@ export function UsersTable({ userRole = [] }: UsersTableProps) {
|
||||
|
||||
toast({
|
||||
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) {
|
||||
toast({
|
||||
@ -583,7 +595,21 @@ export function UsersTable({ userRole = [] }: UsersTableProps) {
|
||||
</TableBody>
|
||||
</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>
|
||||
<DialogHeader>
|
||||
<DialogTitle>Modifier l'utilisateur</DialogTitle>
|
||||
@ -614,57 +640,28 @@ export function UsersTable({ userRole = [] }: UsersTableProps) {
|
||||
onChange={(e) => setFormData(prev => ({ ...prev, email: e.target.value }))}
|
||||
/>
|
||||
</div>
|
||||
<div className="space-y-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>
|
||||
<div className="flex justify-end space-x-2">
|
||||
<Button
|
||||
type="button"
|
||||
variant="outline"
|
||||
onClick={handleUpdateRoles}
|
||||
className="flex-1"
|
||||
onClick={() => {
|
||||
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>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user