79 lines
2.5 KiB
PHP
79 lines
2.5 KiB
PHP
|
|
<?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);
|
|||
|
|
}
|
|||
|
|
}
|