Paillasse/portail/app/Console/Commands/SynchroniserBanqueQuiz.php

78 lines
2.7 KiB
PHP
Raw Normal View History

<?php
namespace App\Console\Commands;
use App\Models\Quiz;
use App\Services\Catalogue\CacheCatalogue;
use App\Services\Quiz\BanqueOfficielle;
use App\Services\Quiz\LecteurGift;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
use Symfony\Component\Yaml\Yaml;
/**
* Peuple la banque de quiz officielle depuis les quiz.gift de
* paillasse-contenus/ (demande d'Adam, 2026-10-13) : même esprit que
* labs:synchroniser, jamais de suppression — les questions d'un quiz
* officiel sont remplacées à chaque synchronisation (lui seul les écrit,
* aucun prof ne peut l'éditer), jamais le quiz lui-même.
*/
class SynchroniserBanqueQuiz extends Command
{
protected $signature = 'quiz:synchroniser-banque';
protected $description = 'Crée ou met à jour la banque de quiz officielle depuis les quiz.gift de paillasse-contenus/';
public function handle(): void
{
$dossier = config('contenus.dossier');
$themes = config('contenus.themes');
$classe = BanqueOfficielle::classe();
foreach (File::directories($dossier) as $chemin) {
$identifiant = basename($chemin);
$cheminGift = "{$chemin}/quiz.gift";
$cheminLab = "{$chemin}/lab.yaml";
if (! File::exists($cheminGift) || ! File::exists($cheminLab)) {
continue;
}
$titre = Yaml::parseFile($cheminLab)['titre'];
$lecture = LecteurGift::lire($cheminGift);
$quiz = Quiz::updateOrCreate(
['classe_id' => $classe->id, 'titre' => $titre],
['theme' => $themes[$identifiant] ?? null, 'partage' => true],
);
$quiz->questions()->delete();
foreach ($lecture['questions'] as $ordre => $donnees) {
$question = $quiz->questions()->create([
'enonce' => $donnees['enonce'],
'type' => $donnees['type'],
'ordre' => $ordre,
'reponse_vrai_faux' => $donnees['reponse_vrai_faux'],
]);
foreach ($donnees['choix'] as $ordreChoix => $choix) {
$question->choix()->create([
'texte' => $choix['texte'],
'est_correct' => $choix['est_correct'],
'ordre' => $ordreChoix,
]);
}
}
$this->line(($quiz->wasRecentlyCreated ? 'créé' : 'à jour')." : {$identifiant} ({$titre}), ".count($lecture['questions']).' question(s)');
foreach ($lecture['avertissements'] as $avertissement) {
$this->warn("{$identifiant} : {$avertissement}");
}
}
CacheCatalogue::viderQuizOfficiels();
}
}