From 8a61f9b82347294d5abd2db0833f98951d845dc8 Mon Sep 17 00:00:00 2001 From: Manus Sandbox Date: Fri, 21 Nov 2025 10:08:56 -0500 Subject: [PATCH] Checkpoint: Ajout de l'identifiant de connexion et modification du mot de passe dans la gestion des utilisateurs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modifications apportées : - Ajout du champ username (identifiant de connexion) dans le schéma de la base de données avec contrainte UNIQUE - Mise à jour des procédures tRPC create et update pour gérer username et password - Implémentation du hashage du mot de passe avec bcryptjs dans createUser et updateUser - Ajout de la colonne "Identifiant" dans le tableau de la page de gestion des utilisateurs - Ajout des champs "Identifiant de connexion" et "Mot de passe" dans le formulaire de création - Ajout des champs "Identifiant de connexion" et "Nouveau mot de passe" dans le formulaire d'édition avec notes explicatives - Les mots de passe sont hashés avant d'être stockés en base de données pour la sécurité - Dans le formulaire d'édition, les champs username et password sont optionnels (laissez vide pour ne pas modifier) --- .manus/db/db-query-1763737221512.json | 9 + .manus/db/db-query-1763737229123.json | 9 + .manus/db/db-query-error-1763737207540.json | 8 + client/src/pages/AdminUsers.tsx | 73 +- drizzle/0012_dapper_ronan.sql | 3 + drizzle/meta/0012_snapshot.json | 854 ++++++++++++++++++++ drizzle/meta/_journal.json | 7 + drizzle/schema.ts | 4 + package.json | 2 + pnpm-lock.yaml | 20 + server/db.ts | 12 + server/routers.ts | 4 + todo.md | 9 + 13 files changed, 1011 insertions(+), 3 deletions(-) create mode 100644 .manus/db/db-query-1763737221512.json create mode 100644 .manus/db/db-query-1763737229123.json create mode 100644 .manus/db/db-query-error-1763737207540.json create mode 100644 drizzle/0012_dapper_ronan.sql create mode 100644 drizzle/meta/0012_snapshot.json diff --git a/.manus/db/db-query-1763737221512.json b/.manus/db/db-query-1763737221512.json new file mode 100644 index 0000000..a01382f --- /dev/null +++ b/.manus/db/db-query-1763737221512.json @@ -0,0 +1,9 @@ +{ + "query": "ALTER TABLE users ADD COLUMN username VARCHAR(100) AFTER email", + "command": "mysql --batch --raw --column-names --default-character-set=utf8mb4 --host gateway02.us-east-1.prod.aws.tidbcloud.com --port 4000 --user 4CrrYuB5tme73Qo.root --database 7PAT67UmWoxv8vwp8Bbcv6 --execute ALTER TABLE users ADD COLUMN username VARCHAR(100) AFTER email", + "rows": [], + "messages": [], + "stdout": "", + "stderr": "", + "execution_time_ms": 507 +} \ No newline at end of file diff --git a/.manus/db/db-query-1763737229123.json b/.manus/db/db-query-1763737229123.json new file mode 100644 index 0000000..6f096aa --- /dev/null +++ b/.manus/db/db-query-1763737229123.json @@ -0,0 +1,9 @@ +{ + "query": "ALTER TABLE users ADD UNIQUE KEY unique_username (username)", + "command": "mysql --batch --raw --column-names --default-character-set=utf8mb4 --host gateway02.us-east-1.prod.aws.tidbcloud.com --port 4000 --user 4CrrYuB5tme73Qo.root --database 7PAT67UmWoxv8vwp8Bbcv6 --execute ALTER TABLE users ADD UNIQUE KEY unique_username (username)", + "rows": [], + "messages": [], + "stdout": "", + "stderr": "", + "execution_time_ms": 575 +} \ No newline at end of file diff --git a/.manus/db/db-query-error-1763737207540.json b/.manus/db/db-query-error-1763737207540.json new file mode 100644 index 0000000..efdb146 --- /dev/null +++ b/.manus/db/db-query-error-1763737207540.json @@ -0,0 +1,8 @@ +{ + "query": "ALTER TABLE users ADD COLUMN username VARCHAR(100) UNIQUE AFTER email", + "command": "mysql --batch --raw --column-names --default-character-set=utf8mb4 --host gateway02.us-east-1.prod.aws.tidbcloud.com --port 4000 --user 4CrrYuB5tme73Qo.root --database 7PAT67UmWoxv8vwp8Bbcv6 --execute ALTER TABLE users ADD COLUMN username VARCHAR(100) UNIQUE AFTER email", + "returncode": 1, + "logs": [ + "ERROR 8200 (HY000) at line 1: unsupported add column 'username' constraint UNIQUE KEY when altering '7PAT67UmWoxv8vwp8Bbcv6.users'" + ] +} \ No newline at end of file diff --git a/client/src/pages/AdminUsers.tsx b/client/src/pages/AdminUsers.tsx index 835b53f..fb0b1a0 100644 --- a/client/src/pages/AdminUsers.tsx +++ b/client/src/pages/AdminUsers.tsx @@ -44,11 +44,15 @@ export default function AdminUsers() { openId: "", name: "", email: "", + username: "", + password: "", role: "user" as "user" | "admin", }); const [editForm, setEditForm] = useState({ name: "", email: "", + username: "", + password: "", role: "user" as "user" | "admin", }); @@ -63,6 +67,8 @@ export default function AdminUsers() { openId: "", name: "", email: "", + username: "", + password: "", role: "user", }); }, @@ -127,6 +133,8 @@ export default function AdminUsers() { openId: createForm.openId, name: createForm.name || undefined, email: createForm.email || undefined, + username: createForm.username || undefined, + password: createForm.password || undefined, role: createForm.role, isActive: true, }); @@ -137,6 +145,8 @@ export default function AdminUsers() { setEditForm({ name: user.name || "", email: user.email || "", + username: user.username || "", + password: "", // Toujours vide pour la sécurité role: user.role, }); setEditDialogOpen(true); @@ -145,12 +155,23 @@ export default function AdminUsers() { const handleSaveEdit = () => { if (!selectedUser) return; - updateMutation.mutate({ + // Ne pas envoyer username et password s'ils sont vides + const updateData: any = { id: selectedUser.id, name: editForm.name || undefined, email: editForm.email || undefined, role: editForm.role, - }); + }; + + if (editForm.username) { + updateData.username = editForm.username; + } + + if (editForm.password) { + updateData.password = editForm.password; + } + + updateMutation.mutate(updateData); }; const handleToggleStatus = (user: any) => { @@ -281,6 +302,7 @@ export default function AdminUsers() { ID Nom Email + Identifiant Rôle Statut Dernière connexion @@ -291,7 +313,7 @@ export default function AdminUsers() { {filteredUsers.length === 0 ? ( - + Aucun utilisateur trouvé @@ -301,6 +323,7 @@ export default function AdminUsers() { {user.id} {user.name || "N/A"} {user.email || "N/A"} + {user.username || "N/A"} {user.role === "admin" ? "Administrateur" : "Utilisateur"} @@ -403,6 +426,27 @@ export default function AdminUsers() { /> +
+ + setCreateForm({ ...createForm, username: e.target.value })} + placeholder="Identifiant unique pour la connexion" + /> +
+ +
+ + setCreateForm({ ...createForm, password: e.target.value })} + placeholder="Minimum 6 caractères" + /> +
+
setEditForm({ ...editForm, username: e.target.value })} + placeholder="Identifiant unique pour la connexion" + /> +

Laissez vide pour ne pas modifier

+
+ +
+ + setEditForm({ ...editForm, password: e.target.value })} + placeholder="Laissez vide pour ne pas modifier" + /> +

Minimum 6 caractères si modifié

+
+