Backup #1330

ID1330
Dateipfad/var/www/dev.campus.systemische-tools.de/src/Infrastructure/Persistence/CodeQualityRepository.php
Version4
Typ modified
Größe4.8 KB
Hashe63c8f24e4b95e4b5c9b0c245beb3e3f8de7319527b65ce10e8dcf9780970700
Datum2025-12-25 16:25:49
Geändert vonclaude-code-hook
GrundClaude Code Pre-Hook Backup vor Edit-Operation
Datei existiert Ja

Dateiinhalt

<?php

declare(strict_types=1);

namespace Infrastructure\Persistence;

// @responsibility: Persistenz für Code-Hygiene-Metriken (code_quality Tabelle)

use Domain\Repository\CodeQualityRepositoryInterface;
use PDO;

class CodeQualityRepository implements CodeQualityRepositoryInterface
{
    private PDO $pdo;

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

    /**
     * Speichert Hygiene-Daten für eine Analyse.
     *
     * @param array<string, mixed> $qualityData
     */
    public function saveQuality(int $analysisId, array $qualityData): void
    {
        // Delete existing quality data
        $this->pdo->prepare('DELETE FROM code_quality WHERE analysis_id = ?')->execute([$analysisId]);

        $stmt = $this->pdo->prepare('
            INSERT INTO code_quality (
                analysis_id, dependency_score, hygiene_score,
                factor_scores, hardcoded_count, issues_count, warnings_count, issues_json
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
        ');

        $factorScores = $qualityData['factor_scores'] ?? [];

        $stmt->execute([
            $analysisId,
            $factorScores['dependencies'] ?? 0,
            $qualityData['hygiene_score'] ?? 50,
            json_encode($factorScores),
            $qualityData['hardcoded_count'] ?? 0,
            $qualityData['issues_count'] ?? 0,
            $qualityData['warnings_count'] ?? 0,
            $qualityData['issues_json'] ?? '[]',
        ]);
    }

    /**
     * Holt alle Analysen mit Hygiene-Daten.
     *
     * @param array<string, mixed> $filters
     * @return array<array<string, mixed>>
     */
    public function findAllWithQuality(array $filters = [], int $limit = 100, int $offset = 0): array
    {
        $sql = '
            SELECT ca.*,
                   cq.dependency_score, cq.hygiene_score,
                   cq.factor_scores, cq.hardcoded_count, cq.issues_count,
                   cq.warnings_count, cq.issues_json
            FROM code_analysis ca
            LEFT JOIN code_quality cq ON ca.id = cq.analysis_id
            WHERE 1=1
        ';
        $params = [];

        if (!empty($filters['extension'])) {
            $sql .= ' AND ca.extension = :extension';
            $params['extension'] = $filters['extension'];
        }

        if (!empty($filters['namespace'])) {
            $sql .= ' AND ca.namespace = :namespace';
            $params['namespace'] = $filters['namespace'];
        }

        if (!empty($filters['search'])) {
            $sql .= ' AND (ca.file_name LIKE :search OR ca.namespace LIKE :search)';
            $params['search'] = '%' . $filters['search'] . '%';
        }

        if (!empty($filters['hygiene_status'])) {
            $sql .= ' AND cq.hygiene_status = :hygiene_status';
            $params['hygiene_status'] = $filters['hygiene_status'];
        }

        if (!empty($filters['has_issues'])) {
            $sql .= ' AND cq.issues_count > 0';
        }

        if (!empty($filters['min_score'])) {
            $sql .= ' AND cq.hygiene_score >= :min_score';
            $params['min_score'] = (int) $filters['min_score'];
        }

        if (!empty($filters['max_score'])) {
            $sql .= ' AND cq.hygiene_score <= :max_score';
            $params['max_score'] = (int) $filters['max_score'];
        }

        $sql .= ' ORDER BY ca.namespace, ca.file_name LIMIT :limit OFFSET :offset';

        $stmt = $this->pdo->prepare($sql);
        foreach ($params as $key => $value) {
            $stmt->bindValue(':' . $key, $value);
        }
        $stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
        $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
        $stmt->execute();

        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    /**
     * Holt Hygiene-Statistiken.
     *
     * @return array<string, mixed>
     */
    public function getQualityStats(): array
    {
        $stmt = $this->pdo->query('
            SELECT
                COUNT(*) as total_files,
                SUM(CASE WHEN hygiene_status = "Sauber" THEN 1 ELSE 0 END) as status_sauber,
                SUM(CASE WHEN hygiene_status = "Gepflegt" THEN 1 ELSE 0 END) as status_gepflegt,
                SUM(CASE WHEN hygiene_status = "Vernachlässigt" THEN 1 ELSE 0 END) as status_vernachlaessigt,
                SUM(CASE WHEN hygiene_status = "Verschmutzt" THEN 1 ELSE 0 END) as status_verschmutzt,
                SUM(CASE WHEN hygiene_status = "Kritisch" THEN 1 ELSE 0 END) as status_kritisch,
                SUM(issues_count) as total_issues,
                SUM(hardcoded_count) as total_hardcoded,
                AVG(hygiene_score) as avg_hygiene_score,
                MIN(hygiene_score) as min_hygiene_score,
                MAX(hygiene_score) as max_hygiene_score
            FROM code_quality
        ');

        return $stmt->fetch(PDO::FETCH_ASSOC) ?: [];
    }
}

Vollständig herunterladen

Aktionen

Herunterladen

Andere Versionen dieser Datei

ID Version Typ Größe Datum
1880 7 modified 4.1 KB 2025-12-27 23:52
1875 6 modified 4.1 KB 2025-12-27 23:51
1331 5 modified 4.6 KB 2025-12-25 16:25
1330 4 modified 4.8 KB 2025-12-25 16:25
1329 3 modified 4.8 KB 2025-12-25 16:25
1328 2 modified 4.9 KB 2025-12-25 16:25
1309 1 modified 4.2 KB 2025-12-25 16:15

← Zurück zur Übersicht