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:
Adam Belkacemi 2026-10-13 12:14:30 +02:00
parent 45f8a69e26
commit 16d1293911
24 changed files with 1249 additions and 5 deletions

View file

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* Chantier « vrai cockpit », étape 2 : Quiz flash. Une classe a une banque
* de quiz réutilisables (créés par le prof), chacun lancé en direct quand
* il le décide (table sessions_quiz).
*/
return new class extends Migration
{
public function up(): void
{
Schema::create('quizzes', function (Blueprint $table) {
$table->id();
$table->foreignId('classe_id')->constrained()->cascadeOnDelete();
$table->string('titre');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('quizzes');
}
};

View file

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('questions_quiz', function (Blueprint $table) {
$table->id();
$table->foreignId('quiz_id')->constrained()->cascadeOnDelete();
$table->text('enonce');
$table->string('type')->comment('qcm, vrai_faux');
$table->unsignedSmallInteger('ordre')->default(0);
// Seulement pour le type vrai_faux : les choix du QCM sont dans
// choix_questions_quiz, chacun avec son propre est_correct.
$table->boolean('reponse_vrai_faux')->nullable();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('questions_quiz');
}
};

View file

@ -0,0 +1,27 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('choix_questions_quiz', function (Blueprint $table) {
$table->id();
// constrained() devinerait "question_quizzes" (pluriel anglais du
// nom de colonne) : notre table s'appelle "questions_quiz".
$table->foreignId('question_quiz_id')->constrained('questions_quiz')->cascadeOnDelete();
$table->string('texte');
$table->boolean('est_correct')->default(false);
$table->unsignedSmallInteger('ordre')->default(0);
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('choix_questions_quiz');
}
};

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* Un lancement en direct d'un quiz (indépendant d'une séance de lab, voix
* d'Adam le 2026-10-12) : les élèves de la classe le voient apparaître sur
* leur tableau de bord sans rien faire — pas de code à saisir, ils sont
* déjà des comptes réels de la classe.
*/
return new class extends Migration
{
public function up(): void
{
Schema::create('sessions_quiz', function (Blueprint $table) {
$table->id();
$table->foreignId('quiz_id')->constrained()->cascadeOnDelete();
$table->string('statut')->default('en_attente')->comment('en_attente, en_cours, terminee');
$table->foreignId('question_quiz_courante_id')->nullable()->constrained('questions_quiz')->nullOnDelete();
$table->timestamp('demarree_a')->nullable();
$table->timestamp('terminee_a')->nullable();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('sessions_quiz');
}
};

View file

@ -0,0 +1,39 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* Une réponse d'un élève à une question, pendant une session de quiz en
* direct. Un seul envoi compte (contrainte d'unicité) : un élève ne peut
* pas changer d'avis après coup, ni répondre deux fois à la même question.
*/
return new class extends Migration
{
public function up(): void
{
Schema::create('reponses_quiz', function (Blueprint $table) {
$table->id();
// constrained() devine le nom de la table à partir du nom de la
// colonne (pluriel anglais) : nos tables ont un nom différent
// (sessions_quiz, questions_quiz, choix_questions_quiz), donc
// toujours précisé explicitement ici.
$table->foreignId('session_quiz_id')->constrained('sessions_quiz')->cascadeOnDelete();
$table->foreignId('question_quiz_id')->constrained('questions_quiz')->cascadeOnDelete();
$table->foreignId('eleve_id')->constrained()->cascadeOnDelete();
$table->foreignId('choix_question_quiz_id')->nullable()->constrained('choix_questions_quiz')->nullOnDelete();
$table->boolean('reponse_vrai_faux')->nullable();
$table->boolean('correcte');
$table->timestamp('repondu_a');
$table->timestamps();
$table->unique(['session_quiz_id', 'question_quiz_id', 'eleve_id']);
});
}
public function down(): void
{
Schema::dropIfExists('reponses_quiz');
}
};