Backup #2018

ID2018
Dateipfad/var/www/dev.campus.systemische-tools.de/src/UseCases/Task/SaveTaskResultUseCase.php
Version4
Typ modified
Größe3.3 KB
Hasha222495d0d821f2692ec5ae5ee798a38c043581f5962eaf5f74af2001829f2db
Datum2025-12-28 14:25:35
Geändert vonclaude-code-hook
GrundClaude Code Pre-Hook Backup vor Edit-Operation
Datei existiert Ja

Dateiinhalt

<?php

declare(strict_types=1);

namespace UseCases\Task;

// @responsibility: Speichert Task-Ergebnisse mit Token-Tracking

use Domain\Entity\TaskComment;
use Domain\Entity\TaskResult;
use Domain\Repository\TaskRepositoryInterface;
use Domain\ValueObject\AssigneeType;
use Infrastructure\Persistence\TaskCommentRepository;
use Infrastructure\Persistence\TaskResultRepository;

class SaveTaskResultUseCase
{
    public function __construct(
        private TaskRepositoryInterface $taskRepository,
        private TaskResultRepository $resultRepository,
        private TaskCommentRepository $commentRepository
    ) {
    }

    public function execute(int $taskId, array $data): TaskResult
    {
        $this->validate($data);

        $task = $this->taskRepository->find($taskId);
        if ($task === null) {
            throw new \InvalidArgumentException("Task {$taskId} not found");
        }

        $executorType = AssigneeType::from($data['executor_type']);
        $builder = TaskResult::builder($taskId, $data['executor'], $executorType);

        if (isset($data['assignment_id'])) {
            $builder->withAssignment((int) $data['assignment_id']);
        }

        if (isset($data['model_name'])) {
            $builder->withModel($data['model_name']);
        }

        if (isset($data['request'])) {
            $builder->withRequest($data['request']);
        }

        if (isset($data['response'])) {
            $builder->withResponse($data['response']);
        }

        if (isset($data['tokens_input'], $data['tokens_output'])) {
            $builder->withTokens((int) $data['tokens_input'], (int) $data['tokens_output']);
        } else {
            $builder->estimateTokens();
        }

        if (isset($data['cost_usd'])) {
            $builder->withCost((float) $data['cost_usd']);
        }

        if (isset($data['error_message'])) {
            $builder->withError($data['error_message']);
        } elseif (isset($data['status'])) {
            $builder->withStatus(\Domain\ValueObject\ResultStatus::from($data['status']));
        }

        $result = $builder->build();

        $id = $this->resultRepository->save($result);
        $result->setId($id);

        $status = $result->isSuccess() ? 'erfolgreich' : 'mit Fehler';
        $comment = new TaskComment();
        $comment->setTaskId($taskId);
        $comment->setAuthor($result->getExecutor());
        $comment->setAuthorType($executorType->isAI() ? 'ai' : 'human');
        $comment->setCommentType('result');
        $comment->setContent("Ergebnis gespeichert ({$status})");
        $comment->setMetadata([
            'result_id' => $id,
            'model' => $result->getModelName(),
            'tokens_total' => $result->getTokensTotal(),
        ]);
        $this->commentRepository->save($comment);

        return $result;
    }

    private function validate(array $data): void
    {
        if (!isset($data['executor']) || $data['executor'] === '') {
            throw new \InvalidArgumentException('Executor is required');
        }

        if (!isset($data['executor_type']) || $data['executor_type'] === '') {
            throw new \InvalidArgumentException('Executor type is required');
        }

        try {
            AssigneeType::from($data['executor_type']);
        } catch (\ValueError $e) {
            throw new \InvalidArgumentException('Invalid executor type');
        }
    }
}

Vollständig herunterladen

Aktionen

Herunterladen

Andere Versionen dieser Datei

ID Version Typ Größe Datum
2018 4 modified 3.3 KB 2025-12-28 14:25
1393 3 modified 3.6 KB 2025-12-25 16:57
828 2 modified 4.0 KB 2025-12-23 08:15
711 1 modified 3.9 KB 2025-12-23 07:55

← Zurück zur Übersicht