user()->classes()->withCount('eleves')->latest()->get(); return view('mes-classes.index', ['classes' => $classes]); } public function show(Classe $classe): View { $this->verifierProprietaire($classe); return view('mes-classes.show', [ 'classe' => $classe->load('eleves'), ]); } public function storeEleve(Request $request, Classe $classe): RedirectResponse { $this->verifierProprietaire($classe); $donnees = $request->validate([ 'prenom' => ['required', 'string', 'max:100'], 'nom' => ['nullable', 'string', 'max:100'], ]); $fiche = $this->creerEleve($classe, $donnees['prenom'], $donnees['nom'] ?? null); return redirect()->route('mes-classes.show', $classe) ->with('fiches', [$fiche]); } public function importerCsv(Request $request, Classe $classe): RedirectResponse { $this->verifierProprietaire($classe); $request->validate([ 'fichier' => ['required', 'file', 'mimes:csv,txt'], ]); $lignes = file($request->file('fichier')->getRealPath(), FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $fiches = []; foreach ($lignes as $ligne) { $colonnes = str_getcsv($ligne); $prenom = trim($colonnes[0] ?? ''); if ($prenom === '' || Str::lower($prenom) === 'prenom') { continue; // ligne vide ou en-tĂȘte } $nom = trim($colonnes[1] ?? '') ?: null; $fiches[] = $this->creerEleve($classe, $prenom, $nom); } return redirect()->route('mes-classes.show', $classe) ->with('fiches', $fiches) ->with('nombre_importes', count($fiches)); } public function regenererCode(Classe $classe, Eleve $eleve): RedirectResponse { $this->verifierProprietaire($classe); abort_if($eleve->classe_id !== $classe->id, 404); $codeSecret = $this->generateur->genererCodeSecret(); $jetonQr = Str::random(32); $eleve->forceFill([ 'code_secret' => Hash::make($codeSecret), 'jeton_qr' => $jetonQr, ])->save(); return redirect()->route('mes-classes.show', $classe) ->with('fiches', [[ 'identifiant' => $eleve->identifiant, 'prenom' => $eleve->prenom, 'nom' => $eleve->nom, 'code_secret' => $codeSecret, 'jeton_qr' => $jetonQr, ]]); } /** * @return array{identifiant: string, prenom: string, nom: ?string, code_secret: string, jeton_qr: string} */ private function creerEleve(Classe $classe, string $prenom, ?string $nom): array { $identifiant = $this->generateur->genererIdentifiant($prenom, $nom); $codeSecret = $this->generateur->genererCodeSecret(); $jetonQr = Str::random(32); $classe->eleves()->create([ 'prenom' => $prenom, 'nom' => $nom, 'identifiant' => $identifiant, 'code_secret' => Hash::make($codeSecret), 'jeton_qr' => $jetonQr, ]); return [ 'identifiant' => $identifiant, 'prenom' => $prenom, 'nom' => $nom, 'code_secret' => $codeSecret, 'jeton_qr' => $jetonQr, ]; } private function verifierProprietaire(Classe $classe): void { abort_if($classe->user_id !== Auth::guard('web')->id(), 403); } }