taskRepository = $taskRepository ?? new TaskRepository(); $this->assignmentRepository = $assignmentRepository ?? new TaskAssignmentRepository(); $this->commentRepository = $commentRepository ?? new TaskCommentRepository(); } public function execute(int $taskId, array $data): TaskAssignment { $this->validate($data); $task = $this->taskRepository->find($taskId); if ($task === null) { throw new \InvalidArgumentException("Task {$taskId} not found"); } $assigneeType = AssigneeType::from($data['assignee_type']); $assignment = new TaskAssignment(); $assignment->setTaskId($taskId); $assignment->setAssignee($data['assignee']); $assignment->setAssigneeType($assigneeType); $assignment->setAssignedBy($data['assigned_by'] ?? 'system'); $assignment->setAssignedByType($data['assigned_by_type'] ?? 'human'); if (isset($data['model_name'])) { $assignment->setModelName($data['model_name']); } if (isset($data['notes'])) { $assignment->setNotes($data['notes']); } $id = $this->assignmentRepository->save($assignment); $assignment->setId($id); $comment = TaskComment::createAssignmentNote( $taskId, $assignment->getAssignedBy(), $assignment->getAssignedByType(), $assignment->getAssignee(), $assigneeType->label() ); $this->commentRepository->save($comment); return $assignment; } private function validate(array $data): void { if (!isset($data['assignee']) || $data['assignee'] === '') { throw new \InvalidArgumentException('Assignee is required'); } if (!isset($data['assignee_type']) || $data['assignee_type'] === '') { throw new \InvalidArgumentException('Assignee type is required'); } try { AssigneeType::from($data['assignee_type']); } catch (\ValueError $e) { throw new \InvalidArgumentException('Invalid assignee type'); } } }