user_id !== Auth::guard('web')->id(), 403); $donnees = $request->validate([ 'lab_id' => ['required', 'exists:labs,id'], ]); $seance = $classe->seances()->create([ 'lab_id' => $donnees['lab_id'], 'statut' => Seance::SALLE_ATTENTE, 'demarree_a' => now(), ]); return redirect()->route('seances.attente', $seance); } public function attente(Seance $seance): View { abort_if($seance->classe->user_id !== Auth::guard('web')->id(), 403); return view('seances.attente', [ 'seance' => $seance->load(['classe', 'lab', 'labSessions.eleve', 'labSessions.machines']), ]); } public function consoleProf(Seance $seance, LabSession $labSession): View { abort_if($seance->classe->user_id !== Auth::guard('web')->id(), 403); abort_if($labSession->seance_id !== $seance->id, 404); return view('seances.console-prof', [ 'seance' => $seance->load('lab'), 'labSession' => $labSession->load(['eleve', 'machines']), ]); } /** * Admettre un élève, c'est lancer son lab : la stack Heat se construit * en tâche de fond (étape 10), le terminal apparaît une fois prête. */ public function admettre(Seance $seance, LabSession $labSession): RedirectResponse { abort_if($seance->classe->user_id !== Auth::guard('web')->id(), 403); abort_if($labSession->seance_id !== $seance->id, 404); $dureeMinutes = $labSession->lab->duree_min ?? 45; $labSession->update([ 'etat' => LabSession::ADMIS, 'expire_a' => now()->addMinutes($dureeMinutes), ]); CreerStackLab::dispatch($labSession); return redirect()->route('seances.attente', $seance); } /** * Un élève rejoint la séance : il patiente jusqu'à ce que le prof l'admette. */ public function rejoindre(Request $request, Seance $seance): RedirectResponse { $eleve = Auth::guard('eleve')->user(); abort_if($eleve->classe_id !== $seance->classe_id, 403); LabSession::firstOrCreate( ['seance_id' => $seance->id, 'eleve_id' => $eleve->id], ['lab_id' => $seance->lab_id, 'etat' => LabSession::EN_ATTENTE], ); return redirect()->route('seances.eleve.attente', $seance); } public function attenteEleve(Seance $seance): View|RedirectResponse { $eleve = Auth::guard('eleve')->user(); abort_if($eleve->classe_id !== $seance->classe_id, 403); $labSession = LabSession::where('seance_id', $seance->id) ->where('eleve_id', $eleve->id) ->first(); if ($labSession === null) { return redirect()->route('eleve'); } return view('seances.attente-eleve', [ 'seance' => $seance->load('lab'), 'labSession' => $labSession, ]); } }