From 89c7e0f30be8ac02af66097315d7db9c7f8c74e7 Mon Sep 17 00:00:00 2001 From: stevenp Date: Thu, 14 Jun 2018 18:12:02 +0200 Subject: [PATCH 1/5] [NodeBundle] Split off controller logic into NodeHelper service class --- .gitignore | 1 + .../Exception/NoNodeTranslationException.php | 20 + .../NodeBundle/Helper/NodeHelper.php | 386 +++++++++++++++ .../NodeBundle/Resources/config/services.yml | 11 + .../Tests/Helper/NodeHelperTest.php | 453 ++++++++++++++++++ 5 files changed, 871 insertions(+) create mode 100644 src/Kunstmaan/NodeBundle/Exception/NoNodeTranslationException.php create mode 100644 src/Kunstmaan/NodeBundle/Helper/NodeHelper.php create mode 100644 src/Kunstmaan/NodeBundle/Tests/Helper/NodeHelperTest.php diff --git a/.gitignore b/.gitignore index 59a057b35d..a8a739d694 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ npm-debug.log *test.db .vscode src/Kunstmaan/GeneratorBundle/Resources/SensioGeneratorBundle/skeleton/layout/groundcontrol/dist +.idea/* diff --git a/src/Kunstmaan/NodeBundle/Exception/NoNodeTranslationException.php b/src/Kunstmaan/NodeBundle/Exception/NoNodeTranslationException.php new file mode 100644 index 0000000000..7921af9487 --- /dev/null +++ b/src/Kunstmaan/NodeBundle/Exception/NoNodeTranslationException.php @@ -0,0 +1,20 @@ +em = $em; + $this->nodeAdminPublisher = $nodeAdminPublisher; + $this->nodeVersionLockHelper = $nodeVersionLockHelper; + $this->tokenStorage = $tokenStorage; + $this->cloneHelper = $cloneHelper; + $this->eventDispatcher = $eventDispatcher; + $this->parameters = $parameters; + } + + /** + * @param HasNodeInterface $page The page + * @param NodeTranslation $nodeTranslation The node translation + * @param NodeVersion $nodeVersion The node version + * + * @return NodeVersion + */ + public function createDraftVersion( + HasNodeInterface $page, + NodeTranslation $nodeTranslation, + NodeVersion $nodeVersion + ) { + $user = $this->getAdminUser(); + if (!$user) { + throw new AccessDeniedException('Access denied: User should be an admin user'); + } + $publicPage = $this->cloneHelper->deepCloneAndSave($page); + + /* @var NodeVersion $publicNodeVersion */ + $publicNodeVersion = $this->em->getRepository('KunstmaanNodeBundle:NodeVersion') + ->createNodeVersionFor( + $publicPage, + $nodeTranslation, + $user, + $nodeVersion->getOrigin(), + 'public', + $nodeVersion->getCreated() + ); + + $nodeTranslation->setPublicNodeVersion($publicNodeVersion); + $nodeVersion->setType('draft'); + $nodeVersion->setOrigin($publicNodeVersion); + $nodeVersion->setCreated(new \DateTime()); + + $this->em->persist($nodeTranslation); + $this->em->persist($nodeVersion); + $this->em->flush(); + + $this->eventDispatcher->dispatch( + Events::CREATE_DRAFT_VERSION, + new NodeEvent( + $nodeTranslation->getNode(), + $nodeTranslation, + $nodeVersion, + $page + ) + ); + + return $nodeVersion; + } + + /** + * @param NodeVersion $nodeVersion + * @param NodeTranslation $nodeTranslation + * @param int $nodeVersionTimeout + * @param bool $nodeVersionIsLocked + */ + public function prepareNodeVersion(NodeVersion $nodeVersion, NodeTranslation $nodeTranslation, $nodeVersionTimeout, $nodeVersionIsLocked) + { + $user = $this->getAdminUser(); + if (!$user) { + throw new AccessDeniedException('Access denied: User should be an admin user'); + } + $thresholdDate = date('Y-m-d H:i:s', time() - $nodeVersionTimeout); + $updatedDate = date('Y-m-d H:i:s', strtotime($nodeVersion->getUpdated()->format('Y-m-d H:i:s'))); + + if ($thresholdDate >= $updatedDate || $nodeVersionIsLocked) { + $page = $nodeVersion->getRef($this->em); + if ($nodeVersion === $nodeTranslation->getPublicNodeVersion()) { + $this->nodeAdminPublisher + ->createPublicVersion( + $page, + $nodeTranslation, + $nodeVersion, + $user + ); + } else { + $this->createDraftVersion( + $page, + $nodeTranslation, + $nodeVersion + ); + } + } + } + + /** + * @param Node $node + * @param NodeTranslation $nodeTranslation + * @param NodeVersion $nodeVersion + * @param HasNodeInterface $page + * @param boolean $isStructureNode + * @param TabPane $tabPane + * @return NodeTranslation + */ + public function updatePage( + Node $node, + NodeTranslation $nodeTranslation, + NodeVersion $nodeVersion, + HasNodeInterface $page, + $isStructureNode, + TabPane $tabPane = null + ) { + $this->eventDispatcher->dispatch( + Events::PRE_PERSIST, + new NodeEvent($node, $nodeTranslation, $nodeVersion, $page) + ); + + $nodeTranslation->setTitle($page->getTitle()); + if ($isStructureNode) { + $nodeTranslation->setSlug(''); + } + + $nodeVersion->setUpdated(new \DateTime()); + if ($nodeVersion->getType() == 'public') { + $nodeTranslation->setUpdated($nodeVersion->getUpdated()); + } + $this->em->persist($nodeTranslation); + $this->em->persist($nodeVersion); + $this->em->persist($node); + if (null !== $tabPane) { + $tabPane->persist($this->em); + } + $this->em->flush(); + + $this->eventDispatcher->dispatch( + Events::POST_PERSIST, + new NodeEvent($node, $nodeTranslation, $nodeVersion, $page) + ); + + return $nodeTranslation; + } + + /** + * @param string $refEntityType + * @param string $pageTitle + * @param string $locale + * @param Node|null $parentNode + * @return NodeTranslation + */ + public function createPage( + $refEntityType, + $pageTitle, + $locale, + Node $parentNode = null) + { + $user = $this->getAdminUser(); + if (!$user) { + throw new AccessDeniedException('Access denied: User should be an admin user'); + } + + $newPage = $this->createNewPage($pageTitle, $refEntityType); + if (null !== $parentNode) { + $parentNodeTranslation = $parentNode->getNodeTranslation($locale, true); + $parentNodeVersion = $parentNodeTranslation->getPublicNodeVersion(); + $parentPage = $parentNodeVersion->getRef($this->em); + $newPage->setParent($parentPage); + } + + /* @var Node $nodeNewPage */ + $nodeNewPage = $this->em->getRepository('KunstmaanNodeBundle:Node')->createNodeFor($newPage, $locale, $user); + $nodeTranslation = $nodeNewPage->getNodeTranslation($locale, true); + if (null !== $parentNode) { + $weight = $this->em->getRepository('KunstmaanNodeBundle:NodeTranslation')->getMaxChildrenWeight( + $parentNode, + $locale + ) + 1; + $nodeTranslation->setWeight($weight); + } + + if ($newPage->isStructureNode()) { + $nodeTranslation->setSlug(''); + } + + $this->em->persist($nodeTranslation); + $this->em->flush(); + + $nodeVersion = $nodeTranslation->getPublicNodeVersion(); + + $this->eventDispatcher->dispatch( + Events::ADD_NODE, + new NodeEvent( + $nodeNewPage, $nodeTranslation, $nodeVersion, $newPage + ) + ); + + return $nodeTranslation; + } + + /** + * @param Node $node + * @param string $locale + * @return NodeTranslation + */ + public function deletePage(Node $node, $locale) + { + $nodeTranslation = $node->getNodeTranslation($locale, true); + $nodeVersion = $nodeTranslation->getPublicNodeVersion(); + $page = $nodeVersion->getRef($this->em); + + $this->eventDispatcher->dispatch( + Events::PRE_DELETE, + new NodeEvent($node, $nodeTranslation, $nodeVersion, $page) + ); + + $node->setDeleted(true); + $this->em->persist($node); + + $this->deleteNodeChildren($node, $locale); + $this->em->flush(); + + $this->eventDispatcher->dispatch( + Events::POST_DELETE, + new NodeEvent($node, $nodeTranslation, $nodeVersion, $page) + ); + + return $nodeTranslation; + } + + /** + * @param Node $node + * @param string $locale + * @return HasNodeInterface + */ + public function getPageWithNodeInterface(Node $node, $locale) + { + $nodeTranslation = $node->getNodeTranslation($locale, true); + $nodeVersion = $nodeTranslation->getPublicNodeVersion(); + + return $nodeVersion->getRef($this->em); + } + + /** + * @param string $title + * @param string $type + * + * @return HasNodeInterface + */ + protected function createNewPage($title, $type) + { + /* @var HasNodeInterface $newPage */ + $newPage = new $type(); + + if (is_string($title) && !empty($title)) { + $newPage->setTitle($title); + } else { + $newPage->setTitle('No title'); + } + $this->em->persist($newPage); + $this->em->flush(); + + return $newPage; + } + + /** + * @param Node $node + * @param string $locale + */ + protected function deleteNodeChildren(Node $node, $locale) + { + $children = $node->getChildren(); + + /* @var Node $childNode */ + foreach ($children as $childNode) { + $childNodeTranslation = $childNode->getNodeTranslation($locale, true); + $childNodeVersion = $childNodeTranslation->getPublicNodeVersion(); + $childNodePage = $childNodeVersion->getRef($this->em); + + $this->eventDispatcher->dispatch( + Events::PRE_DELETE, + new NodeEvent( + $childNode, + $childNodeTranslation, + $childNodeVersion, + $childNodePage + ) + ); + + $childNode->setDeleted(true); + $this->em->persist($childNode); + + $this->deleteNodeChildren($childNode, $locale); + + $this->eventDispatcher->dispatch( + Events::POST_DELETE, + new NodeEvent( + $childNode, + $childNodeTranslation, + $childNodeVersion, + $childNodePage + ) + ); + } + } + + /** + * @return mixed|null + */ + protected function getAdminUser() + { + $token = $this->tokenStorage->getToken(); + if ($token) { + $user = $token->getUser(); + if ($user && $user !== 'anon.' && $user instanceof User) { + return $user; + } + } + + return null; + } +} diff --git a/src/Kunstmaan/NodeBundle/Resources/config/services.yml b/src/Kunstmaan/NodeBundle/Resources/config/services.yml index 1f7b353faf..26c92c0876 100644 --- a/src/Kunstmaan/NodeBundle/Resources/config/services.yml +++ b/src/Kunstmaan/NodeBundle/Resources/config/services.yml @@ -181,6 +181,17 @@ services: arguments: - "@kunstmaan_node.helper.url" + kunstmaan_node.helper.node: + class: Kunstmaan\NodeBundle\Helper\NodeHelper + arguments: + - "@doctrine.orm.entity_manager" + - "@kunstmaan_node.admin_node.publisher" + - "@kunstmaan_node.admin_node.node_version_lock_helper" + - "@security.token_storage" + - "@kunstmaan_admin.clone.helper" + - "@event_dispatcher" + - { timeout: "%kunstmaan_node.version_timeout%"} + ### TOOLBAR DATA COLLECTOR ### kunstmaan_node.datacollector.node: class: '%kunstmaan_node.toolbar.collector.node.class%' diff --git a/src/Kunstmaan/NodeBundle/Tests/Helper/NodeHelperTest.php b/src/Kunstmaan/NodeBundle/Tests/Helper/NodeHelperTest.php new file mode 100644 index 0000000000..dc127abcaf --- /dev/null +++ b/src/Kunstmaan/NodeBundle/Tests/Helper/NodeHelperTest.php @@ -0,0 +1,453 @@ +createORM(); + $this->nodeHelper = $this->createNodeHelper(); + } + + public function testUpdatePage() + { + /** + * @var TestPage $page + * @var NodeTranslation $nodeTranslation + */ + list($page, $nodeTranslation, $node) = $this->createNodeEntities(); + $nodeVersion = $nodeTranslation->getPublicNodeVersion(); + + $this->em + ->expects($this->exactly(3)) + ->method('persist') + ->withConsecutive( + [$this->equalTo($nodeTranslation)], + [$this->equalTo($nodeVersion)], + [$this->equalTo($node)] + ); + + $this->eventDispatcher + ->expects($this->exactly(2)) + ->method('dispatch') + ->withConsecutive( + [$this->equalTo(Events::PRE_PERSIST), $this->equalTo(new NodeEvent($node, $nodeTranslation, $nodeVersion, $page))], + [$this->equalTo(Events::POST_PERSIST), $this->equalTo(new NodeEvent($node, $nodeTranslation, $nodeVersion, $page))] + ); + + $this->nodeHelper->updatePage( + $node, + $nodeTranslation, + $nodeTranslation->getPublicNodeVersion(), + $page, + false, + null + ); + } + + public function testCreatePage() + { + $title = 'Test page'; + $user = new User(); + + list($homePage, , $nodeHomePage) = $this->createNodeEntities('Homepage'); + + /** + * @var TestPage $page + * @var NodeTranslation $nodeTranslationChildPage + */ + list($page, $nodeTranslationChildPage, $nodeChildPage) = $this->createNodeEntities($title); + + $expectedTestPageCreateNodeFor = new TestPage(); + $expectedTestPageCreateNodeFor->setTitle($title); + $expectedTestPageCreateNodeFor->setParent($homePage); + + $nodeRepository = $this->getMockBuilder(NodeRepository::class) + ->disableOriginalConstructor() + ->getMock(); + $nodeRepository + ->expects($this->once()) + ->method('createNodeFor') + ->with( + $this->equalTo($expectedTestPageCreateNodeFor), + $this->equalTo($this->locale), + $this->equalTo($user) + ) + ->willReturn($nodeChildPage); + + + $nodeTranslationRepository = $this->getMockBuilder(NodeTranslationRepository::class) + ->disableOriginalConstructor() + ->getMock(); + $nodeTranslationRepository + ->expects($this->once()) + ->method('getMaxChildrenWeight') + ->willReturn(1); + + $this->em + ->method('getRepository') + ->withConsecutive( + [$this->equalTo('KunstmaanNodeBundle:Node')], + [$this->equalTo('KunstmaanNodeBundle:NodeTranslation')] + ) + ->willReturnOnConsecutiveCalls( + $nodeRepository, + $nodeTranslationRepository + ); + + $expectedEvent = new NodeEvent( + $nodeChildPage, $nodeTranslationChildPage, $nodeTranslationChildPage->getPublicNodeVersion(), $expectedTestPageCreateNodeFor + ); + $this->eventDispatcher + ->expects($this->once()) + ->method('dispatch') + ->with($this->equalTo(Events::ADD_NODE), $this->equalTo($expectedEvent)) + ; + + $result = $this->nodeHelper->createPage(TestPage::class, $title, $this->locale, $nodeHomePage); + + $this->assertInstanceOf(NodeTranslation::class, $result); + $this->assertEquals(2, $result->getWeight()); + $this->assertEquals($title, $result->getTitle()); + } + + public function testDeletePage() + { + /** + * @var Node $nodeHomePage + * @var NodeTranslation $nodeTranslationHomePage + */ + list($homePage, $nodeTranslationHomePage, $nodeHomePage) = $this->createNodeEntities('Homepage'); + $nodeVersionHomePage = $nodeTranslationHomePage->getPublicNodeVersion(); + + /** + * @var TestPage $page + * @var NodeTranslation $nodeTranslationChildPage + */ + list($page, $nodeTranslationChildPage, $nodeChildPage) = $this->createNodeEntities('Test page'); + $nodeVersionChildPage = $nodeTranslationChildPage->getPublicNodeVersion(); + $nodeHomePage->addNode($nodeChildPage); + + $this->eventDispatcher + ->expects($this->exactly(4)) + ->method('dispatch') + ->withConsecutive( + [$this->equalTo(Events::PRE_DELETE), $this->equalTo(new NodeEvent($nodeHomePage, $nodeTranslationHomePage, $nodeVersionHomePage, $homePage))], + [$this->equalTo(Events::PRE_DELETE), $this->equalTo(new NodeEvent($nodeChildPage, $nodeTranslationChildPage, $nodeVersionChildPage, $page))], + [$this->equalTo(Events::POST_DELETE), $this->equalTo(new NodeEvent($nodeChildPage, $nodeTranslationChildPage, $nodeVersionChildPage, $page))], + [$this->equalTo(Events::POST_DELETE), $this->equalTo(new NodeEvent($nodeHomePage, $nodeTranslationHomePage, $nodeVersionHomePage, $homePage))] + ); + ; + + $result = $this->nodeHelper->deletePage($nodeHomePage, $this->locale); + + $this->assertTrue($result->getNode()->isDeleted()); + $this->assertTrue($nodeHomePage->isDeleted()); + $this->assertTrue($nodeChildPage->isDeleted()); + } + + public function testPrepareNodeVersionForPublic() + { + $user = new User(); + + $page = new TestPage(); + $page->setTitle('Test'); + $page->setId(1); + + $nodeVersion = new NodeVersion(); + $nodeVersion->setType(NodeVersion::PUBLIC_VERSION); + $nodeVersion->setRef($page); + + $nodeVersion = $this->getMockBuilder(NodeVersion::class)->getMock(); + $nodeVersion + ->method('getType') + ->willReturn(NodeVersion::PUBLIC_VERSION); + $nodeVersion + ->expects($this->once()) + ->method('getRef') + ->willReturn($page); + $nodeVersion + ->method('getUpdated') + ->willReturn((new \DateTime('-1 hour'))); + + $nodeTranslation = new NodeTranslation(); + $nodeTranslation->setLang($this->locale); + $nodeTranslation->addNodeVersion($nodeVersion); + + $this->nodeAdminPublisher + ->expects($this->once()) + ->method('createPublicVersion') + ->with( + $this->equalTo($page), + $this->equalTo($nodeTranslation), + $this->equalTo($nodeVersion), + $this->equalTo($user) + ); + + $this->nodeHelper->prepareNodeVersion($nodeVersion, $nodeTranslation, 10, true); + } + + public function testPrepareNodeVersionForDraft() + { + $page = new TestPage(); + $page->setTitle('Test'); + $page->setId(1); + + $nodeVersion = new NodeVersion(); + $nodeVersion->setType(NodeVersion::PUBLIC_VERSION); + $nodeVersion->setRef($page); + + $nodeVersion = $this->getMockBuilder(NodeVersion::class)->getMock(); + $nodeVersion + ->method('getType') + ->willReturn(NodeVersion::DRAFT_VERSION); + $nodeVersion + ->expects($this->once()) + ->method('getRef') + ->willReturn($page); + $nodeVersion + ->method('getUpdated') + ->willReturn((new \DateTime('-1 hour'))); + + $nodeTranslation = new NodeTranslation(); + $nodeTranslation->setLang($this->locale); + $nodeTranslation->addNodeVersion($nodeVersion); + + /** @var \PHPUnit_Framework_MockObject_MockObject|NodeHelper $nodeHelper */ + $nodeHelper = $this->getMockBuilder(NodeHelper::class) + ->setConstructorArgs([ + $this->em, + $this->nodeAdminPublisher, + $this->nodeVersionLockHelper, + $this->tokenStorage, + $this->cloneHelper, + $this->eventDispatcher, + ['timeout' => 10] + ]) + ->setMethods(['createDraftVersion']) + ->getMock(); + $nodeHelper + ->expects($this->once()) + ->method('createDraftVersion') + ->willReturn(true); + + $nodeHelper->prepareNodeVersion($nodeVersion, $nodeTranslation, 10, true); + } + + public function testCreateDraftVersion() + { + /** + * @var TestPage $page + * @var NodeTranslation $nodeTranslation + */ + list($page, $nodeTranslation, $node) = $this->createNodeEntities(); + $originalNodeVersion = new NodeVersion(); + + $this->cloneHelper + ->expects($this->once()) + ->method('deepCloneAndSave') + ->willReturn($page); + + $publicNodeVersion = new NodeVersion(); + $publicNodeVersion->setRef($page); + $publicNodeVersion->setType(NodeVersion::PUBLIC_VERSION); + + $nodeVersionRepository = $this->getMockBuilder(NodeVersionRepository::class) + ->disableOriginalConstructor() + ->getMock(); + $nodeVersionRepository + ->method('createNodeVersionFor') + ->willReturn($publicNodeVersion); + + $this->em->method('getRepository') + ->with('KunstmaanNodeBundle:NodeVersion') + ->willReturn($nodeVersionRepository); + + $this->eventDispatcher + ->expects($this->once()) + ->method('dispatch') + ->with($this->equalTo(Events::CREATE_DRAFT_VERSION), $this->equalTo(new NodeEvent($node, $nodeTranslation, $originalNodeVersion, $page))); + + $result = $this->nodeHelper->createDraftVersion($page, $nodeTranslation, $originalNodeVersion); + + $this->assertInstanceOf(NodeVersion::class, $result); + $this->assertEquals(NodeVersion::DRAFT_VERSION, $result->getType()); + $this->assertEquals($publicNodeVersion, $result->getOrigin()); + } + + public function testGetPageWithNodeInterface() + { + $refId = 10; + + $page = new TestPage(); + $page->setTitle('Test'); + $page->setId($refId); + + $nodeVersion = new NodeVersion(); + $nodeVersion->setType(NodeVersion::PUBLIC_VERSION); + $nodeVersion->setRef($page); + + $nodeTranslation = new NodeTranslation(); + $nodeTranslation->setLang($this->locale); + $nodeTranslation->addNodeVersion($nodeVersion); + + $node = new Node(); + $node->addNodeTranslation($nodeTranslation); + + $repository = $this->getMockBuilder(ObjectRepository::class)->getMock(); + $repository + ->expects($this->once()) + ->method('find') + ->with($refId) + ->willReturn($page); + + $this->em + ->expects($this->once()) + ->method('getRepository') + ->with($this->equalTo(TestPage::class)) + ->willReturn($repository); + + $this->nodeHelper->getPageWithNodeInterface($node, $this->locale); + } + + private function createORM() + { + $this->repository = $this->getMockBuilder(ObjectRepository::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->em = $this->getMockBuilder(EntityManager::class) + ->disableOriginalConstructor() + ->getMock(); + } + + /** + * @return NodeHelper + */ + private function createNodeHelper() + { + $token = $this->getMockBuilder(TokenInterface::class)->getMock(); + $token->method('getUser')->willReturn(new User()); + + $this->tokenStorage = $this->getMockBuilder(TokenStorage::class) + ->disableOriginalConstructor() + ->getMock(); + $this->tokenStorage->method('getToken')->willReturn($token); + $this->nodeAdminPublisher = $this->getMockBuilder(NodeAdminPublisher::class) + ->disableOriginalConstructor() + ->getMock(); + $this->nodeVersionLockHelper = $this->getMockBuilder(NodeVersionLockHelper::class) + ->disableOriginalConstructor() + ->getMock(); + $this->cloneHelper = $this->getMockBuilder(CloneHelper::class) + ->disableOriginalConstructor() + ->getMock(); + $this->eventDispatcher = $this->getMockBuilder(EventDispatcher::class) + ->disableOriginalConstructor() + ->getMock(); + + return new NodeHelper( + $this->em, + $this->nodeAdminPublisher, + $this->nodeVersionLockHelper, + $this->tokenStorage, + $this->cloneHelper, + $this->eventDispatcher, + ['timeout' => 10] + ); + } + + /** + * @param string $title + * @return array + */ + private function createNodeEntities($title = 'Test page') + { + $testPage = new TestPage(); + $testPage->setTitle($title); + + $nodeVersionNewPage = $this->getMockBuilder(NodeVersion::class)->getMock(); + $nodeVersionNewPage + ->method('getRef') + ->with($this->em) + ->willReturn($testPage); + $nodeVersionNewPage + ->method('getType') + ->willReturn(NodeVersion::PUBLIC_VERSION); + + $nodeTranslationNewPage = new NodeTranslation(); + $nodeTranslationNewPage->setTitle($title); + $nodeTranslationNewPage->setLang($this->locale); + $nodeTranslationNewPage->addNodeVersion($nodeVersionNewPage); + $nodeTranslationNewPage->setOnline(true); + + $nodeNewPage = new Node(); + $nodeNewPage->setDeleted(false); + $nodeNewPage->addNodeTranslation($nodeTranslationNewPage); + + return [$testPage, $nodeTranslationNewPage, $nodeNewPage]; + } +} \ No newline at end of file From 7e3057d886534580851278375824a96e91496759 Mon Sep 17 00:00:00 2001 From: stevenp Date: Mon, 18 Jun 2018 17:57:11 +0200 Subject: [PATCH 2/5] [NodeBundle] Split off controller logic into NodeHelper service class --- src/Kunstmaan/NodeBundle/Helper/NodeHelper.php | 15 +-------------- .../NodeBundle/Tests/Helper/NodeHelperTest.php | 11 ++--------- 2 files changed, 3 insertions(+), 23 deletions(-) diff --git a/src/Kunstmaan/NodeBundle/Helper/NodeHelper.php b/src/Kunstmaan/NodeBundle/Helper/NodeHelper.php index ed64b7ddcf..0ceed714d2 100644 --- a/src/Kunstmaan/NodeBundle/Helper/NodeHelper.php +++ b/src/Kunstmaan/NodeBundle/Helper/NodeHelper.php @@ -13,7 +13,6 @@ use Kunstmaan\NodeBundle\Event\Events; use Kunstmaan\NodeBundle\Event\NodeEvent; use Kunstmaan\NodeBundle\Helper\NodeAdmin\NodeAdminPublisher; -use Kunstmaan\NodeBundle\Helper\NodeAdmin\NodeVersionLockHelper; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use Symfony\Component\Security\Core\Exception\AccessDeniedException; @@ -29,9 +28,6 @@ class NodeHelper /** @var NodeAdminPublisher */ private $nodeAdminPublisher; - /** @var NodeVersionLockHelper */ - private $nodeVersionLockHelper; - /** @var TokenStorageInterface */ private $tokenStorage; @@ -41,36 +37,27 @@ class NodeHelper /** @var EventDispatcherInterface */ private $eventDispatcher; - /** @var [] */ - private $parameters; - /** * NodeHelper constructor. * * @param EntityManagerInterface $em * @param NodeAdminPublisher $nodeAdminPublisher - * @param NodeVersionLockHelper $nodeVersionLockHelper * @param TokenStorageInterface $tokenStorage * @param CloneHelper $cloneHelper * @param EventDispatcherInterface $eventDispatcher - * @param array $parameters */ public function __construct( EntityManagerInterface $em, NodeAdminPublisher $nodeAdminPublisher, - NodeVersionLockHelper $nodeVersionLockHelper, TokenStorageInterface $tokenStorage, CloneHelper $cloneHelper, - EventDispatcherInterface $eventDispatcher, - $parameters + EventDispatcherInterface $eventDispatcher ) { $this->em = $em; $this->nodeAdminPublisher = $nodeAdminPublisher; - $this->nodeVersionLockHelper = $nodeVersionLockHelper; $this->tokenStorage = $tokenStorage; $this->cloneHelper = $cloneHelper; $this->eventDispatcher = $eventDispatcher; - $this->parameters = $parameters; } /** diff --git a/src/Kunstmaan/NodeBundle/Tests/Helper/NodeHelperTest.php b/src/Kunstmaan/NodeBundle/Tests/Helper/NodeHelperTest.php index dc127abcaf..a6876cf3bb 100644 --- a/src/Kunstmaan/NodeBundle/Tests/Helper/NodeHelperTest.php +++ b/src/Kunstmaan/NodeBundle/Tests/Helper/NodeHelperTest.php @@ -281,11 +281,9 @@ public function testPrepareNodeVersionForDraft() ->setConstructorArgs([ $this->em, $this->nodeAdminPublisher, - $this->nodeVersionLockHelper, $this->tokenStorage, $this->cloneHelper, - $this->eventDispatcher, - ['timeout' => 10] + $this->eventDispatcher ]) ->setMethods(['createDraftVersion']) ->getMock(); @@ -399,9 +397,6 @@ private function createNodeHelper() $this->nodeAdminPublisher = $this->getMockBuilder(NodeAdminPublisher::class) ->disableOriginalConstructor() ->getMock(); - $this->nodeVersionLockHelper = $this->getMockBuilder(NodeVersionLockHelper::class) - ->disableOriginalConstructor() - ->getMock(); $this->cloneHelper = $this->getMockBuilder(CloneHelper::class) ->disableOriginalConstructor() ->getMock(); @@ -412,11 +407,9 @@ private function createNodeHelper() return new NodeHelper( $this->em, $this->nodeAdminPublisher, - $this->nodeVersionLockHelper, $this->tokenStorage, $this->cloneHelper, - $this->eventDispatcher, - ['timeout' => 10] + $this->eventDispatcher ); } From 6e2eeadf46216dee1cd226713acc9c02b54bde3d Mon Sep 17 00:00:00 2001 From: stevenp Date: Tue, 19 Jun 2018 11:12:07 +0200 Subject: [PATCH 3/5] [NodeBundle] Split off controller logic into NodeHelper service class --- .../NodeBundle/Helper/NodeHelper.php | 121 +++++++++++- .../Tests/Helper/NodeHelperTest.php | 182 +++++++++++++++++- 2 files changed, 293 insertions(+), 10 deletions(-) diff --git a/src/Kunstmaan/NodeBundle/Helper/NodeHelper.php b/src/Kunstmaan/NodeBundle/Helper/NodeHelper.php index 0ceed714d2..31492e867b 100644 --- a/src/Kunstmaan/NodeBundle/Helper/NodeHelper.php +++ b/src/Kunstmaan/NodeBundle/Helper/NodeHelper.php @@ -10,8 +10,10 @@ use Kunstmaan\NodeBundle\Entity\Node; use Kunstmaan\NodeBundle\Entity\NodeTranslation; use Kunstmaan\NodeBundle\Entity\NodeVersion; +use Kunstmaan\NodeBundle\Event\CopyPageTranslationNodeEvent; use Kunstmaan\NodeBundle\Event\Events; use Kunstmaan\NodeBundle\Event\NodeEvent; +use Kunstmaan\NodeBundle\Event\RecopyPageTranslationNodeEvent; use Kunstmaan\NodeBundle\Helper\NodeAdmin\NodeAdminPublisher; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; @@ -211,7 +213,7 @@ public function createPage( throw new AccessDeniedException('Access denied: User should be an admin user'); } - $newPage = $this->createNewPage($pageTitle, $refEntityType); + $newPage = $this->createNewPage($refEntityType, $pageTitle); if (null !== $parentNode) { $parentNodeTranslation = $parentNode->getNodeTranslation($locale, true); $parentNodeVersion = $parentNodeTranslation->getPublicNodeVersion(); @@ -293,21 +295,122 @@ public function getPageWithNodeInterface(Node $node, $locale) } /** + * @param Node $node + * @param string $sourceLocale + * @param string $locale + * @return NodeTranslation + */ + public function copyPageFromOtherLanguage(Node $node, $sourceLocale, $locale) + { + $user = $this->getAdminUser(); + if (!$user) { + throw new AccessDeniedException('Access denied: User should be an admin user'); + } + + $sourceNodeTranslation = $node->getNodeTranslation($sourceLocale, true); + $sourceNodeNodeVersion = $sourceNodeTranslation->getPublicNodeVersion(); + $sourcePage = $sourceNodeNodeVersion->getRef($this->em); + $targetPage = $this->cloneHelper->deepCloneAndSave($sourcePage); + + /* @var NodeTranslation $nodeTranslation */ + $nodeTranslation = $this->em->getRepository(NodeTranslation::class)->createNodeTranslationFor($targetPage, $locale, $node, $user); + $nodeVersion = $nodeTranslation->getPublicNodeVersion(); + + $this->eventDispatcher->dispatch( + Events::COPY_PAGE_TRANSLATION, + new CopyPageTranslationNodeEvent( + $node, + $nodeTranslation, + $nodeVersion, + $targetPage, + $sourceNodeTranslation, + $sourceNodeNodeVersion, + $sourcePage, + $sourceLocale + ) + ); + + return $nodeTranslation; + } + + /** + * @param Node $node + * @param int $sourceNodeTranslationId + * @param string $locale + * @return NodeTranslation + */ + public function createPageDraftFromOtherLanguage(Node $node, $sourceNodeTranslationId, $locale) + { + $user = $this->getAdminUser(); + if (!$user) { + throw new AccessDeniedException('Access denied: User should be an admin user'); + } + + $sourceNodeTranslation = $this->em->getRepository(NodeTranslation::class)->find($sourceNodeTranslationId); + $sourceNodeNodeVersion = $sourceNodeTranslation->getPublicNodeVersion(); + $sourcePage = $sourceNodeNodeVersion->getRef($this->em); + $targetPage = $this->cloneHelper->deepCloneAndSave($sourcePage); + + /* @var NodeTranslation $nodeTranslation */ + $nodeTranslation = $this->em->getRepository(NodeTranslation::class)->addDraftNodeVersionFor($targetPage, $locale, $node, $user); + $nodeVersion = $nodeTranslation->getPublicNodeVersion(); + + $this->eventDispatcher->dispatch( + Events::RECOPY_PAGE_TRANSLATION, + new RecopyPageTranslationNodeEvent( + $node, + $nodeTranslation, + $nodeVersion, + $targetPage, + $sourceNodeTranslation, + $sourceNodeNodeVersion, + $sourcePage, + $sourceNodeTranslation->getLang() + ) + ); + + return $nodeTranslation; + } + + /** + * @param Node $node + * @param string $locale + * @return NodeTranslation + */ + public function createEmptyPage(Node $node, $locale) + { + $user = $this->getAdminUser(); + if (!$user) { + throw new AccessDeniedException('Access denied: User should be an admin user'); + } + + $refEntityName = $node->getRefEntityName(); + $targetPage = $this->createNewPage($refEntityName); + + /* @var NodeTranslation $nodeTranslation */ + $nodeTranslation = $this->em->getRepository(NodeTranslation::class)->createNodeTranslationFor($targetPage, $locale, $node, $user); + $nodeVersion = $nodeTranslation->getPublicNodeVersion(); + + $this->eventDispatcher->dispatch( + Events::ADD_EMPTY_PAGE_TRANSLATION, + new NodeEvent($node, $nodeTranslation, $nodeVersion, $targetPage) + ); + + return $nodeTranslation; + } + + /** + * @param string $entityType * @param string $title - * @param string $type * * @return HasNodeInterface */ - protected function createNewPage($title, $type) + protected function createNewPage($entityType, $title = 'No title') { /* @var HasNodeInterface $newPage */ - $newPage = new $type(); + $newPage = new $entityType(); + $newPage->setTitle($title); - if (is_string($title) && !empty($title)) { - $newPage->setTitle($title); - } else { - $newPage->setTitle('No title'); - } $this->em->persist($newPage); $this->em->flush(); diff --git a/src/Kunstmaan/NodeBundle/Tests/Helper/NodeHelperTest.php b/src/Kunstmaan/NodeBundle/Tests/Helper/NodeHelperTest.php index a6876cf3bb..94f9a07c2a 100644 --- a/src/Kunstmaan/NodeBundle/Tests/Helper/NodeHelperTest.php +++ b/src/Kunstmaan/NodeBundle/Tests/Helper/NodeHelperTest.php @@ -13,8 +13,10 @@ use Kunstmaan\NodeBundle\Entity\Node; use Kunstmaan\NodeBundle\Entity\NodeTranslation; use Kunstmaan\NodeBundle\Entity\NodeVersion; +use Kunstmaan\NodeBundle\Event\CopyPageTranslationNodeEvent; use Kunstmaan\NodeBundle\Event\Events; use Kunstmaan\NodeBundle\Event\NodeEvent; +use Kunstmaan\NodeBundle\Event\RecopyPageTranslationNodeEvent; use Kunstmaan\NodeBundle\Helper\NodeAdmin\NodeAdminPublisher; use Kunstmaan\NodeBundle\Helper\NodeAdmin\NodeVersionLockHelper; use Kunstmaan\NodeBundle\Helper\NodeHelper; @@ -66,6 +68,9 @@ class NodeHelperTest extends \PHPUnit_Framework_TestCase /** @var string */ private $locale = 'en'; + /** @var User */ + private $user; + public function setUp() { $this->createORM(); @@ -371,6 +376,179 @@ public function testGetPageWithNodeInterface() $this->nodeHelper->getPageWithNodeInterface($node, $this->locale); } + public function testCopyPageFromOtherLanguage() + { + $targetLocale = 'nl'; + $targetPage = new TestPage(); + + /** + * @var TestPage $sourcePage + * @var NodeTranslation $sourceNodeTranslation + */ + list($sourcePage, $sourceNodeTranslation, $node) = $this->createNodeEntities(); + $sourceNodeNodeVersion = $sourceNodeTranslation->getPublicNodeVersion(); + + $this->cloneHelper + ->expects($this->once()) + ->method('deepCloneAndSave') + ->with($sourcePage) + ->willReturn($targetPage); + + $expectedNodeVersion = new NodeVersion(); + $expectedNodeVersion->setType(NodeVersion::PUBLIC_VERSION); + $expectedNodeVersion->setRef($targetPage); + + $expectedNodeTranslation = new NodeTranslation(); + $expectedNodeTranslation->setNode($node); + $expectedNodeTranslation->setLang($targetLocale); + $expectedNodeTranslation->setPublicNodeVersion($expectedNodeVersion); + + $repository = $this->getMockBuilder(NodeTranslationRepository::class) + ->disableOriginalConstructor() + ->getMock(); + $repository + ->expects($this->once()) + ->method('createNodeTranslationFor') + ->with($this->equalTo($targetPage), $this->equalTo($targetLocale), $this->equalTo($node), $this->equalTo($this->user)) + ->willReturn($expectedNodeTranslation); + + $this->em + ->expects($this->once()) + ->method('getRepository') + ->with(NodeTranslation::class) + ->willReturn($repository); + + $this->eventDispatcher + ->expects($this->once()) + ->method('dispatch') + ->with($this->equalTo(Events::COPY_PAGE_TRANSLATION), $this->equalTo(new CopyPageTranslationNodeEvent( + $node, + $expectedNodeTranslation, + $expectedNodeVersion, + $targetPage, + $sourceNodeTranslation, + $sourceNodeNodeVersion, + $sourcePage, + $this->locale))); + + $result = $this->nodeHelper->copyPageFromOtherLanguage($node, $this->locale, $targetLocale); + + $this->assertInstanceOf(NodeTranslation::class, $result); + $this->assertEquals($expectedNodeTranslation, $result); + } + + public function testCreatePageDraftFromOtherLanguage() + { + $targetLocale = 'nl'; + $targetPage = new TestPage(); + + /** + * @var TestPage $sourcePage + * @var NodeTranslation $sourceNodeTranslation + */ + list($sourcePage, $sourceNodeTranslation, $node) = $this->createNodeEntities(); + $sourceNodeNodeVersion = $sourceNodeTranslation->getPublicNodeVersion(); + + $this->cloneHelper + ->expects($this->once()) + ->method('deepCloneAndSave') + ->with($sourcePage) + ->willReturn($targetPage); + + $expectedNodeVersion = new NodeVersion(); + $expectedNodeVersion->setType(NodeVersion::PUBLIC_VERSION); + $expectedNodeVersion->setRef($targetPage); + + $expectedNodeTranslation = new NodeTranslation(); + $expectedNodeTranslation->setNode($node); + $expectedNodeTranslation->setLang($targetLocale); + $expectedNodeTranslation->setPublicNodeVersion($expectedNodeVersion); + + $repository = $this->getMockBuilder(NodeTranslationRepository::class) + ->disableOriginalConstructor() + ->getMock(); + $repository + ->expects($this->once()) + ->method('find') + ->with($this->equalTo(1)) + ->willReturn($sourceNodeTranslation); + $repository + ->expects($this->once()) + ->method('addDraftNodeVersionFor') + ->with($this->equalTo($targetPage), $this->equalTo($targetLocale), $this->equalTo($node), $this->equalTo($this->user)) + ->willReturn($expectedNodeTranslation); + + $this->em + ->expects($this->exactly(2)) + ->method('getRepository') + ->with(NodeTranslation::class) + ->willReturn($repository); + + $this->eventDispatcher + ->expects($this->once()) + ->method('dispatch') + ->with($this->equalTo(Events::RECOPY_PAGE_TRANSLATION), $this->equalTo(new RecopyPageTranslationNodeEvent( + $node, + $expectedNodeTranslation, + $expectedNodeVersion, + $targetPage, + $sourceNodeTranslation, + $sourceNodeNodeVersion, + $sourcePage, + $this->locale))); + + $result = $this->nodeHelper->createPageDraftFromOtherLanguage($node, 1, $targetLocale); + + $this->assertInstanceOf(NodeTranslation::class, $result); + $this->assertEquals($expectedNodeTranslation, $result); + } + + public function testCreateEmptyPage() + { + $targetPage = new TestPage(); + $targetPage->setTitle('No title'); + $node = new Node(); + $node->setRef($targetPage); + + $expectedNodeVersion = new NodeVersion(); + $expectedNodeVersion->setType(NodeVersion::PUBLIC_VERSION); + $expectedNodeVersion->setRef($targetPage); + + $expectedNodeTranslation = new NodeTranslation(); + $expectedNodeTranslation->setNode($node); + $expectedNodeTranslation->setLang($this->locale); + $expectedNodeTranslation->setPublicNodeVersion($expectedNodeVersion); + + $repository = $this->getMockBuilder(NodeTranslationRepository::class) + ->disableOriginalConstructor() + ->getMock(); + $repository + ->expects($this->once()) + ->method('createNodeTranslationFor') + ->with($this->equalTo($targetPage), $this->equalTo($this->locale), $this->equalTo($node), $this->equalTo($this->user)) + ->willReturn($expectedNodeTranslation); + + $this->em + ->expects($this->once()) + ->method('getRepository') + ->with(NodeTranslation::class) + ->willReturn($repository); + + $this->eventDispatcher + ->expects($this->once()) + ->method('dispatch') + ->with($this->equalTo(Events::ADD_EMPTY_PAGE_TRANSLATION), $this->equalTo(new NodeEvent( + $node, + $expectedNodeTranslation, + $expectedNodeVersion, + $targetPage))); + + $result = $this->nodeHelper->createEmptyPage($node, $this->locale); + + $this->assertInstanceOf(NodeTranslation::class, $result); + $this->assertEquals($expectedNodeTranslation, $result); + } + private function createORM() { $this->repository = $this->getMockBuilder(ObjectRepository::class) @@ -387,8 +565,10 @@ private function createORM() */ private function createNodeHelper() { + $this->user = new User(); + $token = $this->getMockBuilder(TokenInterface::class)->getMock(); - $token->method('getUser')->willReturn(new User()); + $token->method('getUser')->willReturn($this->user); $this->tokenStorage = $this->getMockBuilder(TokenStorage::class) ->disableOriginalConstructor() From e034c8f15c172ef11134d6a6e0b21dd3ade0a23a Mon Sep 17 00:00:00 2001 From: stevenp Date: Tue, 19 Jun 2018 15:46:39 +0200 Subject: [PATCH 4/5] [NodeBundle] Split off controller logic into NodeHelper service class --- .../NodeBundle/Helper/NodeHelper.php | 51 ++++++++++++++++--- .../Tests/Helper/NodeHelperTest.php | 45 ++++++++++++++++ 2 files changed, 90 insertions(+), 6 deletions(-) diff --git a/src/Kunstmaan/NodeBundle/Helper/NodeHelper.php b/src/Kunstmaan/NodeBundle/Helper/NodeHelper.php index 31492e867b..485821316a 100644 --- a/src/Kunstmaan/NodeBundle/Helper/NodeHelper.php +++ b/src/Kunstmaan/NodeBundle/Helper/NodeHelper.php @@ -308,8 +308,8 @@ public function copyPageFromOtherLanguage(Node $node, $sourceLocale, $locale) } $sourceNodeTranslation = $node->getNodeTranslation($sourceLocale, true); - $sourceNodeNodeVersion = $sourceNodeTranslation->getPublicNodeVersion(); - $sourcePage = $sourceNodeNodeVersion->getRef($this->em); + $sourceNodeVersion = $sourceNodeTranslation->getPublicNodeVersion(); + $sourcePage = $sourceNodeVersion->getRef($this->em); $targetPage = $this->cloneHelper->deepCloneAndSave($sourcePage); /* @var NodeTranslation $nodeTranslation */ @@ -324,7 +324,7 @@ public function copyPageFromOtherLanguage(Node $node, $sourceLocale, $locale) $nodeVersion, $targetPage, $sourceNodeTranslation, - $sourceNodeNodeVersion, + $sourceNodeVersion, $sourcePage, $sourceLocale ) @@ -333,6 +333,45 @@ public function copyPageFromOtherLanguage(Node $node, $sourceLocale, $locale) return $nodeTranslation; } + /** + * @param Node $node + * @param string $locale + * @param string $title + * @return NodeTranslation|null + */ + public function duplicatePage(Node $node, $locale, $title = 'New page') + { + $user = $this->getAdminUser(); + if (!$user) { + throw new AccessDeniedException('Access denied: User should be an admin user'); + } + + $sourceNodeTranslations = $node->getNodeTranslation($locale, true); + $sourcePage = $sourceNodeTranslations->getPublicNodeVersion()->getRef($this->em); + $targetPage = $this->cloneHelper->deepCloneAndSave($sourcePage); + $targetPage->setTitle($title); + + if ($node->getParent()) { + $parentNodeTranslation = $node->getParent()->getNodeTranslation($locale, true); + $parent = $parentNodeTranslation->getPublicNodeVersion()->getRef($this->em); + $targetPage->setParent($parent); + } + $this->em->persist($targetPage); + $this->em->flush(); + + /* @var Node $nodeNewPage */ + $nodeNewPage = $this->em->getRepository(Node::class)->createNodeFor($targetPage, $locale, $user); + + $nodeTranslation = $nodeNewPage->getNodeTranslation($locale, true); + if ($targetPage->isStructureNode()) { + $nodeTranslation->setSlug(''); + $this->em->persist($nodeTranslation); + } + $this->em->flush(); + + return $nodeTranslation; + } + /** * @param Node $node * @param int $sourceNodeTranslationId @@ -347,8 +386,8 @@ public function createPageDraftFromOtherLanguage(Node $node, $sourceNodeTranslat } $sourceNodeTranslation = $this->em->getRepository(NodeTranslation::class)->find($sourceNodeTranslationId); - $sourceNodeNodeVersion = $sourceNodeTranslation->getPublicNodeVersion(); - $sourcePage = $sourceNodeNodeVersion->getRef($this->em); + $sourceNodeVersion = $sourceNodeTranslation->getPublicNodeVersion(); + $sourcePage = $sourceNodeVersion->getRef($this->em); $targetPage = $this->cloneHelper->deepCloneAndSave($sourcePage); /* @var NodeTranslation $nodeTranslation */ @@ -363,7 +402,7 @@ public function createPageDraftFromOtherLanguage(Node $node, $sourceNodeTranslat $nodeVersion, $targetPage, $sourceNodeTranslation, - $sourceNodeNodeVersion, + $sourceNodeVersion, $sourcePage, $sourceNodeTranslation->getLang() ) diff --git a/src/Kunstmaan/NodeBundle/Tests/Helper/NodeHelperTest.php b/src/Kunstmaan/NodeBundle/Tests/Helper/NodeHelperTest.php index 94f9a07c2a..cdea77645d 100644 --- a/src/Kunstmaan/NodeBundle/Tests/Helper/NodeHelperTest.php +++ b/src/Kunstmaan/NodeBundle/Tests/Helper/NodeHelperTest.php @@ -437,6 +437,51 @@ public function testCopyPageFromOtherLanguage() $this->assertEquals($expectedNodeTranslation, $result); } + public function testDuplicatePage() + { + $targetPage = new TestPage(); + + list(, $nodeTranslationHomePage, $nodeHomePage) = $this->createNodeEntities('Homepage'); + + /** + * @var TestPage $sourcePage + * @var NodeTranslation $sourceNodeTranslation + * @var Node $node + */ + list($sourcePage, $sourceNodeTranslation, $node) = $this->createNodeEntities(); + $node->setParent($nodeHomePage); + + $this->cloneHelper + ->expects($this->once()) + ->method('deepCloneAndSave') + ->with($sourcePage) + ->willReturn($targetPage); + + $expectedNodeTranslation = new NodeTranslation(); + $expectedNodeTranslation->setLang($this->locale); + + $expectedNode = new Node(); + $expectedNode->addNodeTranslation($expectedNodeTranslation); + + $repository = $this->getMockBuilder(NodeRepository::class) + ->disableOriginalConstructor() + ->getMock(); + $repository + ->expects($this->once()) + ->method('createNodeFor') + ->willReturn($expectedNode); + + $this->em + ->expects($this->once()) + ->method('getRepository') + ->with(Node::class) + ->willReturn($repository); + + $result = $this->nodeHelper->duplicatePage($node, $this->locale); + + $this->assertInstanceOf(NodeTranslation::class, $result); + } + public function testCreatePageDraftFromOtherLanguage() { $targetLocale = 'nl'; From eb694ceea617119c415f63cf53b4098ef45d7837 Mon Sep 17 00:00:00 2001 From: stevenp Date: Tue, 19 Jun 2018 16:46:30 +0200 Subject: [PATCH 5/5] [NodeBundle] Split off controller logic into NodeHelper service class --- .../NodeBundle/Helper/NodeHelper.php | 42 ++++++++----------- .../NodeBundle/Resources/config/services.yml | 2 - 2 files changed, 17 insertions(+), 27 deletions(-) diff --git a/src/Kunstmaan/NodeBundle/Helper/NodeHelper.php b/src/Kunstmaan/NodeBundle/Helper/NodeHelper.php index 485821316a..37c667fc29 100644 --- a/src/Kunstmaan/NodeBundle/Helper/NodeHelper.php +++ b/src/Kunstmaan/NodeBundle/Helper/NodeHelper.php @@ -75,9 +75,6 @@ public function createDraftVersion( NodeVersion $nodeVersion ) { $user = $this->getAdminUser(); - if (!$user) { - throw new AccessDeniedException('Access denied: User should be an admin user'); - } $publicPage = $this->cloneHelper->deepCloneAndSave($page); /* @var NodeVersion $publicNodeVersion */ @@ -87,12 +84,12 @@ public function createDraftVersion( $nodeTranslation, $user, $nodeVersion->getOrigin(), - 'public', + NodeVersion::PUBLIC_VERSION, $nodeVersion->getCreated() ); $nodeTranslation->setPublicNodeVersion($publicNodeVersion); - $nodeVersion->setType('draft'); + $nodeVersion->setType(NodeVersion::DRAFT_VERSION); $nodeVersion->setOrigin($publicNodeVersion); $nodeVersion->setCreated(new \DateTime()); @@ -122,9 +119,6 @@ public function createDraftVersion( public function prepareNodeVersion(NodeVersion $nodeVersion, NodeTranslation $nodeTranslation, $nodeVersionTimeout, $nodeVersionIsLocked) { $user = $this->getAdminUser(); - if (!$user) { - throw new AccessDeniedException('Access denied: User should be an admin user'); - } $thresholdDate = date('Y-m-d H:i:s', time() - $nodeVersionTimeout); $updatedDate = date('Y-m-d H:i:s', strtotime($nodeVersion->getUpdated()->format('Y-m-d H:i:s'))); @@ -176,7 +170,7 @@ public function updatePage( } $nodeVersion->setUpdated(new \DateTime()); - if ($nodeVersion->getType() == 'public') { + if ($nodeVersion->getType() == NodeVersion::PUBLIC_VERSION) { $nodeTranslation->setUpdated($nodeVersion->getUpdated()); } $this->em->persist($nodeTranslation); @@ -209,9 +203,6 @@ public function createPage( Node $parentNode = null) { $user = $this->getAdminUser(); - if (!$user) { - throw new AccessDeniedException('Access denied: User should be an admin user'); - } $newPage = $this->createNewPage($refEntityType, $pageTitle); if (null !== $parentNode) { @@ -303,9 +294,6 @@ public function getPageWithNodeInterface(Node $node, $locale) public function copyPageFromOtherLanguage(Node $node, $sourceLocale, $locale) { $user = $this->getAdminUser(); - if (!$user) { - throw new AccessDeniedException('Access denied: User should be an admin user'); - } $sourceNodeTranslation = $node->getNodeTranslation($sourceLocale, true); $sourceNodeVersion = $sourceNodeTranslation->getPublicNodeVersion(); @@ -342,9 +330,6 @@ public function copyPageFromOtherLanguage(Node $node, $sourceLocale, $locale) public function duplicatePage(Node $node, $locale, $title = 'New page') { $user = $this->getAdminUser(); - if (!$user) { - throw new AccessDeniedException('Access denied: User should be an admin user'); - } $sourceNodeTranslations = $node->getNodeTranslation($locale, true); $sourcePage = $sourceNodeTranslations->getPublicNodeVersion()->getRef($this->em); @@ -381,9 +366,6 @@ public function duplicatePage(Node $node, $locale, $title = 'New page') public function createPageDraftFromOtherLanguage(Node $node, $sourceNodeTranslationId, $locale) { $user = $this->getAdminUser(); - if (!$user) { - throw new AccessDeniedException('Access denied: User should be an admin user'); - } $sourceNodeTranslation = $this->em->getRepository(NodeTranslation::class)->find($sourceNodeTranslationId); $sourceNodeVersion = $sourceNodeTranslation->getPublicNodeVersion(); @@ -419,9 +401,6 @@ public function createPageDraftFromOtherLanguage(Node $node, $sourceNodeTranslat public function createEmptyPage(Node $node, $locale) { $user = $this->getAdminUser(); - if (!$user) { - throw new AccessDeniedException('Access denied: User should be an admin user'); - } $refEntityName = $node->getRefEntityName(); $targetPage = $this->createNewPage($refEntityName); @@ -500,7 +479,7 @@ protected function deleteNodeChildren(Node $node, $locale) /** * @return mixed|null */ - protected function getAdminUser() + protected function getUser() { $token = $this->tokenStorage->getToken(); if ($token) { @@ -512,4 +491,17 @@ protected function getAdminUser() return null; } + + /** + * @return mixed + */ + protected function getAdminUser() + { + $user = $this->getUser(); + if (!$user) { + throw new AccessDeniedException('Access denied: User should be an admin user'); + } + + return $user; + } } diff --git a/src/Kunstmaan/NodeBundle/Resources/config/services.yml b/src/Kunstmaan/NodeBundle/Resources/config/services.yml index 267cd6e79a..30f928cd62 100644 --- a/src/Kunstmaan/NodeBundle/Resources/config/services.yml +++ b/src/Kunstmaan/NodeBundle/Resources/config/services.yml @@ -188,11 +188,9 @@ services: arguments: - "@doctrine.orm.entity_manager" - "@kunstmaan_node.admin_node.publisher" - - "@kunstmaan_node.admin_node.node_version_lock_helper" - "@security.token_storage" - "@kunstmaan_admin.clone.helper" - "@event_dispatcher" - - { timeout: "%kunstmaan_node.version_timeout%"} ### TOOLBAR DATA COLLECTOR ### kunstmaan_node.datacollector.node: