Paillasse/portail/app/Services/Labs/CorrigerSession.php

67 lines
2.4 KiB
PHP
Raw Permalink Normal View History

<?php
namespace App\Services\Labs;
use App\Models\Correction;
use App\Models\LabSession;
/**
* Passe toutes les vérifications du lab sur les VM d'une session et
* enregistre la note. Le lab est « réussi » quand toutes les vérifications
* hors bonus passent ; les bonus (id « bonus-… ») ajoutent des points
* au-delà de la note maximale.
*/
class CorrigerSession
{
// Erreurs techniques du correcteur : l'élève n'y est pour rien, le
// message doit le lui dire plutôt que de lui faire chercher une erreur.
private const MESSAGES_TECHNIQUES = [
'agent_injoignable' => 'La machine ne répond pas à la vérification. Attends quelques secondes après un redémarrage, puis réessaie.',
'delai_depasse' => 'La vérification a pris plus de 10 secondes sur la machine.',
];
public function __construct(private readonly ClientCorrecteur $client) {}
public function corriger(LabSession $session): Correction
{
$lab = DefinitionLab::depuis($session->lab->identifiant);
$instances = $session->machines()->pluck('instance_id', 'nom');
$details = [];
$note = 0;
$noteMax = 0;
$reussi = true;
foreach ($lab->verifications as $verification) {
$resultat = isset($instances[$verification['machine']])
? $this->client->verifier($instances[$verification['machine']], $lab->identifiant, $verification['id'])
: ['reussi' => false, 'erreur' => 'machine_absente'];
if (! $verification['bonus']) {
$noteMax += $verification['points'];
$reussi = $reussi && $resultat['reussi'];
}
if ($resultat['reussi']) {
$note += $verification['points'];
}
$details[] = [
'id' => $verification['id'],
'titre' => $verification['titre'],
'points' => $verification['points'],
'bonus' => $verification['bonus'],
'reussi' => $resultat['reussi'],
'message' => $resultat['reussi'] ? null : (self::MESSAGES_TECHNIQUES[$resultat['erreur']] ?? $verification['message_echec']),
];
}
return $session->corrections()->create([
'reussi' => $reussi,
'note' => $note,
'note_max' => $noteMax,
'details' => $details,
]);
}
}