From e51d1ea7a31356be9a0bc46b4d3fc7b840f02135 Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Fri, 19 Jun 2026 19:46:32 +0000 Subject: [PATCH] - WIP on ApiRenderer and Save Form context@ --- src/Entity/Error.php | 79 ++++++++++++++++++++++++++++++++++ src/Form/Save.php | 12 ++++-- src/Lib/FormContext.php | 2 +- src/Middleware/ApiRenderer.php | 32 ++++++++------ 4 files changed, 107 insertions(+), 18 deletions(-) create mode 100644 src/Entity/Error.php diff --git a/src/Entity/Error.php b/src/Entity/Error.php new file mode 100644 index 0000000..2dc2468 --- /dev/null +++ b/src/Entity/Error.php @@ -0,0 +1,79 @@ +message) > 255 ? mb_substr($this->message, 0, 255) . "[...]" : $this->message; + } + + public static function searchRequest(...$arguments) : SearchRequestInterface + { + return new #[SearchRequest\Attribute\SearchRequestParameter(Error::class)] class(...$arguments) extends SearchRequest\SearchRequest { + #[SearchRequest\Attribute\SearchWhere(source: SearchRequest\Attribute\PropertyValueSource::RequestAttribute)] + public int $id; + + #[SearchWhere(method: SearchMethodEnum::Like)] + public string $message; + + #[SearchOrderBy(parameter: "created_at",)] + public string $createdAt = SearchOrderBy::DESCENDING; + }; + } +} \ No newline at end of file diff --git a/src/Form/Save.php b/src/Form/Save.php index a752b0a..053b412 100644 --- a/src/Form/Save.php +++ b/src/Form/Save.php @@ -57,14 +57,18 @@ abstract class Save extends Form implements \Picea\Ui\Method\FormInterface { if ($entity->isLoaded() && ! $this->skipEntityLastModified) { if (property_exists($entity, 'updatedAt') && $entity->repository()->generateDatasetDiff($entity) ) { - $cls = $entity::resolveEntity()->field('updatedAt')->type->type; - $entity->updatedAt = new $cls(); + if ($field = $entity::resolveEntity()->field('updatedAt')) { + $cls = $field->type->type; + $entity->updatedAt = new $cls(); + } } } elseif (! $this->skipEntityCreatedAt) { if (property_exists($entity, 'createdAt') && empty($entity->createdAt)) { - $cls = $entity::resolveEntity()->field('createdAt')->type->type; - $entity->createdAt = new $cls(); + if ($field = $entity::resolveEntity()->field('createdAt')) { + $cls = $field->type->type; + $entity->createdAt = new $cls(); + } } } diff --git a/src/Lib/FormContext.php b/src/Lib/FormContext.php index d87f874..36c9b91 100644 --- a/src/Lib/FormContext.php +++ b/src/Lib/FormContext.php @@ -40,7 +40,7 @@ class FormContext extends \Picea\Ui\Method\FormContext { public function pushErrorMessage($key, $variables = []) { $this->pushMessage($this->message::generateError( - $this->lang($key, $variables) + $a = $this->lang($key, $variables) )); } diff --git a/src/Middleware/ApiRenderer.php b/src/Middleware/ApiRenderer.php index bf2b5e8..9725cd4 100644 --- a/src/Middleware/ApiRenderer.php +++ b/src/Middleware/ApiRenderer.php @@ -5,16 +5,18 @@ namespace Lean\Api\Middleware; use Laminas\Diactoros\Response\JsonResponse; use Lean\Factory\HttpFactory; use Picea\Ui\Method\FormHandler; +use Psr\Container\ContainerInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; -use Lean\Api\{Factory\DebugFormFactoryInterface, Form, Entity}; +use Lean\Api\{Controller\Debug, Factory\DebugFormFactoryInterface, Form, Entity}; class ApiRenderer implements MiddlewareInterface { public function __construct( - protected DebugFormFactoryInterface $debugFormFactory, + protected ContainerInterface $container, + # protected DebugFormFactoryInterface $debugFormFactory, ) { } @@ -25,6 +27,8 @@ class ApiRenderer implements MiddlewareInterface { } catch(\Throwable $ex) { if (static::awaitingJson($request)) { + $this->saveError($request, $ex); + return HttpFactory::createJsonResponse([ 'status' => 'failed', 'ts' => time(), @@ -59,21 +63,23 @@ class ApiRenderer implements MiddlewareInterface { protected function saveError(ServerRequestInterface $request, \Throwable $exception) : Entity\Error { - $request = $request->withMethod('PUT')->withParsedBody([]); + if ($debugFormFactory = $this->container->get(DebugFormFactoryInterface::class)) { + $request = $request->withMethod('PUT')->withParsedBody([]); - $context = $this->debugFormFactory->errorSaveContext($request); + $context = $debugFormFactory->errorSaveContext($request); - $context->sets([ - 'message' => $exception->getMessage(), - 'code' => $exception->getCode(), - 'file' => $exception->getFile(), - 'line' => $exception->getLine(), - 'trace' => $exception->getTrace(), - ]); + $context->sets([ + 'message' => $exception->getMessage(), + 'code' => $exception->getCode(), + 'file' => $exception->getFile(), + 'line' => $exception->getLine(), + 'trace' => $exception->getTrace(), + ]); - $form = $this->debugFormFactory->errorSave($entity = new Entity\Error()); + $form = $debugFormFactory->errorSave($entity = new Entity\Error()); - new FormHandler($request, $form, $context); + new FormHandler($request, $form, $context); + } return $entity; }