Skip to content

Commit

Permalink
ENGCOM-2965: 139: Show only active categories #164
Browse files Browse the repository at this point in the history
 - Merge Pull Request magento/graphql-ce#164 from comwrap/graphql-ce:139-show-only-active-categories
 - Merged commits:
   1. ff64826
   2. ea8ea88
   3. 0d52d0d
   4. ce63f2a
   5. 05c40e8
   6. b777343
   7. e2c9ac0
   8. dfcac0c
   9. 8038f6e
   10. cd8b01b
   11. 1d622d4
   12. 6ac61ae
   13. 1495087
   14. 258a2d1
   15. 20306a4
   16. 46ca622
   17. 754e391
  • Loading branch information
magento-engcom-team committed Jan 23, 2019
2 parents 1fd2493 + 754e391 commit c59a0cb
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,21 @@ public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId): \Iterato

$collection->addFieldToFilter('level', ['gt' => $level]);
$collection->addFieldToFilter('level', ['lteq' => $level + $depth - self::DEPTH_OFFSET]);
$collection->addIsActiveFilter();
$collection->setOrder('level');
$collection->setOrder(
'position',
$collection::SORT_ORDER_DESC
);
$collection->getSelect()->orWhere(
$this->metadata->getMetadata(CategoryInterface::class)->getIdentifierField() . ' = ?',
$collection->getSelect()
->getConnection()
->quoteIdentifier(
'e.' . $this->metadata->getMetadata(CategoryInterface::class)->getIdentifierField()
) . ' = ?',
$rootCategoryId
);

return $collection->getIterator();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@ class ExtractDataFromCategoryTree
*/
private $categoryHydrator;

/**
* @var CategoryInterface;
*/
private $iteratingCategory;

/**
* @var int
*/
private $startCategoryFetchLevel = 1;

/**
* @param Hydrator $categoryHydrator
*/
Expand All @@ -42,14 +52,63 @@ public function execute(\Iterator $iterator): array
/** @var CategoryInterface $category */
$category = $iterator->current();
$iterator->next();
$nextCategory = $iterator->current();
$tree[$category->getId()] = $this->categoryHydrator->hydrateCategory($category);
$tree[$category->getId()]['model'] = $category;
if ($nextCategory && (int) $nextCategory->getLevel() !== (int) $category->getLevel()) {
$tree[$category->getId()]['children'] = $this->execute($iterator);

$pathElements = explode("/", $category->getPath());
if (empty($tree)) {
$this->startCategoryFetchLevel = count($pathElements) - 1;
}

$this->iteratingCategory = $category;
$currentLevelTree = $this->explodePathToArray($pathElements, $this->startCategoryFetchLevel);
if (empty($tree)) {
$tree = $currentLevelTree;
}
$tree = $this->mergeCategoriesTrees($currentLevelTree, $tree);
}

return $tree;
}

/**
* Merge together complex categories trees
*
* @param array $tree1
* @param array $tree2
* @return array
*/
private function mergeCategoriesTrees(array &$tree1, array &$tree2): array
{
$mergedTree = $tree1;
foreach ($tree2 as $currentKey => &$value) {
if (is_array($value) && isset($mergedTree[$currentKey]) && is_array($mergedTree[$currentKey])) {
$mergedTree[$currentKey] = $this->mergeCategoriesTrees($mergedTree[$currentKey], $value);
} else {
$mergedTree[$currentKey] = $value;
}
}
return $mergedTree;
}

/**
* Recursive method to generate tree for one category path
*
* @param array $pathElements
* @param int $index
* @return array
*/
private function explodePathToArray(array $pathElements, int $index): array
{
$tree = [];
$tree[$pathElements[$index]]['id'] = $pathElements[$index];
if ($index === count($pathElements) - 1) {
$tree[$pathElements[$index]] = $this->categoryHydrator->hydrateCategory($this->iteratingCategory);
$tree[$pathElements[$index]]['model'] = $this->iteratingCategory;
}
$currentIndex = $index;
$index++;
if (isset($pathElements[$index])) {
$tree[$pathElements[$currentIndex]]['children'] = $this->explodePathToArray($pathElements, $index);
}
return $tree;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ public function testCategoriesTree()
$responseDataObject = new DataObject($response);
//Some sort of smoke testing
self::assertEquals(
'Ololo',
$responseDataObject->getData('category/children/7/children/1/description')
'Its a description of Test Category 1.2',
$responseDataObject->getData('category/children/0/children/1/description')
);
self::assertEquals(
'default-category',
Expand All @@ -99,16 +99,54 @@ public function testCategoriesTree()
$responseDataObject->getData('category/children/0/default_sort_by')
);
self::assertCount(
8,
7,
$responseDataObject->getData('category/children')
);
self::assertCount(
2,
$responseDataObject->getData('category/children/7/children')
$responseDataObject->getData('category/children/0/children')
);
self::assertEquals(
5,
$responseDataObject->getData('category/children/7/children/1/children/0/id')
13,
$responseDataObject->getData('category/children/0/children/1/id')
);
}

/**
* @magentoApiDataFixture Magento/Customer/_files/customer.php
* @magentoApiDataFixture Magento/Catalog/_files/categories.php
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/
public function testGetCategoryById()
{
$rootCategoryId = 13;
$query = <<<QUERY
{
category(id: {$rootCategoryId}) {
id
name
}
}
QUERY;

// get customer ID token
/** @var \Magento\Integration\Api\CustomerTokenServiceInterface $customerTokenService */
$customerTokenService = $this->objectManager->create(
\Magento\Integration\Api\CustomerTokenServiceInterface::class
);
$customerToken = $customerTokenService->createCustomerAccessToken('customer@example.com', 'password');

$headerMap = ['Authorization' => 'Bearer ' . $customerToken];
$response = $this->graphQlQuery($query, [], '', $headerMap);
$responseDataObject = new DataObject($response);
//Some sort of smoke testing
self::assertEquals(
'Category 1.2',
$responseDataObject->getData('category/name')
);
self::assertEquals(
13,
$responseDataObject->getData('category/id')
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@
->setParentId(3)
->setPath('1/2/3/13')
->setLevel(3)
->setDescription('Ololo')
->setDescription('Its a description of Test Category 1.2')
->setAvailableSortBy('name')
->setDefaultSortBy('name')
->setIsActive(true)
Expand Down

0 comments on commit c59a0cb

Please sign in to comment.