Paillasse/portail/app/Models/LabSession.php
2026-10-12 21:32:52 +02:00

94 lines
2.7 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Support\Facades\DB;
class LabSession extends Model
{
public const EN_ATTENTE = 'en_attente';
// Admis par le prof : CreerStackLab est dispatché, la stack Heat se construit.
public const ADMIS = 'admis';
// Stack CREATE_COMPLETE : les VM existent, les terminaux peuvent s'ouvrir.
public const ACTIF = 'actif';
public const TERMINE = 'termine';
public const EXPIRE = 'expire';
// Trois créations de stack ratées de suite (voir CreerStackLab) : le prof
// le voit dans la salle d'attente et peut relancer.
public const ECHEC = 'echec';
protected $fillable = ['seance_id', 'eleve_id', 'lab_id', 'heat_stack_id', 'heat_stack_name', 'etat', 'raison_echec', 'expire_a'];
protected $casts = [
'expire_a' => 'datetime',
];
/** @return BelongsTo<Seance, $this> */
public function seance(): BelongsTo
{
return $this->belongsTo(Seance::class);
}
/** @return BelongsTo<Eleve, $this> */
public function eleve(): BelongsTo
{
return $this->belongsTo(Eleve::class);
}
/** @return BelongsTo<Lab, $this> */
public function lab(): BelongsTo
{
return $this->belongsTo(Lab::class);
}
/** @return HasMany<LabSessionMachine, $this> */
public function machines(): HasMany
{
return $this->hasMany(LabSessionMachine::class);
}
/**
* Relie une stack prête à cette session : venue du stock chaud
* (SeanceController::admettre) ou construite à la demande (CreerStackLab).
*
* @param array{nom: string, id: string, instances: array<string, string>} $stack
*/
public function attribuerStack(array $stack): void
{
DB::transaction(function () use ($stack) {
$this->machines()->delete();
foreach ($stack['instances'] as $nom => $instanceId) {
$this->machines()->create(['nom' => $nom, 'instance_id' => $instanceId]);
}
$this->forceFill([
'heat_stack_name' => $stack['nom'],
'heat_stack_id' => $stack['id'],
'etat' => self::ACTIF,
'raison_echec' => null,
])->save();
});
}
/** @return HasMany<Correction, $this> */
public function corrections(): HasMany
{
return $this->hasMany(Correction::class);
}
/** @return HasOne<Correction, $this> */
public function derniereCorrection(): HasOne
{
return $this->hasOne(Correction::class)->latestOfMany();
}
}