Files
vkv/app/Jobs/StartEvaluationRunJob.php
Zdeněk Burda 41e3ce6f25 Initial commit
2026-01-09 21:26:40 +01:00

81 lines
2.4 KiB
PHP

<?php
namespace App\Jobs;
use App\Models\EvaluationRun;
use App\Services\Evaluation\EvaluationCoordinator;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
/**
* Job: StartEvaluationRunJob
*
* Odpovědnost:
* - Slouží jako ORCHESTRÁTOR vyhodnocovacího běhu (EvaluationRun).
* - Tento job NEPROVÁDÍ samotné vyhodnocení QSO ani výpočty bodů.
* - Je zodpovědný za bezpečné spuštění pipeline kroků vyhodnocení
* ve správném pořadí.
*
* Typický životní cyklus:
* 1) Job je dispatchnut po kliknutí v administraci nebo backendovou akcí.
* 2) Ověří, že EvaluationRun existuje a je ve stavu PENDING.
* 3) Získá lock nad rozsahem dat (typicky round_id), aby zabránil
* souběžnému vyhodnocení stejných dat.
* 4) Přepne EvaluationRun do stavu RUNNING a zapíše start běhu.
* 5) Sestaví sekvenci (chain / batch) dílčích jobů:
* - příprava dat
* - parsing logů
* - matching QSO
* - výpočty skóre
* - agregace výsledků
* - finalizace a publikace
* 6) Předá řízení jednotlivým krokům; tento job poté končí.
*
* Důležité zásady:
* - Tento job musí být IDEMPOTENTNÍ (opakované spuštění nesmí rozbít stav).
* - Nesmí obsahovat výpočetní logiku.
* - Nesmí zapisovat výsledky vyhodnocení.
* - Veškerá byznys logika patří do service layer a dílčích jobů.
*
* Queue:
* - Spouští se ve frontě "evaluation".
* - Používá se společně s ochranou proti souběhu (lock / WithoutOverlapping).
*/
class StartEvaluationRunJob implements ShouldQueue
{
use Queueable;
/**
* Create a new job instance.
*/
public function __construct(
protected int $evaluationRunId
)
{
//
}
/**
* Spuštění vyhodnocovacího běhu.
*
* Metoda handle():
* - inicializuje vyhodnocovací běh
* - zajistí exkluzivitu nad daty
* - připraví a dispatchne navazující joby
*
* Poznámka:
* - Tato metoda by měla být krátká a čitelná.
* - Veškerá komplexní logika má být delegována
* do EvaluationCoordinator / service layer.
*/
public function handle(): void
{
$run = EvaluationRun::find($this->evaluationRunId);
if (! $run || $run->isCanceled()) {
return;
}
app(EvaluationCoordinator::class)->start($run);
}
}