/**
  * @param UpdateTaskMetadata $command
  * @throws Exception\TaskNotFound
  */
 public function handle(UpdateTaskMetadata $command)
 {
     $task = $this->taskCollection->get($command->taskId());
     if (is_null($task)) {
         throw TaskNotFound::withId($command->taskId());
     }
     $task->updateMetadata($command->metadata());
 }
 public function handle(ScheduleNextTasksForWorkflow $command)
 {
     $workflow = $this->workflowCollection->get($command->workflowId());
     if (is_null($workflow)) {
         throw WorkflowNotFound::withId($command->workflowId());
     }
     $previousTask = $this->taskCollection->get($command->previousTaskId());
     if (is_null($previousTask)) {
         throw TaskNotFound::withId($command->previousTaskId());
     }
     $previousMessageHandler = $this->messageHandlerCollection->get($previousTask->messageHandlerId());
     if (is_null($previousMessageHandler)) {
         throw MessageHandlerNotFound::withId($previousTask->messageHandlerId());
     }
     $nextMessageHandler = $this->messageHandlerCollection->get($command->nextMessageHandlerId());
     if (is_null($nextMessageHandler)) {
         throw MessageHandlerNotFound::withId($command->nextMessageHandlerId());
     }
     $nextTasks = $workflow->determineNextTasks($previousTask, $previousMessageHandler, $nextMessageHandler);
     foreach ($nextTasks as $nextTask) {
         $this->taskCollection->add($nextTask);
     }
 }
 /**
  * @param TaskId $taskId
  * @return array
  * @throws MessageHandlerNotFound
  * @throws \RuntimeException
  * @throws TaskNotFound
  */
 private function translateToProcessingTask(TaskId $taskId)
 {
     $task = $this->taskCollection->get($taskId);
     if (is_null($task)) {
         throw TaskNotFound::withId($taskId);
     }
     $messageHandler = $this->messageHandlerCollection->get($task->messageHandlerId());
     if (is_null($messageHandler)) {
         throw MessageHandlerNotFound::withId($task->messageHandlerId());
     }
     $this->syncMessageHandler($messageHandler);
     $taskData = ['task_type' => $task->type()->toString(), 'metadata' => $task->metadata()->toArray()];
     if ($task->type()->isCollectData()) {
         $taskData['source'] = $messageHandler->processingId()->toString();
         $taskData['processing_type'] = $task->processingType()->of();
     } elseif ($task->type()->isProcessData()) {
         $taskData['target'] = $messageHandler->processingId()->toString();
         $taskData['allowed_types'] = [$task->processingType()->of()];
         $taskData['preferred_type'] = $task->processingType()->of();
     } else {
         throw new \RuntimeException("TaskType {$task->type()->toString()} is not supported yet");
     }
     return $taskData;
 }