Backup #1393
| ID | 1393 |
| Dateipfad | /var/www/dev.campus.systemische-tools.de/src/UseCases/Task/SaveTaskResultUseCase.php |
| Version | 3 |
| Typ |
modified |
| Größe | 3.6 KB |
| Hash | a446f23b1e2f14e6063e103d6a5067cfa958e24983a5775b06f04133efa6ccce |
| Datum | 2025-12-25 16:57:51 |
| Geändert von | claude-code-hook |
| Grund | Claude 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']);
$result = new TaskResult();
$result->setTaskId($taskId);
$result->setExecutor($data['executor']);
$result->setExecutorType($executorType);
if (isset($data['assignment_id'])) {
$result->setAssignmentId((int) $data['assignment_id']);
}
if (isset($data['model_name'])) {
$result->setModelName($data['model_name']);
}
if (isset($data['request'])) {
$result->setRequest($data['request']);
}
if (isset($data['response'])) {
$result->setResponse($data['response']);
}
if (isset($data['tokens_input'])) {
$result->setTokensInput((int) $data['tokens_input']);
}
if (isset($data['tokens_output'])) {
$result->setTokensOutput((int) $data['tokens_output']);
}
if (isset($data['duration_ms'])) {
$result->setDurationMs((int) $data['duration_ms']);
}
if (isset($data['cost_usd'])) {
$result->setCostUsd((float) $data['cost_usd']);
}
if (isset($data['error_message'])) {
$result->setErrorMessage($data['error_message']);
}
if (isset($data['status'])) {
$result->setStatus($data['status']);
}
if (!isset($data['tokens_input']) || !isset($data['tokens_output'])) {
$result->estimateTokens();
}
$id = $this->resultRepository->save($result);
$result->setId($id);
$status = $result->getStatus() === 'success' ? '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
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