taskRepository = $taskRepository ?? new TaskRepository(); $this->commentRepository = $commentRepository ?? new TaskCommentRepository(); } public function execute(array $data): Task { $this->validate($data); $task = new Task(); $task->setTitle($data['title']); $task->setCreatedBy($data['created_by'] ?? 'system'); $task->setCreatedByType($data['created_by_type'] ?? 'human'); if (isset($data['description'])) { $task->setDescription($data['description']); } if (isset($data['type'])) { $task->setType($data['type']); } if (isset($data['parent_task_id'])) { $task->setParentTaskId((int) $data['parent_task_id']); } if (isset($data['due_date'])) { $task->setDueDate(new \DateTimeImmutable($data['due_date'])); } if (isset($data['metadata'])) { $task->setMetadata($data['metadata']); } $id = $this->taskRepository->save($task); $task->setId($id); $comment = new TaskComment(); $comment->setTaskId($id); $comment->setAuthor($task->getCreatedBy()); $comment->setAuthorType($task->getCreatedByType()); $comment->setCommentType('note'); $comment->setContent('Task erstellt'); $this->commentRepository->save($comment); return $task; } private function validate(array $data): void { if (!isset($data['title']) || $data['title'] === '') { throw new \InvalidArgumentException('Title is required'); } if (strlen($data['title']) > 255) { throw new \InvalidArgumentException('Title must be 255 characters or less'); } if (isset($data['type']) && !in_array($data['type'], ['human_task', 'ai_task', 'mixed'])) { throw new \InvalidArgumentException('Invalid task type'); } } }