fix : rejoindre avec un pseudo existant reconnecte ce membre au lieu d'en créer un doublon

- 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
This commit is contained in:
Mathis 2026-10-04 21:25:42 +02:00
parent bf22f65f91
commit 0cc4b9841a

View file

@ -61,19 +61,40 @@ export function createClass(name: string, level: string | null, nickname: string
export function joinClass(code: string, nickname: string): NewSession | null { export function joinClass(code: string, nickname: string): NewSession | null {
const row = db const row = db
.prepare<[string], { id: number; name: string; level: string | null }>( .prepare<[string], { id: number; name: string; level: string | null; flash_message: string | null }>(
'SELECT id, name, level FROM classes WHERE code = ?', 'SELECT id, name, level, flash_message FROM classes WHERE code = ?',
) )
.get(code) .get(code)
if (!row) return null 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() 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 const memberId = db
.prepare('INSERT INTO members (class_id, nickname, role, token, created_at) VALUES (?, ?, ?, ?, ?)') .prepare('INSERT INTO members (class_id, nickname, role, is_creator, token, created_at) VALUES (?, ?, ?, ?, ?, ?)')
.run(row.id, nickname, 'student', token, nowIso()).lastInsertRowid as number .run(row.id, nickname, 'student', 0, token, nowIso()).lastInsertRowid as number
return { return {
token, token,
member: { id: memberId, classId: row.id, nickname, role: 'student', isCreator: false }, member: { id: memberId, classId: row.id, nickname, role: 'student', isCreator: false },
klass: { id: row.id, name: row.name, level: row.level, flashMessage: null }, klass,
} }
} }