CodeDetailAction.php
Pfad: src/Infrastructure/Http/CodeDetailAction.php
Ext: php
Größe: 3886 Bytes
Geändert: 2026-07-16T10:17:56+02:00
Frühere Version vom 2026-07-16T10:17:56+02:00 · zur aktuellen Fassung
<?php
declare(strict_types=1);
namespace Demo\Infrastructure\Http;
use Demo\Application\Code\ListeCodeDateiVersionen;
use Demo\Application\Code\SynchronisiereCodeDateien;
use Demo\Application\Code\ZeigeCodeDatei;
use Demo\Application\Code\ZeigeCodeDateiVersion;
use Demo\Infrastructure\Code\CodeDateiScanner;
/**
* Treibender Adapter: zeigt /code/{id} und /code/{id}/{version}.
*/
final class CodeDetailAction
{
/** @var ZeigeCodeDatei aktueller Stand. */
private ZeigeCodeDatei $zeige;
/** @var ListeCodeDateiVersionen Versionsliste. */
private ListeCodeDateiVersionen $versionen;
/** @var ZeigeCodeDateiVersion Snapshot von Historien. */
private ZeigeCodeDateiVersion $zeigeVersion;
/** @var SynchronisiereCodeDateien Anwendungsfall. */
private SynchronisiereCodeDateien $sync;
/** @var CodeDateiScanner Scanner fuer Projektrepräsentanz. */
private CodeDateiScanner $scanner;
/** @var TemplateRenderer Template-Renderer. */
private TemplateRenderer $view;
/** @var Navigation Hauptnavigation. */
private Navigation $nav;
/** @var CodeFehlerAntwort Code-Fehlerantworten. */
private CodeFehlerAntwort $fehler;
/**
* @param ZeigeCodeDatei $zeige Aktuelle Datei.
* @param ListeCodeDateiVersionen $versionen Versionsliste.
* @param ZeigeCodeDateiVersion $zeigeVersion Snapshot.
* @param SynchronisiereCodeDateien $sync Syncer.
* @param CodeDateiScanner $scanner Scanner.
* @param TemplateRenderer $view Renderer.
* @param Navigation $nav Navigation.
*/
public function __construct(
ZeigeCodeDatei $zeige,
ListeCodeDateiVersionen $versionen,
ZeigeCodeDateiVersion $zeigeVersion,
SynchronisiereCodeDateien $sync,
CodeDateiScanner $scanner,
TemplateRenderer $view,
Navigation $nav,
CodeFehlerAntwort $fehler
) {
$this->zeige = $zeige;
$this->versionen = $versionen;
$this->zeigeVersion = $zeigeVersion;
$this->sync = $sync;
$this->scanner = $scanner;
$this->view = $view;
$this->nav = $nav;
$this->fehler = $fehler;
}
/**
* Baut die Detailansicht.
*
* @param array<string,string> $params Routen-Parameter.
* @return Response HTML-Antwort.
*/
public function __invoke(array $params): Response
{
try {
$this->sync->execute($this->scanner->scan());
$id = (int) ($params['id'] ?? 0);
$version = $params['version'] ?? null;
if ($version !== null) {
$datei = $this->zeigeVersion->execute($id, (int) $version);
$versionen = [];
$readOnly = true;
} else {
$datei = $this->zeige->execute($id);
$versionen = $datei === null ? []
: $this->versionen->execute($id);
$readOnly = false;
}
} catch (\Throwable $throwable) {
$antwort = $this->fehler->fehlendeCodeTabelle($throwable);
if ($antwort !== null) {
return $antwort;
}
throw $throwable;
}
if ($datei === null) {
return new Response(
404,
'text/plain; charset=UTF-8',
'Nicht gefunden'
);
}
$html = $this->view->render('layout', [
'inner' => 'code-detail',
'titel' => $datei->dateiName,
'aktiv' => '/code',
'nav' => $this->nav->items(),
'datei' => $datei,
'versionen' => $versionen,
'readOnly' => $readOnly,
]);
return new Response(200, 'text/html; charset=UTF-8', $html);
}
}