From 0cc4b9841abc3fa2cfa5c9798c96f30a7dde547d Mon Sep 17 00:00:00 2001 From: Mathis Date: Sun, 4 Oct 2026 21:25:42 +0200 Subject: [PATCH] =?UTF-8?q?fix=20:=20rejoindre=20avec=20un=20pseudo=20exis?= =?UTF-8?q?tant=20reconnecte=20ce=20membre=20au=20lieu=20d'en=20cr=C3=A9er?= =?UTF-8?q?=20un=20doublon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - joinClass vérifie si un membre porte déjà ce pseudo dans la classe - Si oui : nouveau jeton + retourne le rôle existant (admin conservé) - Si non : création d'un nouvel élève - L'admin peut se reconnecter avec son pseudo pour retrouver ses droits --- server/src/auth.ts | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/server/src/auth.ts b/server/src/auth.ts index a84a092..7cdbfd5 100644 --- a/server/src/auth.ts +++ b/server/src/auth.ts @@ -61,19 +61,40 @@ export function createClass(name: string, level: string | null, nickname: string export function joinClass(code: string, nickname: string): NewSession | null { const row = db - .prepare<[string], { id: number; name: string; level: string | null }>( - 'SELECT id, name, level FROM classes WHERE code = ?', + .prepare<[string], { id: number; name: string; level: string | null; flash_message: string | null }>( + 'SELECT id, name, level, flash_message FROM classes WHERE code = ?', ) .get(code) if (!row) return null + + // Si un membre porte déjà ce pseudo dans la classe, on lui rouvre une + // session (nouveau jeton) au lieu de créer un doublon. L'admin peut ainsi + // se reconnecter avec son pseudo pour retrouver ses droits. + const existing = db + .prepare<[number, string], { id: number; role: Role; is_creator: number }>( + 'SELECT id, role, is_creator FROM members WHERE class_id = ? AND nickname = ?', + ) + .get(row.id, nickname) + + const klass: ClassInfo = { id: row.id, name: row.name, level: row.level, flashMessage: row.flash_message } const token = newToken() + + if (existing) { + db.prepare('UPDATE members SET token = ? WHERE id = ?').run(token, existing.id) + return { + token, + member: { id: existing.id, classId: row.id, nickname, role: existing.role, isCreator: existing.is_creator === 1 }, + klass, + } + } + const memberId = db - .prepare('INSERT INTO members (class_id, nickname, role, token, created_at) VALUES (?, ?, ?, ?, ?)') - .run(row.id, nickname, 'student', token, nowIso()).lastInsertRowid as number + .prepare('INSERT INTO members (class_id, nickname, role, is_creator, token, created_at) VALUES (?, ?, ?, ?, ?, ?)') + .run(row.id, nickname, 'student', 0, token, nowIso()).lastInsertRowid as number return { token, member: { id: memberId, classId: row.id, nickname, role: 'student', isCreator: false }, - klass: { id: row.id, name: row.name, level: row.level, flashMessage: null }, + klass, } }