Skip to content

Commit

Permalink
ENGCOM-2965: 139: Show only active categories #164
Browse files Browse the repository at this point in the history
  • Loading branch information
naydav authored Jan 24, 2019
2 parents 48f9cd1 + c59a0cb commit 6ee10ce
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 6ee10ce

Please sign in to comment.