67 lines
2.4 KiB
PHP
67 lines
2.4 KiB
PHP
|
|
<?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,
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
}
|