← Code-Übersicht

PostgresCodeDateiHistorie.php

Pfad: src/Infrastructure/Persistence/PostgresCodeDateiHistorie.php

Ext: php

Größe: 2783 Bytes

Geändert: 2026-07-16T10:04:56+02:00

Frühere Version vom 2026-07-16T10:04:56+02:00 · zur aktuellen Fassung

<?php
declare(strict_types=1);

namespace Demo\Infrastructure\Persistence;

use Demo\Domain\Code\CodeDatei;
use Demo\Domain\Code\CodeDateiHistorie;
use Demo\Domain\Code\CodeVersion;
use PDO;

/**
 * Postgres-Adapter fuer Code-Historie (read-only).
 */
final class PostgresCodeDateiHistorie implements CodeDateiHistorie
{
    /** @var PdoConnectionFactory Fabrik fuer die Verbindung. */
    private PdoConnectionFactory $factory;

    /** @var PDO|null Zwischengespeicherte Verbindung. */
    private ?PDO $pdo = null;

    /**
     * @param PdoConnectionFactory $factory Verbindungsfabrik.
     */
    public function __construct(PdoConnectionFactory $factory)
    {
        $this->factory = $factory;
    }

    /**
     * @inheritDoc
     */
    public function versionen(int $codeDateiId): array
    {
        $sql = 'SELECT history_id, operation, geaendert_am'
            . ' FROM history_code_datei'
            . ' WHERE (daten->>\'id\')::bigint = :id'
            . ' ORDER BY geaendert_am DESC, history_id DESC';
        $stmt = $this->pdo()->prepare($sql);
        $stmt->execute([':id' => $codeDateiId]);
        $versionen = [];
        foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
            $versionen[] = new CodeVersion(
                (int) $row['history_id'],
                (string) $row['geaendert_am'],
                (string) $row['operation']
            );
        }

        return $versionen;
    }

    /**
     * @inheritDoc
     */
    public function beiVersion(int $codeDateiId, int $id): ?CodeDatei
    {
        $sql = 'SELECT daten FROM history_code_datei'
            . ' WHERE history_id = :id AND (daten->>\'id\')::bigint = :code_id';
        $stmt = $this->pdo()->prepare($sql);
        $stmt->execute([':id' => $id, ':code_id' => $codeDateiId]);
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        if ($row === false) {
            return null;
        }
        $daten = json_decode((string) $row['daten'], true);
        if (!is_array($daten)) {
            return null;
        }

        return new CodeDatei(
            (int) ($daten['id'] ?? 0),
            (string) ($daten['relativer_pfad'] ?? ''),
            (string) ($daten['datei_name'] ?? ''),
            (string) ($daten['datei_erweiterung'] ?? ''),
            (string) ($daten['code'] ?? ''),
            (string) ($daten['code_hash'] ?? ''),
            (int) ($daten['datei_groesse'] ?? 0),
            (string) ($daten['datei_mtime'] ?? ''),
            (string) ($daten['updated_at'] ?? ''),
            (string) ($daten['created_at'] ?? '')
        );
    }

    /**
     * Liefert die lazy DB-Verbindung.
     *
     * @return PDO Verbindung.
     */
    private function pdo(): PDO
    {
        return $this->pdo ??= $this->factory->create();
    }
}