CritiqueDTO.php

Code Hygiene Score: 100

Keine Issues gefunden.

Dependencies 1

Klassen 1

Funktionen 5

Versionen 1

Code

<?php

declare(strict_types=1);

namespace Domain\DTO;

// @responsibility: DTO für Content-Kritik-Daten aus Repository

final readonly class CritiqueDTO
{
    public function __construct(
        public int $id,
        public int $versionId,
        public int $criticId,
        public string $criticName,
        public string $feedback,
        public ?int $score,
        public string $model,
        public int $tokensInput,
        public int $tokensOutput,
        public float $costUsd,
        public int $durationMs,
        public \DateTimeImmutable $createdAt,
    ) {
    }

    /**
     * Create from database row.
     *
     * @param array<string, mixed> $row
     */
    public static function fromDatabaseRow(array $row): self
    {
        $id = isset($row['id']) ? (int) $row['id'] : 0;
        $versionId = isset($row['version_id']) ? (int) $row['version_id'] : 0;
        $criticId = isset($row['critic_id']) ? (int) $row['critic_id'] : 0;
        $criticName = isset($row['critic_name']) ? (string) $row['critic_name'] : 'Unbekannt';
        $feedback = isset($row['feedback']) ? (string) $row['feedback'] : '';
        $score = isset($row['score']) ? (int) $row['score'] : null;
        $model = isset($row['model']) ? (string) $row['model'] : 'unknown';
        $tokensInput = isset($row['tokens_input']) ? (int) $row['tokens_input'] : 0;
        $tokensOutput = isset($row['tokens_output']) ? (int) $row['tokens_output'] : 0;
        $costUsd = isset($row['cost_usd']) ? (float) $row['cost_usd'] : 0.0;
        $durationMs = isset($row['duration_ms']) ? (int) $row['duration_ms'] : 0;
        $createdAtStr = isset($row['created_at']) ? (string) $row['created_at'] : 'now';

        return new self(
            id: $id,
            versionId: $versionId,
            criticId: $criticId,
            criticName: $criticName,
            feedback: $feedback,
            score: $score,
            model: $model,
            tokensInput: $tokensInput,
            tokensOutput: $tokensOutput,
            costUsd: $costUsd,
            durationMs: $durationMs,
            createdAt: new \DateTimeImmutable($createdAtStr),
        );
    }

    /**
     * Check if critique has a score.
     */
    public function hasScore(): bool
    {
        return $this->score !== null;
    }

    /**
     * Get score as percentage (0-100).
     */
    public function scorePercentage(): ?int
    {
        return $this->score;
    }

    /**
     * Get feedback preview.
     */
    public function feedbackPreview(int $length = 150): string
    {
        if (mb_strlen($this->feedback) <= $length) {
            return $this->feedback;
        }

        return mb_substr($this->feedback, 0, $length) . '...';
    }
}
← Übersicht Graph