From 07a6df382021a68a631dd45a373311d5707f63b7 Mon Sep 17 00:00:00 2001 From: Ambroise Maupate Date: Fri, 21 Jun 2024 11:33:01 +0200 Subject: [PATCH] fix: Improved Ajax controllers and fixed setting `null` newParent as `string` --- .../AbstractAjaxController.php | 11 +- .../AjaxAbstractFieldsController.php | 21 +--- .../AjaxCustomFormFieldsController.php | 2 +- .../AjaxCustomFormsExplorerController.php | 4 +- .../AjaxDocumentsExplorerController.php | 18 ++-- .../AjaxEntitiesExplorerController.php | 2 +- .../AjaxExplorerProviderController.php | 2 +- .../AjaxFolderTreeController.php | 2 +- .../AjaxControllers/AjaxFoldersController.php | 53 +++------ .../AjaxFoldersExplorerController.php | 3 +- .../AjaxNodeTreeController.php | 2 +- .../AjaxNodeTypeFieldsController.php | 2 +- .../AjaxNodeTypesController.php | 2 +- .../AjaxControllers/AjaxNodesController.php | 4 +- .../AjaxSearchNodesSourcesController.php | 54 +++++----- .../AjaxControllers/AjaxSessionMessages.php | 2 +- .../AjaxControllers/AjaxTagTreeController.php | 2 +- .../AjaxControllers/AjaxTagsController.php | 101 +++++++++--------- 18 files changed, 125 insertions(+), 162 deletions(-) diff --git a/lib/Rozier/src/AjaxControllers/AbstractAjaxController.php b/lib/Rozier/src/AjaxControllers/AbstractAjaxController.php index c4633eca..73f33d01 100644 --- a/lib/Rozier/src/AjaxControllers/AbstractAjaxController.php +++ b/lib/Rozier/src/AjaxControllers/AbstractAjaxController.php @@ -46,14 +46,15 @@ protected function getTranslation(Request $request): ?TranslationInterface */ protected function validateRequest(Request $request, string $method = 'POST', bool $requestCsrfToken = true): bool { - if ($request->get('_action') == "") { + if (empty($request->get('_action'))) { throw new BadRequestHttpException('Wrong action requested'); } - if ($requestCsrfToken === true) { - if (!$this->isCsrfTokenValid(static::AJAX_TOKEN_INTENTION, $request->get('_token'))) { - throw new BadRequestHttpException('Bad CSRF token'); - } + if ( + $requestCsrfToken === true && + !$this->isCsrfTokenValid(static::AJAX_TOKEN_INTENTION, $request->get('_token')) + ) { + throw new BadRequestHttpException('Bad CSRF token'); } if ( diff --git a/lib/Rozier/src/AjaxControllers/AjaxAbstractFieldsController.php b/lib/Rozier/src/AjaxControllers/AjaxAbstractFieldsController.php index 64f3941e..84177e70 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxAbstractFieldsController.php +++ b/lib/Rozier/src/AjaxControllers/AjaxAbstractFieldsController.php @@ -32,32 +32,17 @@ protected function findEntity(int|string $entityId): ?AbstractField */ protected function handleFieldActions(Request $request, AbstractField $field = null): ?Response { - /* - * Validate - */ $this->validateRequest($request); if ($field !== null) { - $responseArray = null; - /* * Get the right update method against "_action" parameter */ - switch ($request->get('_action')) { - case 'updatePosition': - $responseArray = $this->updatePosition($request->request->all(), $field); - break; + if ($request->get('_action') !== 'updatePosition') { + throw new BadRequestHttpException('Action does not exist'); } - if ($responseArray === null) { - $responseArray = [ - 'statusCode' => '200', - 'status' => 'success', - 'responseText' => $this->getTranslator()->trans('field.%name%.updated', [ - '%name%' => $field->getName(), - ]), - ]; - } + $responseArray = $this->updatePosition($request->request->all(), $field); return new JsonResponse( $responseArray, diff --git a/lib/Rozier/src/AjaxControllers/AjaxCustomFormFieldsController.php b/lib/Rozier/src/AjaxControllers/AjaxCustomFormFieldsController.php index 86dc7ebc..4f475a08 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxCustomFormFieldsController.php +++ b/lib/Rozier/src/AjaxControllers/AjaxCustomFormFieldsController.php @@ -8,7 +8,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -class AjaxCustomFormFieldsController extends AjaxAbstractFieldsController +final class AjaxCustomFormFieldsController extends AjaxAbstractFieldsController { /** * Handle AJAX edition requests for CustomFormFields diff --git a/lib/Rozier/src/AjaxControllers/AjaxCustomFormsExplorerController.php b/lib/Rozier/src/AjaxControllers/AjaxCustomFormsExplorerController.php index 8c8707f2..75025a05 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxCustomFormsExplorerController.php +++ b/lib/Rozier/src/AjaxControllers/AjaxCustomFormsExplorerController.php @@ -5,6 +5,7 @@ namespace Themes\Rozier\AjaxControllers; use Doctrine\ORM\EntityManager; +use Doctrine\ORM\Exception\NotSupported; use RZ\Roadiz\CoreBundle\Entity\CustomForm; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; @@ -13,7 +14,7 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Themes\Rozier\Models\CustomFormModel; -class AjaxCustomFormsExplorerController extends AbstractAjaxController +final class AjaxCustomFormsExplorerController extends AbstractAjaxController { public function __construct(private readonly UrlGeneratorInterface $urlGenerator) { @@ -63,6 +64,7 @@ public function indexAction(Request $request): Response * * @param Request $request * @return Response + * @throws NotSupported */ public function listAction(Request $request): Response { diff --git a/lib/Rozier/src/AjaxControllers/AjaxDocumentsExplorerController.php b/lib/Rozier/src/AjaxControllers/AjaxDocumentsExplorerController.php index 5936a864..0465b468 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxDocumentsExplorerController.php +++ b/lib/Rozier/src/AjaxControllers/AjaxDocumentsExplorerController.php @@ -15,7 +15,7 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Themes\Rozier\Models\DocumentModel; -class AjaxDocumentsExplorerController extends AbstractAjaxController +final class AjaxDocumentsExplorerController extends AbstractAjaxController { public function __construct( private readonly RendererInterface $renderer, @@ -43,11 +43,10 @@ public function indexAction(Request $request): JsonResponse ]; if ($request->query->has('folderId') && $request->get('folderId') > 0) { - $folder = $this->em() - ->find( - Folder::class, - $request->get('folderId') - ); + $folder = $this->em()->find( + Folder::class, + $request->get('folderId') + ); $arrayFilter['folders'] = [$folder]; } @@ -132,14 +131,13 @@ public function listAction(Request $request): JsonResponse /** * Normalize response Document list result. * - * @param array|\Traversable $documents + * @param array $documents * @return array */ - private function normalizeDocuments($documents) + private function normalizeDocuments(array $documents): array { $documentsArray = []; - /** @var Document $doc */ foreach ($documents as $doc) { $documentModel = new DocumentModel( $doc, @@ -159,7 +157,7 @@ private function normalizeDocuments($documents) * * @return array */ - private function getTrans() + private function getTrans(): array { return [ 'editDocument' => $this->getTranslator()->trans('edit.document'), diff --git a/lib/Rozier/src/AjaxControllers/AjaxEntitiesExplorerController.php b/lib/Rozier/src/AjaxControllers/AjaxEntitiesExplorerController.php index 9ce0e969..2a01abff 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxEntitiesExplorerController.php +++ b/lib/Rozier/src/AjaxControllers/AjaxEntitiesExplorerController.php @@ -26,7 +26,7 @@ use Themes\Rozier\Explorer\SettingExplorerItem; use Themes\Rozier\Explorer\UserExplorerItem; -class AjaxEntitiesExplorerController extends AbstractAjaxController +final class AjaxEntitiesExplorerController extends AbstractAjaxController { public function __construct( private readonly RendererInterface $renderer, diff --git a/lib/Rozier/src/AjaxControllers/AjaxExplorerProviderController.php b/lib/Rozier/src/AjaxControllers/AjaxExplorerProviderController.php index 3ea4fe98..be1e1070 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxExplorerProviderController.php +++ b/lib/Rozier/src/AjaxControllers/AjaxExplorerProviderController.php @@ -15,7 +15,7 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Exception\InvalidParameterException; -class AjaxExplorerProviderController extends AbstractAjaxController +final class AjaxExplorerProviderController extends AbstractAjaxController { public function __construct(private readonly ContainerInterface $psrContainer) { diff --git a/lib/Rozier/src/AjaxControllers/AjaxFolderTreeController.php b/lib/Rozier/src/AjaxControllers/AjaxFolderTreeController.php index 1d934a54..f4495bcd 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxFolderTreeController.php +++ b/lib/Rozier/src/AjaxControllers/AjaxFolderTreeController.php @@ -10,7 +10,7 @@ use Themes\Rozier\Widgets\FolderTreeWidget; use Themes\Rozier\Widgets\TreeWidgetFactory; -class AjaxFolderTreeController extends AbstractAjaxController +final class AjaxFolderTreeController extends AbstractAjaxController { public function __construct(private readonly TreeWidgetFactory $treeWidgetFactory) { diff --git a/lib/Rozier/src/AjaxControllers/AjaxFoldersController.php b/lib/Rozier/src/AjaxControllers/AjaxFoldersController.php index b0867002..7c88b1e5 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxFoldersController.php +++ b/lib/Rozier/src/AjaxControllers/AjaxFoldersController.php @@ -10,8 +10,9 @@ use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; -class AjaxFoldersController extends AbstractAjaxController +final class AjaxFoldersController extends AbstractAjaxController { public function __construct(private readonly HandlerFactoryInterface $handlerFactory) { @@ -28,44 +29,25 @@ public function editAction(Request $request, int $folderId): JsonResponse $folder = $this->em()->find(Folder::class, (int) $folderId); - if ($folder !== null) { - $responseArray = null; - - /* - * Get the right update method against "_action" parameter - */ - switch ($request->get('_action')) { - case 'updatePosition': - $this->updatePosition($request->request->all(), $folder); - break; - } - - if ($responseArray === null) { - $responseArray = [ - 'statusCode' => '200', - 'status' => 'success', - 'responseText' => $this->getTranslator()->trans('folder.%name%.updated', [ - '%name%' => $folder->getName(), - ]) - ]; - } - - return new JsonResponse( - $responseArray, - Response::HTTP_PARTIAL_CONTENT - ); + if ($folder === null) { + throw $this->createNotFoundException($this->getTranslator()->trans('folder.does_not_exist')); } + if ($request->get('_action') !== 'updatePosition') { + throw new BadRequestHttpException('Action does not exist'); + } - $responseArray = [ - 'statusCode' => '403', - 'status' => 'danger', - 'responseText' => $this->getTranslator()->trans('folder.does_not_exist') - ]; + $this->updatePosition($request->request->all(), $folder); return new JsonResponse( - $responseArray, - Response::HTTP_OK + [ + 'statusCode' => '200', + 'status' => 'success', + 'responseText' => $this->getTranslator()->trans('folder.%name%.updated', [ + '%name%' => $folder->getName(), + ]) + ], + Response::HTTP_PARTIAL_CONTENT ); } @@ -108,10 +90,9 @@ protected function updatePosition(array $parameters, Folder $folder): void /* * First, we set the new parent */ - $parent = null; - if ( !empty($parameters['newParent']) && + is_numeric($parameters['newParent']) && $parameters['newParent'] > 0 ) { /** @var Folder $parent */ diff --git a/lib/Rozier/src/AjaxControllers/AjaxFoldersExplorerController.php b/lib/Rozier/src/AjaxControllers/AjaxFoldersExplorerController.php index 8133a0a0..aed2b011 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxFoldersExplorerController.php +++ b/lib/Rozier/src/AjaxControllers/AjaxFoldersExplorerController.php @@ -7,9 +7,8 @@ use RZ\Roadiz\CoreBundle\Entity\Folder; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; -class AjaxFoldersExplorerController extends AbstractAjaxController +final class AjaxFoldersExplorerController extends AbstractAjaxController { public function indexAction(Request $request): JsonResponse { diff --git a/lib/Rozier/src/AjaxControllers/AjaxNodeTreeController.php b/lib/Rozier/src/AjaxControllers/AjaxNodeTreeController.php index 313eff55..5358fe1a 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxNodeTreeController.php +++ b/lib/Rozier/src/AjaxControllers/AjaxNodeTreeController.php @@ -14,7 +14,7 @@ use Themes\Rozier\Widgets\NodeTreeWidget; use Themes\Rozier\Widgets\TreeWidgetFactory; -class AjaxNodeTreeController extends AbstractAjaxController +final class AjaxNodeTreeController extends AbstractAjaxController { public function __construct( private readonly NodeChrootResolver $nodeChrootResolver, diff --git a/lib/Rozier/src/AjaxControllers/AjaxNodeTypeFieldsController.php b/lib/Rozier/src/AjaxControllers/AjaxNodeTypeFieldsController.php index d825f480..ce6ce419 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxNodeTypeFieldsController.php +++ b/lib/Rozier/src/AjaxControllers/AjaxNodeTypeFieldsController.php @@ -8,7 +8,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -class AjaxNodeTypeFieldsController extends AjaxAbstractFieldsController +final class AjaxNodeTypeFieldsController extends AjaxAbstractFieldsController { /** * Handle AJAX edition requests for NodeTypeFields diff --git a/lib/Rozier/src/AjaxControllers/AjaxNodeTypesController.php b/lib/Rozier/src/AjaxControllers/AjaxNodeTypesController.php index e2f2a736..e2121f3b 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxNodeTypesController.php +++ b/lib/Rozier/src/AjaxControllers/AjaxNodeTypesController.php @@ -13,7 +13,7 @@ use Symfony\Component\Routing\Exception\InvalidParameterException; use Themes\Rozier\Models\NodeTypeModel; -class AjaxNodeTypesController extends AbstractAjaxController +final class AjaxNodeTypesController extends AbstractAjaxController { /** * @param Request $request diff --git a/lib/Rozier/src/AjaxControllers/AjaxNodesController.php b/lib/Rozier/src/AjaxControllers/AjaxNodesController.php index e459d81c..e490219e 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxNodesController.php +++ b/lib/Rozier/src/AjaxControllers/AjaxNodesController.php @@ -27,7 +27,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Workflow\Registry; -class AjaxNodesController extends AbstractAjaxController +final class AjaxNodesController extends AbstractAjaxController { public function __construct( private readonly NodeNamePolicyInterface $nodeNamePolicy, @@ -50,7 +50,7 @@ public function getTagsAction(Request $request, int $nodeId): JsonResponse /** @var Node|null $node */ $node = $this->em()->find(Node::class, (int) $nodeId); if (null === $node) { - throw new NotFoundHttpException('Node not found'); + throw $this->createNotFoundException('Node not found'); } $this->denyAccessUnlessGranted(NodeVoter::READ, $node); diff --git a/lib/Rozier/src/AjaxControllers/AjaxSearchNodesSourcesController.php b/lib/Rozier/src/AjaxControllers/AjaxSearchNodesSourcesController.php index b8c34594..89129022 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxSearchNodesSourcesController.php +++ b/lib/Rozier/src/AjaxControllers/AjaxSearchNodesSourcesController.php @@ -16,7 +16,7 @@ use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Bundle\SecurityBundle\Security; -class AjaxSearchNodesSourcesController extends AbstractAjaxController +final class AjaxSearchNodesSourcesController extends AbstractAjaxController { public const RESULT_COUNT = 10; @@ -48,42 +48,42 @@ public function searchAction(Request $request): Response /** @var array $nodesSources */ $nodesSources = $searchHandler->getNodeSourcesBySearchTerm( $request->get('searchTerms'), - static::RESULT_COUNT + self::RESULT_COUNT ); - if (count($nodesSources) > 0) { - $responseArray = [ + if (count($nodesSources) === 0) { + return new JsonResponse([ 'statusCode' => Response::HTTP_OK, 'status' => 'success', 'data' => [], - 'responseText' => count($nodesSources) . ' results found.', - ]; - - foreach ($nodesSources as $source) { - if ( - $source instanceof NodesSources && - $this->security->isGranted(NodeVoter::READ, $source) && - !key_exists($source->getNode()->getId(), $responseArray['data']) - ) { - $responseArray['data'][$source->getNode()->getId()] = $this->getNodeSourceData($source); - } - } - /* - * Only display one nodeSource - */ - $responseArray['data'] = array_values($responseArray['data']); - - return new JsonResponse( - $responseArray - ); + 'responseText' => 'No results found.', + ]); } - return new JsonResponse([ + $responseArray = [ 'statusCode' => Response::HTTP_OK, 'status' => 'success', 'data' => [], - 'responseText' => 'No results found.', - ]); + 'responseText' => count($nodesSources) . ' results found.', + ]; + + foreach ($nodesSources as $source) { + if ( + $source instanceof NodesSources && + $this->security->isGranted(NodeVoter::READ, $source) && + !key_exists($source->getNode()->getId(), $responseArray['data']) + ) { + $responseArray['data'][$source->getNode()->getId()] = $this->getNodeSourceData($source); + } + } + /* + * Only display one nodeSource + */ + $responseArray['data'] = array_values($responseArray['data']); + + return new JsonResponse( + $responseArray + ); } protected function getNodeSourceData(NodesSources $source): array diff --git a/lib/Rozier/src/AjaxControllers/AjaxSessionMessages.php b/lib/Rozier/src/AjaxControllers/AjaxSessionMessages.php index d933bcfe..99d0bcaf 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxSessionMessages.php +++ b/lib/Rozier/src/AjaxControllers/AjaxSessionMessages.php @@ -9,7 +9,7 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Session\Session; -class AjaxSessionMessages extends AbstractAjaxController +final class AjaxSessionMessages extends AbstractAjaxController { public function getMessagesAction(Request $request): JsonResponse { diff --git a/lib/Rozier/src/AjaxControllers/AjaxTagTreeController.php b/lib/Rozier/src/AjaxControllers/AjaxTagTreeController.php index 4712b013..d35a8346 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxTagTreeController.php +++ b/lib/Rozier/src/AjaxControllers/AjaxTagTreeController.php @@ -10,7 +10,7 @@ use Themes\Rozier\Widgets\TagTreeWidget; use Themes\Rozier\Widgets\TreeWidgetFactory; -class AjaxTagTreeController extends AbstractAjaxController +final class AjaxTagTreeController extends AbstractAjaxController { public function __construct(private readonly TreeWidgetFactory $treeWidgetFactory) { diff --git a/lib/Rozier/src/AjaxControllers/AjaxTagsController.php b/lib/Rozier/src/AjaxControllers/AjaxTagsController.php index 6a3d5b24..99f48a5f 100644 --- a/lib/Rozier/src/AjaxControllers/AjaxTagsController.php +++ b/lib/Rozier/src/AjaxControllers/AjaxTagsController.php @@ -4,6 +4,8 @@ namespace Themes\Rozier\AjaxControllers; +use Doctrine\ORM\OptimisticLockException; +use Doctrine\ORM\ORMException; use RZ\Roadiz\CoreBundle\Entity\Tag; use RZ\Roadiz\CoreBundle\Entity\Translation; use RZ\Roadiz\CoreBundle\Event\Tag\TagUpdatedEvent; @@ -19,7 +21,7 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Themes\Rozier\Models\TagModel; -class AjaxTagsController extends AbstractAjaxController +final class AjaxTagsController extends AbstractAjaxController { public function __construct( private readonly HandlerFactoryInterface $handlerFactory, @@ -30,7 +32,7 @@ public function __construct( /** * @return TagRepository */ - protected function getRepository() + protected function getRepository(): TagRepository { return $this->em()->getRepository(Tag::class); } @@ -225,70 +227,66 @@ public function editAction(Request $request, int $tagId): JsonResponse $tag = $this->em()->find(Tag::class, (int) $tagId); - if ($tag !== null) { - /* - * Get the right update method against "_action" parameter - */ - switch ($request->get('_action')) { - case 'updatePosition': - $this->updatePosition($request->request->all(), $tag); - break; - } - - return new JsonResponse( - [ - 'statusCode' => '200', - 'status' => 'success', - 'responseText' => ('Tag ' . $tagId . ' edited '), - ], - Response::HTTP_PARTIAL_CONTENT - ); + if ($tag === null) { + throw $this->createNotFoundException('Tag ' . $tagId . ' does not exists'); + } + /* + * Get the right update method against "_action" parameter + */ + if ($request->get('_action') !== 'updatePosition') { + throw new BadRequestHttpException('Action does not exist'); } - throw $this->createNotFoundException('Tag ' . $tagId . ' does not exists'); + $this->updatePosition($request->request->all(), $tag); + + return new JsonResponse( + [ + 'statusCode' => '200', + 'status' => 'success', + 'responseText' => ('Tag ' . $tagId . ' edited '), + ], + Response::HTTP_PARTIAL_CONTENT + ); } /** * @param Request $request * * @return JsonResponse + * @throws \Exception */ public function searchAction(Request $request): JsonResponse { $this->denyAccessUnlessGranted('ROLE_ACCESS_TAGS'); - if ($request->get('search') != "") { - $responseArray = []; - - $pattern = strip_tags($request->get('search')); + if (empty($request->get('search'))) { + throw new BadRequestHttpException('Search is empty.'); + } - $tags = $this->getRepository() - ->searchBy($pattern, [], [], 10); + $responseArray = []; + $pattern = strip_tags($request->get('search')); + $tags = $this->getRepository()->searchBy($pattern, [], [], 10); - if (0 === count($tags)) { - /* - * Try again using tag slug - */ - $pattern = StringHandler::slugify($pattern); - $tags = $this->getRepository() - ->searchBy($pattern, [], [], 10); - } + if (count($tags) === 0) { + /* + * Try again using tag slug + */ + $pattern = StringHandler::slugify($pattern); + $tags = $this->getRepository()->searchBy($pattern, [], [], 10); + } - if (count($tags) > 0) { - /** @var Tag $tag */ - foreach ($tags as $tag) { - $responseArray[] = $tag->getFullPath(); - } + if (count($tags) === 0) { + throw $this->createNotFoundException('No tags found.'); + } - return new JsonResponse( - $responseArray - ); - } else { - throw $this->createNotFoundException('No tags found.'); - } + /** @var Tag $tag */ + foreach ($tags as $tag) { + $responseArray[] = $tag->getFullPath(); } - throw new BadRequestHttpException('Search is empty.'); + return new JsonResponse( + $responseArray + ); } /** @@ -300,15 +298,12 @@ protected function updatePosition($parameters, Tag $tag): void /* * First, we set the new parent */ - $parent = null; - if ( !empty($parameters['newParent']) && + is_numeric($parameters['newParent']) && $parameters['newParent'] > 0 ) { - $parent = $this->em() - ->find(Tag::class, (int) $parameters['newParent']); - + $parent = $this->em()->find(Tag::class, (int) $parameters['newParent']); if ($parent !== null) { $tag->setParent($parent); } @@ -356,6 +351,8 @@ protected function updatePosition($parameters, Tag $tag): void * * @param Request $request * @return JsonResponse + * @throws ORMException + * @throws OptimisticLockException */ public function createAction(Request $request): JsonResponse {