2026-10-08 02:01:58 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
|
2026-10-08 10:14:24 +02:00
|
|
|
use App\Jobs\CreerStackLab;
|
2026-10-08 02:01:58 +02:00
|
|
|
use App\Models\Classe;
|
|
|
|
|
use App\Models\LabSession;
|
|
|
|
|
use App\Models\Seance;
|
|
|
|
|
use Illuminate\Http\RedirectResponse;
|
|
|
|
|
use Illuminate\Http\Request;
|
|
|
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
|
use Illuminate\View\View;
|
|
|
|
|
|
|
|
|
|
class SeanceController extends Controller
|
|
|
|
|
{
|
|
|
|
|
public function store(Request $request, Classe $classe): RedirectResponse
|
|
|
|
|
{
|
|
|
|
|
abort_if($classe->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', [
|
2026-10-08 10:14:24 +02:00
|
|
|
'seance' => $seance->load(['classe', 'lab', 'labSessions.eleve', 'labSessions.machines']),
|
2026-10-08 02:01:58 +02:00
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
2026-10-08 09:35:16 +02:00
|
|
|
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'),
|
2026-10-08 10:14:24 +02:00
|
|
|
'labSession' => $labSession->load(['eleve', 'machines']),
|
2026-10-08 09:35:16 +02:00
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
2026-10-08 10:14:24 +02:00
|
|
|
/**
|
|
|
|
|
* 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.
|
|
|
|
|
*/
|
2026-10-08 02:01:58 +02:00
|
|
|
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);
|
|
|
|
|
|
2026-10-08 10:14:24 +02:00
|
|
|
$dureeMinutes = $labSession->lab->duree_min ?? 45;
|
|
|
|
|
|
|
|
|
|
$labSession->update([
|
|
|
|
|
'etat' => LabSession::ADMIS,
|
|
|
|
|
'expire_a' => now()->addMinutes($dureeMinutes),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
CreerStackLab::dispatch($labSession);
|
2026-10-08 02:01:58 +02:00
|
|
|
|
|
|
|
|
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,
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
}
|