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 {
|
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 });
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user