/**
  * Set transaction messages
  *
  * @param Transaction $transaction Transaction
  * @return $this
  */
 public function setTransactionMessages(Transaction $transaction)
 {
     $messages = $transaction->getMessages();
     $messages->set('info', $this->messages);
     $transaction->setMessages($messages);
     return $this;
 }
 /**
  * Setting transaction notices
  *
  * @param Transaction &$transaction
  *
  * @return void
  */
 public function setTransactionNotices(Transaction &$transaction)
 {
     $messages = $transaction->getMessages();
     if (!$this->isEmpty()) {
         $messages->set('notices', $this->getNotices());
     }
     $transaction->setMessages($messages);
 }
 /**
  * Handle
  *
  * @param Transaction             $transaction transaction
  * @param mixed                   $data        data
  * @param ConstraintViolationList $violations  violations
  *
  * @throws FeatureNotImplementedException
  * @throws \Exception
  *
  * @return CollectionResponse|CrudEntityInterface
  */
 public function handle(Transaction $transaction, $data, ConstraintViolationList $violations = null)
 {
     if (is_array($data)) {
         $data = new ArrayCollection($data);
     }
     $handled = false;
     foreach ($this->handlers as $handler) {
         if (!$handler instanceof TransactionHandlerInterface) {
             throw new \Exception('Handler must be instance of TransactionHandlerInterface');
         }
         if ($handler->supports() === $transaction->getMethod()) {
             $data = $handler->handle($transaction, $data, $violations);
             $handled = true;
         }
     }
     if (!$handled) {
         throw new FeatureNotImplementedException('Method ' . $transaction->getMethod() . ' is not supported yet.');
     }
     $data->setTransaction($transaction);
     return $data;
 }
 /**
  * Handle individual entity
  *
  * @param Transaction         $transaction Transaction
  * @param CrudEntityInterface $entity      Entity
  *
  * @return void
  */
 private function handleEntity($transaction, CrudEntityInterface $entity)
 {
     $transaction->setRequestSource(Transaction::SOURCE_SERVICE);
     $transaction->setId(UUID::generate());
     $transaction->setRequestId(microtime());
     $transaction->setRelatedIds($entity->getIds());
     $errors = $this->errorBuilder->getEntityErrors($entity->getPrimaryKey());
     $messages = new ArrayCollection();
     $success = $errors->isEmpty();
     $status = $success ? Transaction::STATUS_CREATED : Transaction::STATUS_CONFLICT;
     $transaction->setStatus($status);
     $transaction->setSuccess($success);
     if ($success) {
         $this->noticeBuilder->addSuccess();
     } else {
         $messages->set('errors', $errors);
         $this->noticeBuilder->addFail();
     }
     $transaction->setMessages($messages);
     $em = $this->registry->getManagerForClass(get_class($transaction));
     $em->persist($transaction);
     $entity->setTransaction($transaction);
 }
 /**
  * Building transaction
  *
  * @return Transaction
  */
 public function build()
 {
     $datetime = new \DateTime();
     $transaction = new Transaction();
     $transaction->setMethod($this->requestMethod)->setRelatedRoute($this->relatedRoute)->setRelatedIds($this->relatedIds)->setRequestId(microtime())->setId(UUID::generate())->setRequestSource($this->requestSource)->setModel($this->model)->setCreatedAt($datetime)->setUpdatedAt($datetime);
     return $transaction;
 }
 /**
  * Setting transaction errors
  *
  * @param Transaction &$transaction
  *
  * @return void
  */
 public function setTransactionErrors(Transaction &$transaction)
 {
     $messages = new ArrayCollection();
     $globalErrors = $this->getErrors(Error::CONTEXT_GLOBAL);
     if (!$globalErrors->isEmpty()) {
         $transaction->setStatus(Transaction::STATUS_NOT_FOUND);
     }
     $errors = $this->getErrors();
     if (!$errors->isEmpty()) {
         $messages->set('errors', $errors);
     }
     if ($messages->count()) {
         $transaction->setMessages($messages);
     }
 }