diff --git a/src/Exception/InvalidArgumentException.php b/src/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..055ef53 --- /dev/null +++ b/src/Exception/InvalidArgumentException.php @@ -0,0 +1,14 @@ +persist​($customer); + $resultList[] = $item; + } + return $resultList; + } +} + diff --git a/src/Process/Entity/EntityManagerFactory.php b/src/Process/Entity/EntityManagerFactory.php new file mode 100644 index 0000000..3118abb --- /dev/null +++ b/src/Process/Entity/EntityManagerFactory.php @@ -0,0 +1,21 @@ +createEntityManager(); + try { + return $unitTracker->next([ + "entityManager" => $entityManager + ]); + } finally { + $entityManager->close(); + } + } +} + diff --git a/src/Process/Entity/EntityManagerTransaction.php b/src/Process/Entity/EntityManagerTransaction.php new file mode 100644 index 0000000..c68c36c --- /dev/null +++ b/src/Process/Entity/EntityManagerTransaction.php @@ -0,0 +1,27 @@ +getTransaction(); + $transaction->begin(); + try { + $result = $unitTracker->next([ + "entityManager" => $entityManager + ]); + $transaction->commit(); + return $result; + } catch (Throwable $th) { + $transaction->rollback(); + throw $th; + } + } +} + diff --git a/src/Process/Entity/ReadEntities.php b/src/Process/Entity/ReadEntities.php new file mode 100644 index 0000000..b95e70a --- /dev/null +++ b/src/Process/Entity/ReadEntities.php @@ -0,0 +1,35 @@ +class = $class; + $this->name = $name; + } + + /** + * Store list of cusomers into the repositoer + * + * + * @param EntityQuery $entityQuery to perform on entities + * @return array of results + */ + public function __invoke(EntityQuery $entityQuery): array + { + return $entityQuery->entity($this->class) + ->mode('select') + ->exec(); + } + +} + diff --git a/src/Process/Http/RequestToEntityQuery.php b/src/Process/Http/RequestToEntityQuery.php new file mode 100644 index 0000000..e239ca8 --- /dev/null +++ b/src/Process/Http/RequestToEntityQuery.php @@ -0,0 +1,27 @@ +createQuery(); + //XXX: maso, 2021: read params from the request header. + return $unitTracker->next([ + 'entityQuery' => $entityQuery + ]); + } +} + diff --git a/src/Process/Http/ResponseBodyEncoder.php b/src/Process/Http/ResponseBodyEncoder.php index 5538ffe..ee6afd9 100644 --- a/src/Process/Http/ResponseBodyEncoder.php +++ b/src/Process/Http/ResponseBodyEncoder.php @@ -44,20 +44,10 @@ public function __invoke( try { $result = $unitTracker->next(); } catch (Throwable $t) { - if (! ($t instanceof Exception)) { - $ex = new Exception\UnhandledException( - message: $t->getMessage(), - previous: $t); - } else { - $ex = $t; - } - $status = $ex->getStatus(); - // TODO: maso, 2021: enable exception json annotations - $result = [ - 'message' => $t->getMessage() - ]; + $result = $this->convertToSerializable($t); + $status = $result->getStatus(); } - + // TODO: maso, 2021: support objectMapper // $supportMime = $request->getHeader("Accepted"); $contentType = 'application/json'; @@ -67,5 +57,29 @@ public function __invoke( ->withHeader("Content-Type", $contentType) ->withBody($streamFactory->createStream($resultEncode)); } + + public function convertToSerializable(Throwable $t){ + if ($t instanceof Exception) { + return $t; + } + $message = $t->getMessage(); + $params = []; + $solutions = []; + $previous = $t; + if($t instanceof \Pluf\Orm\Exception){ + $params = $t->getParams(); + $solutions = $t->getSolutions(); + } else if($t instanceof \atk4\core\Exception){ + $params = $t->getParams(); + $solutions = $t->getSolutions(); + } + return new Exception\UnhandledException( + status: 500, + code: $t->getCode(), + message: $t->getMessage(), + params: $params, + previous: $previous, + solutions: $solutions); + } } diff --git a/src/Process/HttpBodyToEntities.php b/src/Process/HttpBodyToEntities.php new file mode 100644 index 0000000..cc9107d --- /dev/null +++ b/src/Process/HttpBodyToEntities.php @@ -0,0 +1,88 @@ +class = $class; + $this->multi = $multi; + $this->name = $name; + } + + public function __invoke( + ModelDescriptionRepository $modelDescriptionRepository, + ServerRequestInterface $request, + UnitTrackerInterface $unitTracker) + { + $this->assertEquals("POST", $request->getMethod(), "Unsupported method {{method}}", ["method" => $request->getMethod()]); + + $type = $this->getContentType($request); + $this->assertNotEmpty($type, "Content type is not specified."); + switch ($type) { + case "json": + $data = $request->getBody(); + break; + case "array": + default: + $data = $request->getParsedBody(); + break; + } + + $builder = new ObjectMapperBuilder(); + $objectMapper = $builder->addType($type) + ->setModelDescriptionRepository($modelDescriptionRepository) + ->supportList($this->multi) + ->build(); + + $res = []; + $res[$this->name] = $objectMapper->readValue($data, $this->class, $this->multi); + return $unitTracker->next($res); + } + + public function getContentType(ServerRequestInterface $request): string + { + $contentTypes = $request->getHeader("Content-Type") ?? []; + + $parsedContentType = 'application/json'; + foreach ($contentTypes as $contentType) { + $fragments = explode(';', $contentType); + $parsedContentType = current($fragments); + } + $contentTypesWithParsedBodies = [ + 'application/json', + 'application/xml', + 'application/yml' + ]; + + $type = null; + if (in_array($parsedContentType, $contentTypesWithParsedBodies)) { + switch ($parsedContentType) { + case 'application/json': + $type = "json"; + break; + case 'application/xml': + case 'application/yml': + default: + $type = null; + } + } else { + $type = "array"; + } + + return $type; + } +} +