PostgresCodeDateiHistorie.php
Pfad: src/Infrastructure/Persistence/PostgresCodeDateiHistorie.php
Ext: php
Größe: 2732 Bytes
Geändert: 2026-07-16 10:49:15+02
<?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['created_at'] ?? '')
);
}
/**
* Liefert die lazy DB-Verbindung.
*
* @return PDO Verbindung.
*/
private function pdo(): PDO
{
return $this->pdo ??= $this->factory->create();
}
}
Frühere Versionen
| Version | Zeitpunkt | Operation |
|---|---|---|
| 4 | 2026-07-16 12:49:36.486091+02 | UPDATE |