<?php
declare(strict_types=1);
namespace Infrastructure\Persistence;
// @responsibility: Persistenz für Content-Konfigurationen
use Domain\Repository\ContentRepositoryInterface;
class ContentRepository implements ContentRepositoryInterface
{
private \PDO $pdo;
private ContentOrderRepositoryInterface $orderRepository;
private ContentVersionRepositoryInterface $versionRepository;
private ContentSourceRepositoryInterface $sourceRepository;
public function __construct(
\PDO $pdo,
ContentOrderRepositoryInterface $orderRepository,
ContentVersionRepositoryInterface $versionRepository,
ContentSourceRepositoryInterface $sourceRepository
) {
$this->pdo = $pdo;
$this->orderRepository = $orderRepository;
$this->versionRepository = $versionRepository;
$this->sourceRepository = $sourceRepository;
}
// ==================== Delegation to specialized repositories ====================
public function findAllOrders(array $filters = [], int $limit = 50, int $offset = 0): array
{
return $this->orderRepository->findAllOrders($filters, $limit, $offset);
}
public function findOrder(int $id): ?array
{
return $this->orderRepository->findOrder($id);
}
public function getLastOrderSettings(): array
{
return $this->orderRepository->getLastOrderSettings();
}
public function createOrder(array $data): int
{
return $this->orderRepository->createOrder($data);
}
public function updateOrderStatus(int $id, string $status): void
{
$this->orderRepository->updateOrderStatus($id, $status);
}
public function updateGenerationStatus(int $id, string $status, ?string $error = null): void
{
$this->orderRepository->updateGenerationStatus($id, $status, $error);
}
public function updateCritiqueStatus(int $id, string $status, ?string $error = null): void
{
$this->orderRepository->updateCritiqueStatus($id, $status, $error);
}
public function updateOrder(int $id, array $data): bool
{
return $this->orderRepository->updateOrder($id, $data);
}
public function findVersionsByOrder(int $orderId): array
{
return $this->versionRepository->findVersionsByOrder($orderId);
}
public function findLatestVersion(int $orderId): ?array
{
return $this->versionRepository->findLatestVersion($orderId);
}
public function findVersion(int $id): ?array
{
return $this->versionRepository->findVersion($id);
}
public function findCritiquesByVersion(int $versionId): array
{
return $this->versionRepository->findCritiquesByVersion($versionId);
}
public function findSourcesByOrder(int $orderId): array
{
return $this->sourceRepository->findSourcesByOrder($orderId);
}
// ==================== Profiles ====================
public function findAllProfiles(): array
{
$stmt = $this->pdo->query("
SELECT id, name, slug, content as config
FROM content_config
WHERE type = 'author_profile' AND status = 'active'
ORDER BY name
");
return $stmt->fetchAll();
}
// ==================== Contracts ====================
public function findAllContracts(): array
{
$stmt = $this->pdo->query("
SELECT id, name, slug, content as config
FROM content_config
WHERE type = 'contract' AND status = 'active'
ORDER BY name
");
return $stmt->fetchAll();
}
// ==================== Structures ====================
public function findAllStructures(): array
{
$stmt = $this->pdo->query("
SELECT id, name, slug, content as config
FROM content_config
WHERE type = 'structure' AND status = 'active'
ORDER BY name
");
return $stmt->fetchAll();
}
// ==================== Critics ====================
public function findAllCritics(): array
{
$stmt = $this->pdo->query('
SELECT * FROM critics WHERE is_active = 1 ORDER BY sort_order
');
return $stmt->fetchAll();
}
// ==================== Statistics ====================
public function getStatistics(): array
{
$stats = [];
$stmt = $this->pdo->query('SELECT COUNT(*) FROM content_orders');
$stats['total_orders'] = (int) $stmt->fetchColumn();
$stmt = $this->pdo->query('SELECT status, COUNT(*) as count FROM content_orders GROUP BY status');
$stats['by_status'] = $stmt->fetchAll(\PDO::FETCH_KEY_PAIR);
$stmt = $this->pdo->query('SELECT COUNT(*) FROM content_versions');
$stats['total_versions'] = (int) $stmt->fetchColumn();
$stmt = $this->pdo->query('SELECT COUNT(*) FROM content_critiques');
$stats['total_critiques'] = (int) $stmt->fetchColumn();
return $stats;
}
}