/** * 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); $transaction->setRelatedIds(null); if ($data instanceof ArrayCollection) { if ($data->isEmpty()) { $data = $this->handleEmptyCollection($transaction, $data); } else { $data = $this->handleCollection($transaction, $data); } } elseif ($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->clear(); } else { $data = new CollectionResponse(new ArrayCollection(array())); } } return $data; }
/** * Handle collection * * @param Transaction $transaction transaction * @param mixed $data data * * @return CollectionResponse */ private function handleCollection(Transaction $transaction, $data) { $data = new CollectionResponse($data); if ($this->errorBuilder->hasErrors()) { $this->errorBuilder->setTransactionErrors($transaction); foreach ($this->errorBuilder->getErrors() as $error) { $errorCode = $error->getCode(); } } $status = !$this->errorBuilder->hasErrors() ? Transaction::STATUS_OK : $errorCode; $transaction->setStatus($status); $transaction->setSuccess(!$this->errorBuilder->hasErrors()); return $data; }