Backup #2000

ID2000
Dateipfad/var/www/dev.campus.systemische-tools.de/src/Domain/Entity/TaskResult.php
Version8
Typ modified
Größe7.0 KB
Hash5c6849b0c014178da751e91530bc6f3a71d3e6e62b6f4ed85ba0e37edfdda8d3
Datum2025-12-28 14:17:01
Geändert vonclaude-code-hook
GrundClaude Code Pre-Hook Backup vor Edit-Operation
Datei existiert Ja

Dateiinhalt

<?php

declare(strict_types=1);

namespace Domain\Entity;

// @responsibility: Task-Ergebnis-Entität mit Rich Domain Logic

use Domain\ValueObject\AssigneeType;
use Domain\ValueObject\ExecutionDuration;
use Domain\ValueObject\ExecutionMetrics;
use Domain\ValueObject\ResultStatus;
use Domain\ValueObject\TokenCount;

class TaskResult
{
    private ?int $id = null;
    private \DateTimeImmutable $createdAt;

    public function __construct(
        private int $taskId,
        private ?int $assignmentId,
        private string $executor,
        private AssigneeType $executorType,
        private ?string $modelName,
        private ?string $request,
        private ?string $response,
        private ExecutionDuration $duration,
        private ExecutionMetrics $metrics,
        private ResultStatus $status,
        private ?string $errorMessage
    ) {
        $this->createdAt = new \DateTimeImmutable();
    }

    // Factory Methods
    public static function builder(int $taskId, string $executor, AssigneeType $executorType): TaskResultBuilder
    {
        return new TaskResultBuilder($taskId, $executor, $executorType);
    }

    // Getters - Only for necessary access
    public function id(): ?int { return $this->id; }
    public function taskId(): int { return $this->taskId; }
    public function assignmentId(): ?int { return $this->assignmentId; }
    public function executor(): string { return $this->executor; }
    public function executorType(): AssigneeType { return $this->executorType; }
    public function modelName(): ?string { return $this->modelName; }
    public function request(): ?string { return $this->request; }
    public function response(): ?string { return $this->response; }
    public function duration(): ExecutionDuration { return $this->duration; }
    public function metrics(): ExecutionMetrics { return $this->metrics; }
    public function status(): ResultStatus { return $this->status; }
    public function errorMessage(): ?string { return $this->errorMessage; }
    public function createdAt(): \DateTimeImmutable { return $this->createdAt; }

    // Setter only for infrastructure (persistence)
    public function setId(int $id): void { $this->id = $id; }

    // Domain Logic
    public function isSuccess(): bool { return $this->status === ResultStatus::SUCCESS; }
    public function hasError(): bool { return $this->status === ResultStatus::ERROR; }
    public function hasModel(): bool { return $this->modelName !== null; }

    public function summary(): string
    {
        $parts = [$this->executor, $this->status->label()];
        if ($this->modelName !== null) {
            $parts[] = "({$this->modelName})";
        }
        return implode(' - ', $parts);
    }

    // Legacy getters for backward compatibility (deprecated)
    public function getId(): ?int { return $this->id; }
    public function getTaskId(): int { return $this->taskId; }
    public function getAssignmentId(): ?int { return $this->assignmentId; }
    public function getExecutor(): string { return $this->executor; }
    public function getExecutorType(): AssigneeType { return $this->executorType; }
    public function getModelName(): ?string { return $this->modelName; }
    public function getRequest(): ?string { return $this->request; }
    public function getResponse(): ?string { return $this->response; }
    public function getRequestTimestamp(): \DateTimeImmutable { return $this->duration->requestedAt(); }
    public function getResponseTimestamp(): ?\DateTimeImmutable { return $this->duration->respondedAt(); }
    public function getDurationMs(): ?int { return $this->duration->durationMs(); }
    public function getTokensInput(): ?int { return $this->metrics->tokens()->input(); }
    public function getTokensOutput(): ?int { return $this->metrics->tokens()->output(); }
    public function getTokensTotal(): ?int { return $this->metrics->tokens()->total(); }
    public function getCostUsd(): ?float { return $this->metrics->costUsd(); }
    public function getStatus(): string { return $this->status->value; }
    public function getErrorMessage(): ?string { return $this->errorMessage; }
    public function getCreatedAt(): \DateTimeImmutable { return $this->createdAt; }

    // Serialization
    public function toArray(): array
    {
        $durationData = $this->duration->toArray();
        $metricsData = $this->metrics->toArray();

        return [
            'id' => $this->id,
            'task_id' => $this->taskId,
            'assignment_id' => $this->assignmentId,
            'executor' => $this->executor,
            'executor_type' => $this->executorType->value,
            'model_name' => $this->modelName,
            'request' => $this->request,
            'response' => $this->response,
            'request_timestamp' => $durationData['requested_at'],
            'response_timestamp' => $durationData['responded_at'],
            'duration_ms' => $durationData['duration_ms'],
            'tokens_input' => $metricsData['tokens_input'],
            'tokens_output' => $metricsData['tokens_output'],
            'tokens_total' => $metricsData['tokens_total'],
            'cost_usd' => $metricsData['cost_usd'],
            'status' => $this->status->value,
            'error_message' => $this->errorMessage,
            'created_at' => $this->createdAt->format('Y-m-d H:i:s.u'),
        ];
    }

    public static function fromArray(array $data): self
    {
        $executorType = AssigneeType::from($data['executor_type']);
        $status = isset($data['status']) ? ResultStatus::from($data['status']) : ResultStatus::SUCCESS;

        $requestTimestamp = isset($data['request_timestamp'])
            ? new \DateTimeImmutable($data['request_timestamp'])
            : new \DateTimeImmutable();

        $responseTimestamp = isset($data['response_timestamp'])
            ? new \DateTimeImmutable($data['response_timestamp'])
            : null;

        $duration = $responseTimestamp !== null
            ? ExecutionDuration::completed($requestTimestamp, $responseTimestamp)
            : ExecutionDuration::start($requestTimestamp);

        $tokens = TokenCount::fromNullable(
            $data['tokens_input'] ?? null,
            $data['tokens_output'] ?? null
        );

        $metrics = ExecutionMetrics::create(
            $tokens,
            isset($data['cost_usd']) ? (float) $data['cost_usd'] : null,
            isset($data['duration_ms']) ? (int) $data['duration_ms'] : null
        );

        $result = new self(
            (int) $data['task_id'],
            isset($data['assignment_id']) ? (int) $data['assignment_id'] : null,
            $data['executor'],
            $executorType,
            $data['model_name'] ?? null,
            $data['request'] ?? null,
            $data['response'] ?? null,
            $duration,
            $metrics,
            $status,
            $data['error_message'] ?? null
        );

        if (isset($data['id'])) {
            $result->setId((int) $data['id']);
        }

        if (isset($data['created_at'])) {
            $result->createdAt = new \DateTimeImmutable($data['created_at']);
        }

        return $result;
    }
}

Vollständig herunterladen

Aktionen

Herunterladen

Andere Versionen dieser Datei

ID Version Typ Größe Datum
2000 8 modified 7.0 KB 2025-12-28 14:17
1949 7 modified 7.4 KB 2025-12-28 02:24
1948 6 modified 7.7 KB 2025-12-28 02:23
1400 5 modified 7.6 KB 2025-12-25 16:58
1385 4 modified 7.9 KB 2025-12-25 16:57
1381 3 modified 9.2 KB 2025-12-25 16:57
1372 2 modified 9.4 KB 2025-12-25 16:56
810 1 modified 9.3 KB 2025-12-23 08:08

← Zurück zur Übersicht