← Code-Übersicht

DokuDetailAction.php

Pfad: src/Infrastructure/Http/DokuDetailAction.php

Ext: php

Größe: 3364 Bytes

Geändert: 2026-07-16 08:36:23+02

<?php
declare(strict_types=1);

namespace Demo\Infrastructure\Http;

use Demo\Application\Dokumentation\ListeDokumentationVersionen;
use Demo\Application\Dokumentation\ZeigeDokumentation;
use Demo\Application\Dokumentation\ZeigeDokumentationVersion;
use Demo\Infrastructure\Content\MarkdownToHtml;

/**
 * Treibender Adapter: zeigt /doku/{slug} mit In-Place-Editor und Versionsliste
 * sowie /doku/{slug}/{version} als read-only Snapshot (ohne Editor/Historie).
 */
final class DokuDetailAction
{
    /** @var ZeigeDokumentation Aktuelle Fassung. */
    private ZeigeDokumentation $zeige;

    /** @var ListeDokumentationVersionen Versionsliste. */
    private ListeDokumentationVersionen $listeVersionen;

    /** @var ZeigeDokumentationVersion Historischer Snapshot. */
    private ZeigeDokumentationVersion $zeigeVersion;

    /** @var MarkdownToHtml Renderer fuer den Markdown-Body. */
    private MarkdownToHtml $markdown;

    /** @var TemplateRenderer Template-Renderer. */
    private TemplateRenderer $view;

    /** @var Navigation Hauptnavigation. */
    private Navigation $nav;

    /**
     * @param ZeigeDokumentation          $zeige          Aktuelle Fassung.
     * @param ListeDokumentationVersionen $listeVersionen Versionsliste.
     * @param ZeigeDokumentationVersion   $zeigeVersion   Historischer Snapshot.
     * @param MarkdownToHtml              $markdown       Markdown-Renderer.
     * @param TemplateRenderer            $view           Renderer.
     * @param Navigation                  $nav            Navigation.
     */
    public function __construct(
        ZeigeDokumentation $zeige,
        ListeDokumentationVersionen $listeVersionen,
        ZeigeDokumentationVersion $zeigeVersion,
        MarkdownToHtml $markdown,
        TemplateRenderer $view,
        Navigation $nav
    ) {
        $this->zeige = $zeige;
        $this->listeVersionen = $listeVersionen;
        $this->zeigeVersion = $zeigeVersion;
        $this->markdown = $markdown;
        $this->view = $view;
        $this->nav = $nav;
    }

    /**
     * Baut die aktuelle Detailseite oder eine read-only Versionsseite; sonst 404.
     *
     * @param array<string,string> $params Routen-Parameter (slug, optional version).
     * @return Response HTML-Antwort.
     */
    public function __invoke(array $params): Response
    {
        $slug = $params['slug'] ?? '';
        $version = $params['version'] ?? null;
        if ($version !== null) {
            $dok = $this->zeigeVersion->execute($slug, (int) $version);
            $versionen = [];
            $editierbar = false;
        } else {
            $dok = $this->zeige->execute($slug);
            $versionen = $dok === null ? [] : $this->listeVersionen->execute($slug);
            $editierbar = true;
        }
        if ($dok === null) {
            return new Response(404, 'text/plain; charset=UTF-8', 'Nicht gefunden');
        }
        $html = $this->view->render('layout', [
            'inner' => 'doku-detail',
            'titel' => $dok->titel,
            'aktiv' => '/doku',
            'nav' => $this->nav->items(),
            'dok' => $dok,
            'inhaltHtml' => $this->markdown->render($dok->body),
            'editierbar' => $editierbar,
            'versionen' => $versionen,
        ]);

        return new Response(200, 'text/html; charset=UTF-8', $html);
    }
}