ajoute Quiz flash (chantier vrai cockpit, étape 2) : QCM et vrai/faux, lancé en direct, indépendant d'une séance de lab
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
45f8a69e26
commit
16d1293911
24 changed files with 1249 additions and 5 deletions
78
portail/app/Http/Controllers/SessionQuizController.php
Normal file
78
portail/app/Http/Controllers/SessionQuizController.php
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Classe;
|
||||
use App\Models\Quiz;
|
||||
use App\Models\SessionQuiz;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\View\View;
|
||||
|
||||
/**
|
||||
* Lancement en direct d'un quiz (chantier « vrai cockpit », étape 2) :
|
||||
* indépendant d'une séance de lab — le prof peut le lancer à tout moment
|
||||
* pour sa classe, les élèves le voient apparaître sur leur tableau de bord.
|
||||
*/
|
||||
class SessionQuizController extends Controller
|
||||
{
|
||||
public function lancer(Classe $classe, Quiz $quiz): RedirectResponse
|
||||
{
|
||||
$this->verifierProprietaire($classe);
|
||||
abort_if($quiz->classe_id !== $classe->id, 404);
|
||||
abort_if($quiz->questions()->count() === 0, 422, 'Ce quiz n’a encore aucune question.');
|
||||
|
||||
$session = $quiz->sessions()->create(['statut' => SessionQuiz::EN_ATTENTE, 'demarree_a' => now()]);
|
||||
|
||||
return redirect()->route('sessions-quiz.show', $session);
|
||||
}
|
||||
|
||||
public function show(SessionQuiz $session): View
|
||||
{
|
||||
$this->verifierProprietaireSession($session);
|
||||
|
||||
return view('quiz.session-prof', [
|
||||
'session' => $session->load(['quiz.questions.choix', 'questionCourante.choix']),
|
||||
'decompte' => $session->decompteQuestionCourante(),
|
||||
'total_eleves' => $session->quiz->classe->eleves()->count(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function etat(SessionQuiz $session): JsonResponse
|
||||
{
|
||||
$this->verifierProprietaireSession($session);
|
||||
|
||||
return response()->json([
|
||||
'statut' => $session->statut,
|
||||
'question_id' => $session->question_quiz_courante_id,
|
||||
'decompte' => $session->decompteQuestionCourante(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function suivante(SessionQuiz $session): RedirectResponse
|
||||
{
|
||||
$this->verifierProprietaireSession($session);
|
||||
$session->passerALaQuestionSuivante();
|
||||
|
||||
return redirect()->route('sessions-quiz.show', $session);
|
||||
}
|
||||
|
||||
public function terminer(SessionQuiz $session): RedirectResponse
|
||||
{
|
||||
$this->verifierProprietaireSession($session);
|
||||
$session->terminer();
|
||||
|
||||
return redirect()->route('mes-classes.quiz.show', [$session->quiz->classe, $session->quiz]);
|
||||
}
|
||||
|
||||
private function verifierProprietaireSession(SessionQuiz $session): void
|
||||
{
|
||||
abort_if($session->quiz->classe->user_id !== Auth::guard('web')->id(), 403);
|
||||
}
|
||||
|
||||
private function verifierProprietaire(Classe $classe): void
|
||||
{
|
||||
abort_if($classe->user_id !== Auth::guard('web')->id(), 403);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue