DokumentExplorerRepository.php

Code Hygiene Score: 100

Keine Issues gefunden.

Dependencies 4

Klassen 1

Funktionen 7

Verwendet von 1

Code

<?php

declare(strict_types=1);

namespace Infrastructure\Persistence;

use Domain\Repository\DokumentExplorerRepositoryInterface;
use PDO;

// @responsibility: Persistenz für Dokument-Explorer (Root-Dokumente mit Stats)

class DokumentExplorerRepository implements DokumentExplorerRepositoryInterface
{
    private PDO $pdo;

    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }

    public function countDokumente(): int
    {
        return (int) $this->pdo->query(
            'SELECT COUNT(*) FROM dokumentation WHERE depth = 0'
        )->fetchColumn();
    }

    /**
     * @return array<array<string, mixed>>
     */
    public function getDokumenteWithStats(): array
    {
        return $this->pdo->query(
            'SELECT d.id, d.title, d.path,
                    (SELECT COUNT(*) FROM dokumentation WHERE parent_id = d.id) as seiten_count,
                    (SELECT COUNT(*) FROM dokumentation_chunks WHERE dokumentation_id = d.id) as chunks_count
             FROM dokumentation d
             WHERE d.depth = 0
             ORDER BY d.title'
        )->fetchAll(PDO::FETCH_ASSOC);
    }

    /**
     * @return array<array<string, mixed>>
     */
    public function getDokumenteWithFullStats(): array
    {
        return $this->pdo->query(
            'SELECT d.id, d.title, d.path, d.content, d.created_at, d.updated_at,
                    (SELECT COUNT(*) FROM dokumentation WHERE parent_id = d.id) as seiten_count,
                    (SELECT COUNT(*) FROM dokumentation_chunks WHERE dokumentation_id IN
                        (SELECT id FROM dokumentation WHERE parent_id = d.id OR id = d.id)) as total_chunks,
                    (SELECT COALESCE(SUM(token_count), 0) FROM dokumentation_chunks WHERE dokumentation_id IN
                        (SELECT id FROM dokumentation WHERE parent_id = d.id OR id = d.id)) as total_tokens
             FROM dokumentation d
             WHERE d.depth = 0
             ORDER BY d.title'
        )->fetchAll(PDO::FETCH_ASSOC);
    }

    /**
     * @return array<string, mixed>|null
     */
    public function getDokument(int $id): ?array
    {
        $stmt = $this->pdo->prepare(
            'SELECT d.*, p.title as parent_title
             FROM dokumentation d
             LEFT JOIN dokumentation p ON d.parent_id = p.id
             WHERE d.id = :id'
        );
        $stmt->execute(['id' => $id]);
        $result = $stmt->fetch(PDO::FETCH_ASSOC);

        return $result !== false ? $result : null;
    }

    /**
     * @return array<string, mixed>|null
     */
    public function getDokumentRoot(int $id): ?array
    {
        $stmt = $this->pdo->prepare(
            'SELECT * FROM dokumentation WHERE id = :id AND depth = 0'
        );
        $stmt->execute(['id' => $id]);
        $result = $stmt->fetch(PDO::FETCH_ASSOC);

        return $result !== false ? $result : null;
    }

    /**
     * @return array<array<string, mixed>>
     */
    public function getDokumenteForFilter(): array
    {
        return $this->pdo->query(
            'SELECT id, title FROM dokumentation WHERE depth = 0 ORDER BY title'
        )->fetchAll(PDO::FETCH_ASSOC);
    }
}
← Übersicht Graph