SaveTaskResultUseCase.php
- Pfad:
src/UseCases/Task/SaveTaskResultUseCase.php - Namespace: UseCases\Task
- Zeilen: 108 | Größe: 3,429 Bytes
- Geändert: 2025-12-28 14:25:35 | Gescannt: 2025-12-31 10:22:15
Code Hygiene Score: 98
- Dependencies: 90 (25%)
- LOC: 100 (20%)
- Methods: 100 (20%)
- Secrets: 100 (15%)
- Classes: 100 (10%)
- Magic Numbers: 100 (10%)
Keine Issues gefunden.
Dependencies 9
- constructor Domain\Repository\TaskRepositoryInterface
- constructor Infrastructure\Persistence\TaskResultRepository
- constructor Infrastructure\Persistence\TaskCommentRepository
- use Domain\Entity\TaskComment
- use Domain\Entity\TaskResult
- use Domain\Repository\TaskRepositoryInterface
- use Domain\ValueObject\AssigneeType
- use Infrastructure\Persistence\TaskCommentRepository
- use Infrastructure\Persistence\TaskResultRepository
Klassen 1
-
SaveTaskResultUseCaseclass Zeile 16
Funktionen 3
-
__construct()public Zeile 18 -
execute()public Zeile 25 -
validate()Zeile 91
Verwendet von 3
- ExecuteAITaskUseCase.php constructor
- TaskController.php constructor
- TaskController.php use
Versionen 4
-
v4
2025-12-28 14:25 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v3
2025-12-25 16:57 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v2
2025-12-23 08:15 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v1
2025-12-23 07:55 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation
Code
<?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->executor());
$comment->setAuthorType($executorType->isAI() ? 'ai' : 'human');
$comment->setCommentType('result');
$comment->setContent("Ergebnis gespeichert ({$status})");
$comment->setMetadata([
'result_id' => $id,
'model' => $result->modelName(),
'tokens_total' => $result->metrics()->tokens()->total(),
]);
$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');
}
}
}