From 3a669d7fe01d214cae38064feff49b3cbca28d05 Mon Sep 17 00:00:00 2001 From: Rus0 Date: Wed, 28 Aug 2019 17:30:05 -0500 Subject: [PATCH 1/6] Added validation for store id in CMS Block --- .../CmsGraphQl/Model/Resolver/Blocks.php | 4 +- .../Model/Resolver/DataProvider/Block.php | 48 +++++++++++++++++-- .../Magento/GraphQl/Cms/CmsBlockTest.php | 28 +++++++++++ 3 files changed, 75 insertions(+), 5 deletions(-) diff --git a/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php b/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php index e55db2a3fa42..30f1c9c48c51 100644 --- a/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php +++ b/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php @@ -8,6 +8,7 @@ namespace Magento\CmsGraphQl\Model\Resolver; use Magento\CmsGraphQl\Model\Resolver\DataProvider\Block as BlockDataProvider; +use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Exception\NoSuchEntityException; use Magento\Framework\GraphQl\Config\Element\Field; use Magento\Framework\GraphQl\Exception\GraphQlInputException; @@ -75,7 +76,6 @@ private function getBlockIdentifiers(array $args): array * * @param array $blockIdentifiers * @return array - * @throws GraphQlNoSuchEntityException */ private function getBlocksData(array $blockIdentifiers): array { @@ -83,7 +83,7 @@ private function getBlocksData(array $blockIdentifiers): array foreach ($blockIdentifiers as $blockIdentifier) { try { $blocksData[$blockIdentifier] = $this->blockDataProvider->getData($blockIdentifier); - } catch (NoSuchEntityException $e) { + } catch (LocalizedException $e) { $blocksData[$blockIdentifier] = new GraphQlNoSuchEntityException(__($e->getMessage()), $e); } } diff --git a/app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php b/app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php index fa4944381b85..c765fc8b412d 100644 --- a/app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php +++ b/app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php @@ -9,7 +9,11 @@ use Magento\Cms\Api\BlockRepositoryInterface; use Magento\Cms\Api\Data\BlockInterface; +use Magento\Cms\Model\GetBlockByIdentifier; +use Magento\Framework\Api\SearchCriteriaBuilder; +use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Exception\NoSuchEntityException; +use Magento\Store\Model\StoreManagerInterface; use Magento\Widget\Model\Template\FilterEmulate; /** @@ -27,16 +31,32 @@ class Block */ private $widgetFilter; + /** + * @var StoreManagerInterface + */ + private $storeManager; + + /** + * @var SearchCriteriaBuilder + */ + private $searchCriteriaBuilder; + /** * @param BlockRepositoryInterface $blockRepository * @param FilterEmulate $widgetFilter + * @param StoreManagerInterface $storeManager + * @param SearchCriteriaBuilder $searchCriteriaBuilder */ public function __construct( BlockRepositoryInterface $blockRepository, - FilterEmulate $widgetFilter + FilterEmulate $widgetFilter, + StoreManagerInterface $storeManager, + SearchCriteriaBuilder $searchCriteriaBuilder ) { $this->blockRepository = $blockRepository; $this->widgetFilter = $widgetFilter; + $this->storeManager = $storeManager; + $this->searchCriteriaBuilder = $searchCriteriaBuilder; } /** @@ -44,12 +64,34 @@ public function __construct( * * @param string $blockIdentifier * @return array - * @throws NoSuchEntityException + * @throws LocalizedException */ public function getData(string $blockIdentifier): array { - $block = $this->blockRepository->getById($blockIdentifier); + $filterBy = BlockInterface::IDENTIFIER; + $storeId = (int)$this->storeManager->getStore()->getId(); + if (is_numeric($blockIdentifier)) { + $filterBy = BlockInterface::BLOCK_ID; + } + $searchCriteria = $this->searchCriteriaBuilder->addFilter( + 'store_id', + $storeId, + 'eq' + )->addFilter( + $filterBy, + $blockIdentifier, + 'eq' + )->setPageSize(1)->setCurrentPage(1)->create(); + + $blocks = $this->blockRepository->getList($searchCriteria)->getItems(); + + if (count($blocks) != 1) { + throw new NoSuchEntityException( + __('The CMS block with the "%1" ID doesn\'t exist.', $blockIdentifier) + ); + } + $block = array_values($blocks)[0]; if (false === $block->isActive()) { throw new NoSuchEntityException( __('The CMS block with the "%1" ID doesn\'t exist.', $blockIdentifier) diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Cms/CmsBlockTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Cms/CmsBlockTest.php index d598a463a48a..b2cb26e9e5be 100644 --- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Cms/CmsBlockTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Cms/CmsBlockTest.php @@ -203,4 +203,32 @@ public function testGetEnabledAndDisabledCmsBlockInOneRequest() $responseData['errors'][0]['message'] ); } + + /** + * Verify the message when CMS Block exists but not available for a store view. + * + * @magentoApiDataFixture Magento/Cms/_files/blocks.php + * @magentoApiDataFixture Magento/Store/_files/second_store.php + * @expectedException \Exception + * @expectedExceptionMessage The CMS block with the "enabled_block" ID doesn't exist. + */ + public function testGetCmsBlockByIdentifierWithDifferentStoreView() + { + $query = + << $nonExistingStoreCode]; + $this->graphQlQuery($query, [], '', $headerMapInvalidStoreCode); + } } From 701c82af02b2a6adb26873820e9671680a689f7e Mon Sep 17 00:00:00 2001 From: Rus0 Date: Thu, 29 Aug 2019 12:59:45 -0500 Subject: [PATCH 2/6] dependency error --- app/code/Magento/CmsGraphQl/composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/app/code/Magento/CmsGraphQl/composer.json b/app/code/Magento/CmsGraphQl/composer.json index 45255edec0cb..e9c4e89ed8a1 100644 --- a/app/code/Magento/CmsGraphQl/composer.json +++ b/app/code/Magento/CmsGraphQl/composer.json @@ -5,6 +5,7 @@ "require": { "php": "~7.1.3||~7.2.0||~7.3.0", "magento/framework": "*", + "magento/module-store": "*", "magento/module-cms": "*", "magento/module-widget": "*" }, From 56d2048d60aa259680a905ef26fbd9dc180cbe4c Mon Sep 17 00:00:00 2001 From: Rus0 Date: Thu, 5 Sep 2019 15:15:17 -0500 Subject: [PATCH 3/6] changed for collection instead of search builder, getting store from graphql context --- .../CmsGraphQl/Model/Resolver/Blocks.php | 9 ++- .../Model/Resolver/DataProvider/Block.php | 61 +++++++------------ 2 files changed, 28 insertions(+), 42 deletions(-) diff --git a/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php b/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php index 30f1c9c48c51..f717c96a382b 100644 --- a/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php +++ b/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php @@ -15,6 +15,7 @@ use Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException; use Magento\Framework\GraphQl\Query\ResolverInterface; use Magento\Framework\GraphQl\Schema\Type\ResolveInfo; +use Magento\Store\Model\Store; /** * CMS blocks field resolver, used for GraphQL request processing @@ -47,7 +48,8 @@ public function resolve( ) { $blockIdentifiers = $this->getBlockIdentifiers($args); - $blocksData = $this->getBlocksData($blockIdentifiers); + $currentStore = $context->getExtensionAttributes()->getStore(); + $blocksData = $this->getBlocksData($blockIdentifiers, $currentStore); $resultData = [ 'items' => $blocksData, @@ -75,14 +77,15 @@ private function getBlockIdentifiers(array $args): array * Get blocks data * * @param array $blockIdentifiers + * @param Store $currentStore * @return array */ - private function getBlocksData(array $blockIdentifiers): array + private function getBlocksData(array $blockIdentifiers, Store $currentStore): array { $blocksData = []; foreach ($blockIdentifiers as $blockIdentifier) { try { - $blocksData[$blockIdentifier] = $this->blockDataProvider->getData($blockIdentifier); + $blocksData[$blockIdentifier] = $this->blockDataProvider->getData($blockIdentifier, $currentStore); } catch (LocalizedException $e) { $blocksData[$blockIdentifier] = new GraphQlNoSuchEntityException(__($e->getMessage()), $e); } diff --git a/app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php b/app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php index c765fc8b412d..9c261bb875c5 100644 --- a/app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php +++ b/app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php @@ -9,10 +9,13 @@ use Magento\Cms\Api\BlockRepositoryInterface; use Magento\Cms\Api\Data\BlockInterface; -use Magento\Cms\Model\GetBlockByIdentifier; +use Magento\Cms\Model\Block as BlockModel; +use Magento\Cms\Model\ResourceModel\Block\Collection as BlockCollection; +use Magento\Cms\Model\ResourceModel\Block\CollectionFactory as BlockCollectionFactory; use Magento\Framework\Api\SearchCriteriaBuilder; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Exception\NoSuchEntityException; +use Magento\Store\Model\Store; use Magento\Store\Model\StoreManagerInterface; use Magento\Widget\Model\Template\FilterEmulate; @@ -21,77 +24,57 @@ */ class Block { - /** - * @var BlockRepositoryInterface - */ - private $blockRepository; - /** * @var FilterEmulate */ private $widgetFilter; /** - * @var StoreManagerInterface + * @var BlockCollectionFactory */ - private $storeManager; + private $blockCollectionFactory; /** - * @var SearchCriteriaBuilder - */ - private $searchCriteriaBuilder; - - /** - * @param BlockRepositoryInterface $blockRepository + * @param BlockCollectionFactory $blockCollectionFactory * @param FilterEmulate $widgetFilter - * @param StoreManagerInterface $storeManager - * @param SearchCriteriaBuilder $searchCriteriaBuilder */ public function __construct( - BlockRepositoryInterface $blockRepository, - FilterEmulate $widgetFilter, - StoreManagerInterface $storeManager, - SearchCriteriaBuilder $searchCriteriaBuilder + BlockCollectionFactory $blockCollectionFactory, + FilterEmulate $widgetFilter ) { - $this->blockRepository = $blockRepository; $this->widgetFilter = $widgetFilter; - $this->storeManager = $storeManager; - $this->searchCriteriaBuilder = $searchCriteriaBuilder; + $this->blockCollectionFactory = $blockCollectionFactory; } /** * Get block data * * @param string $blockIdentifier + * @param Store $currentStore * @return array - * @throws LocalizedException + * @throws NoSuchEntityException */ - public function getData(string $blockIdentifier): array + public function getData(string $blockIdentifier, Store $currentStore): array { $filterBy = BlockInterface::IDENTIFIER; - $storeId = (int)$this->storeManager->getStore()->getId(); + $storeId = (int)$currentStore->getId(); if (is_numeric($blockIdentifier)) { $filterBy = BlockInterface::BLOCK_ID; } - $searchCriteria = $this->searchCriteriaBuilder->addFilter( - 'store_id', - $storeId, - 'eq' - )->addFilter( - $filterBy, - $blockIdentifier, - 'eq' - )->setPageSize(1)->setCurrentPage(1)->create(); - - $blocks = $this->blockRepository->getList($searchCriteria)->getItems(); - if (count($blocks) != 1) { + /** @var BlockCollection $collection */ + $collection = $this->blockCollectionFactory->create(); + $collection->addFieldToFilter($filterBy, ["eq" => $blockIdentifier]); + $collection->addFieldToFilter("store_id", ["eq" => $storeId]); + $collection->load(); + if ($collection->count() < 1) { throw new NoSuchEntityException( __('The CMS block with the "%1" ID doesn\'t exist.', $blockIdentifier) ); } - $block = array_values($blocks)[0]; + /** @var BlockModel $block */ + $block = $collection->getFirstItem(); if (false === $block->isActive()) { throw new NoSuchEntityException( __('The CMS block with the "%1" ID doesn\'t exist.', $blockIdentifier) From f7401b1f636028072ee48a0a58ac5545446fe31f Mon Sep 17 00:00:00 2001 From: Rus0 Date: Mon, 9 Sep 2019 19:37:19 -0500 Subject: [PATCH 4/6] review changes --- app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php | 2 +- .../CmsGraphQl/Model/Resolver/DataProvider/Block.php | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php b/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php index f717c96a382b..d3d6076e71b5 100644 --- a/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php +++ b/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php @@ -86,7 +86,7 @@ private function getBlocksData(array $blockIdentifiers, Store $currentStore): ar foreach ($blockIdentifiers as $blockIdentifier) { try { $blocksData[$blockIdentifier] = $this->blockDataProvider->getData($blockIdentifier, $currentStore); - } catch (LocalizedException $e) { + } catch (NoSuchEntityException $e) { $blocksData[$blockIdentifier] = new GraphQlNoSuchEntityException(__($e->getMessage()), $e); } } diff --git a/app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php b/app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php index 9c261bb875c5..80e31fb6518b 100644 --- a/app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php +++ b/app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php @@ -7,16 +7,12 @@ namespace Magento\CmsGraphQl\Model\Resolver\DataProvider; -use Magento\Cms\Api\BlockRepositoryInterface; use Magento\Cms\Api\Data\BlockInterface; use Magento\Cms\Model\Block as BlockModel; use Magento\Cms\Model\ResourceModel\Block\Collection as BlockCollection; use Magento\Cms\Model\ResourceModel\Block\CollectionFactory as BlockCollectionFactory; -use Magento\Framework\Api\SearchCriteriaBuilder; -use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Exception\NoSuchEntityException; use Magento\Store\Model\Store; -use Magento\Store\Model\StoreManagerInterface; use Magento\Widget\Model\Template\FilterEmulate; /** @@ -66,12 +62,6 @@ public function getData(string $blockIdentifier, Store $currentStore): array $collection = $this->blockCollectionFactory->create(); $collection->addFieldToFilter($filterBy, ["eq" => $blockIdentifier]); $collection->addFieldToFilter("store_id", ["eq" => $storeId]); - $collection->load(); - if ($collection->count() < 1) { - throw new NoSuchEntityException( - __('The CMS block with the "%1" ID doesn\'t exist.', $blockIdentifier) - ); - } /** @var BlockModel $block */ $block = $collection->getFirstItem(); From c96d4de5fc3a6463146e63dfd3386339d16a59c1 Mon Sep 17 00:00:00 2001 From: Lena Orobei Date: Wed, 11 Sep 2019 16:03:11 -0500 Subject: [PATCH 5/6] magento/graphql-ce#691: Added validation for store id in CMS Block --- app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php b/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php index d3d6076e71b5..5c77f90c27a8 100644 --- a/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php +++ b/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php @@ -8,7 +8,6 @@ namespace Magento\CmsGraphQl\Model\Resolver; use Magento\CmsGraphQl\Model\Resolver\DataProvider\Block as BlockDataProvider; -use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Exception\NoSuchEntityException; use Magento\Framework\GraphQl\Config\Element\Field; use Magento\Framework\GraphQl\Exception\GraphQlInputException; From be8d3323528c9cf2a222059ec990d077ca7cd7ea Mon Sep 17 00:00:00 2001 From: Lena Orobei Date: Wed, 11 Sep 2019 16:18:28 -0500 Subject: [PATCH 6/6] magento/graphql-ce#691: Added validation for store id in CMS Block --- app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php | 6 +++--- .../CmsGraphQl/Model/Resolver/DataProvider/Block.php | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php b/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php index 5c77f90c27a8..6e508d7e4ad9 100644 --- a/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php +++ b/app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php @@ -14,7 +14,7 @@ use Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException; use Magento\Framework\GraphQl\Query\ResolverInterface; use Magento\Framework\GraphQl\Schema\Type\ResolveInfo; -use Magento\Store\Model\Store; +use Magento\Store\Api\Data\StoreInterface; /** * CMS blocks field resolver, used for GraphQL request processing @@ -76,10 +76,10 @@ private function getBlockIdentifiers(array $args): array * Get blocks data * * @param array $blockIdentifiers - * @param Store $currentStore + * @param StoreInterface $currentStore * @return array */ - private function getBlocksData(array $blockIdentifiers, Store $currentStore): array + private function getBlocksData(array $blockIdentifiers, StoreInterface $currentStore): array { $blocksData = []; foreach ($blockIdentifiers as $blockIdentifier) { diff --git a/app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php b/app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php index 80e31fb6518b..4c126bd2a3f2 100644 --- a/app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php +++ b/app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php @@ -12,7 +12,7 @@ use Magento\Cms\Model\ResourceModel\Block\Collection as BlockCollection; use Magento\Cms\Model\ResourceModel\Block\CollectionFactory as BlockCollectionFactory; use Magento\Framework\Exception\NoSuchEntityException; -use Magento\Store\Model\Store; +use Magento\Store\Api\Data\StoreInterface; use Magento\Widget\Model\Template\FilterEmulate; /** @@ -46,11 +46,11 @@ public function __construct( * Get block data * * @param string $blockIdentifier - * @param Store $currentStore + * @param StoreInterface $currentStore * @return array * @throws NoSuchEntityException */ - public function getData(string $blockIdentifier, Store $currentStore): array + public function getData(string $blockIdentifier, StoreInterface $currentStore): array { $filterBy = BlockInterface::IDENTIFIER; $storeId = (int)$currentStore->getId();