/** * Handle * * @param Transaction $transaction Transaction * @param CrudEntityInterface|ArrayCollection $data Data * @param ConstraintViolationList|null $violations Violations * * @throws FeatureNotImplementedException * * @return CrudEntityInterface|CollectionResponse */ public function handle(Transaction $transaction, $data, ConstraintViolationList $violations = null) { $this->errorBuilder->processViolations($violations); $this->errorBuilder->setTransactionErrors($transaction); $success = !$this->errorBuilder->hasErrors(); $status = $success ? Transaction::STATUS_CREATED : Transaction::STATUS_CONFLICT; $transaction->setStatus($status); $transaction->setSuccess($success); if ($data instanceof ArrayCollection) { if ($data->isEmpty()) { $data = $this->handleEmptyCollection($transaction, $data); } else { $data = $this->handleCollection($transaction, $data); } } else { if ($data instanceof CrudEntityInterface) { $this->handleEntity($transaction, $data); } else { throw new FeatureNotImplementedException(get_class($data) . ' class is not supported by transactions (POST). Instance of ArrayCollection needed.'); } } if (!$transaction->getSuccess()) { if ($data instanceof ArrayCollection) { $data->getItems()->clear(); } else { $transaction->setRelatedIds(null); $data = new CollectionResponse(new ArrayCollection(array())); $data->setShowAssociations(true); } } 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); }