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, } }