← Code-Übersicht

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);
    }
}