Skip to content

Commit 9544fb2

Browse files
authored
Merge pull request #5077 from magento-honey-badgers/MC-23217-urlrewrites-bug
[honey] MC-23217: [GraphQL] Url rewrites is invalid
2 parents 3a2561d + 15f04a1 commit 9544fb2

File tree

3 files changed

+111
-18
lines changed

3 files changed

+111
-18
lines changed

app/code/Magento/CatalogUrlRewriteGraphQl/etc/di.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,12 @@
2222
</argument>
2323
</arguments>
2424
</type>
25+
26+
<type name="Magento\UrlRewriteGraphQl\Model\Resolver\UrlRewrite">
27+
<arguments>
28+
<argument name="entityTypeMapping" xsi:type="array">
29+
<item name="catalog_product" xsi:type="const">Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator::ENTITY_TYPE</item>
30+
</argument>
31+
</arguments>
32+
</type>
2533
</config>

app/code/Magento/UrlRewriteGraphQl/Model/Resolver/UrlRewrite.php

Lines changed: 64 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
1212
use Magento\Framework\GraphQl\Config\Element\Field;
1313
use Magento\Framework\GraphQl\Query\ResolverInterface;
14-
use Magento\Framework\Model\AbstractModel;
1514
use Magento\UrlRewrite\Model\UrlFinderInterface;
1615
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite as UrlRewriteDTO;
16+
use Magento\Framework\Model\AbstractModel;
17+
use Magento\Framework\EntityManager\TypeResolver;
18+
use Magento\Framework\EntityManager\MetadataPool;
1719

1820
/**
1921
* Returns URL rewrites list for the specified product
@@ -25,13 +27,37 @@ class UrlRewrite implements ResolverInterface
2527
*/
2628
private $urlFinder;
2729

30+
/**
31+
* @var array
32+
*/
33+
private $entityTypeMapping;
34+
35+
/**
36+
* @var MetadataPool
37+
*/
38+
private $metadataPool;
39+
40+
/**
41+
* @var TypeResolver
42+
*/
43+
private $typeResolver;
44+
2845
/**
2946
* @param UrlFinderInterface $urlFinder
47+
* @param TypeResolver $typeResolver
48+
* @param MetadataPool $metadataPool
49+
* @param array $entityTypeMapping
3050
*/
3151
public function __construct(
32-
UrlFinderInterface $urlFinder
52+
UrlFinderInterface $urlFinder,
53+
TypeResolver $typeResolver,
54+
MetadataPool $metadataPool,
55+
array $entityTypeMapping = []
3356
) {
3457
$this->urlFinder = $urlFinder;
58+
$this->typeResolver = $typeResolver;
59+
$this->metadataPool = $metadataPool;
60+
$this->entityTypeMapping = $entityTypeMapping;
3561
}
3662

3763
/**
@@ -48,11 +74,24 @@ public function resolve(
4874
throw new LocalizedException(__('"model" value should be specified'));
4975
}
5076

51-
/** @var AbstractModel $entity */
77+
/** @var AbstractModel $entity */
5278
$entity = $value['model'];
5379
$entityId = $entity->getEntityId();
5480

55-
$urlRewriteCollection = $this->urlFinder->findAllByData([UrlRewriteDTO::ENTITY_ID => $entityId]);
81+
$resolveEntityType = $this->typeResolver->resolve($entity);
82+
$metadata = $this->metadataPool->getMetadata($resolveEntityType);
83+
$entityType = $this->getEntityType($metadata->getEavEntityType());
84+
85+
$storeId = (int)$context->getExtensionAttributes()->getStore()->getId();
86+
87+
$data = [
88+
UrlRewriteDTO::ENTITY_TYPE => $entityType,
89+
UrlRewriteDTO::ENTITY_ID => $entityId,
90+
UrlRewriteDTO::STORE_ID => $storeId
91+
];
92+
93+
$urlRewriteCollection = $this->urlFinder->findAllByData($data);
94+
5695
$urlRewrites = [];
5796

5897
/** @var UrlRewriteDTO $urlRewrite */
@@ -82,13 +121,30 @@ private function getUrlParameters(string $targetPath): array
82121
$targetPathParts = explode('/', trim($targetPath, '/'));
83122
$count = count($targetPathParts) - 1;
84123

85-
for ($i = 3; $i < $count; $i += 2) {
124+
/** $index starts from 3 to eliminate catalog/product/view/ part and fetch only name,
125+
value data from from target path */
126+
//phpcs:ignore Generic.CodeAnalysis.ForLoopWithTestFunctionCall
127+
for ($index = 3; $index < $count; $index += 2) {
86128
$urlParameters[] = [
87-
'name' => $targetPathParts[$i],
88-
'value' => $targetPathParts[$i + 1]
129+
'name' => $targetPathParts[$index],
130+
'value' => $targetPathParts[$index + 1]
89131
];
90132
}
91-
92133
return $urlParameters;
93134
}
135+
136+
/**
137+
* Get the entity type
138+
*
139+
* @param string $entityTypeMetadata
140+
* @return string
141+
*/
142+
private function getEntityType(string $entityTypeMetadata) : string
143+
{
144+
$entityType = '';
145+
if ($entityTypeMetadata) {
146+
$entityType = $this->entityTypeMapping[$entityTypeMetadata];
147+
}
148+
return $entityType;
149+
}
94150
}

dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/UrlRewritesTest.php

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
use Magento\TestFramework\TestCase\GraphQlAbstract;
1313
use Magento\UrlRewrite\Model\UrlFinderInterface;
1414
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite as UrlRewriteDTO;
15+
use Magento\Eav\Model\Config as EavConfig;
16+
use Magento\Store\Model\StoreManagerInterface;
1517

1618
/**
1719
* Test of getting URL rewrites data from products
@@ -54,9 +56,22 @@ public function testProductWithNoCategoriesAssigned()
5456
$productRepository = ObjectManager::getInstance()->get(ProductRepositoryInterface::class);
5557
$product = $productRepository->get('virtual-product', false, null, true);
5658

59+
$storeId = ObjectManager::getInstance()->get(StoreManagerInterface::class)->getStore()->getId();
5760
$urlFinder = ObjectManager::getInstance()->get(UrlFinderInterface::class);
61+
$entityType = ObjectManager::getInstance()->create(EavConfig::class)->getEntityType('catalog_product');
5862

59-
$rewritesCollection = $urlFinder->findAllByData([UrlRewriteDTO::ENTITY_ID => $product->getId()]);
63+
$entityTypeCode = $entityType->getEntityTypeCode();
64+
if ($entityTypeCode === 'catalog_product') {
65+
$entityTypeCode = 'product';
66+
}
67+
68+
$rewritesCollection = $urlFinder->findAllByData(
69+
[
70+
UrlRewriteDTO::ENTITY_ID => $product->getId(),
71+
UrlRewriteDTO::ENTITY_TYPE => $entityTypeCode,
72+
UrlRewriteDTO::STORE_ID => $storeId
73+
]
74+
);
6075

6176
/* There should be only one rewrite */
6277
/** @var UrlRewriteDTO $urlRewrite */
@@ -110,18 +125,32 @@ public function testProductWithOneCategoryAssigned()
110125
$productRepository = ObjectManager::getInstance()->get(ProductRepositoryInterface::class);
111126
$product = $productRepository->get('simple', false, null, true);
112127

128+
$storeId = ObjectManager::getInstance()->get(StoreManagerInterface::class)->getStore()->getId();
113129
$urlFinder = ObjectManager::getInstance()->get(UrlFinderInterface::class);
130+
$entityType = ObjectManager::getInstance()->create(EavConfig::class)->getEntityType('catalog_product');
114131

115-
$rewritesCollection = $urlFinder->findAllByData([UrlRewriteDTO::ENTITY_ID => $product->getId()]);
116-
$rewritesCount = count($rewritesCollection);
132+
$entityTypeCode = $entityType->getEntityTypeCode();
133+
if ($entityTypeCode === 'catalog_product') {
134+
$entityTypeCode = 'product';
135+
}
117136

137+
$rewritesCollection = $urlFinder->findAllByData(
138+
[
139+
UrlRewriteDTO::ENTITY_ID => $product->getId(),
140+
UrlRewriteDTO::ENTITY_TYPE => $entityTypeCode,
141+
UrlRewriteDTO::STORE_ID => $storeId
142+
]
143+
);
144+
145+
$rewritesCount = count($rewritesCollection);
118146
$this->assertArrayHasKey('url_rewrites', $response['products']['items'][0]);
147+
$this->assertCount(1, $response['products']['items'][0]['url_rewrites']);
119148
$this->assertCount($rewritesCount, $response['products']['items'][0]['url_rewrites']);
120149

121-
for ($i = 0; $i < $rewritesCount; $i++) {
122-
$urlRewrite = $rewritesCollection[$i];
150+
for ($index = 0; $index < $rewritesCount; $index++) {
151+
$urlRewrite = $rewritesCollection[$index];
123152
$this->assertResponseFields(
124-
$response['products']['items'][0]['url_rewrites'][$i],
153+
$response['products']['items'][0]['url_rewrites'][$index],
125154
[
126155
"url" => $urlRewrite->getRequestPath(),
127156
"parameters" => $this->getUrlParameters($urlRewrite->getTargetPath())
@@ -141,11 +170,11 @@ private function getUrlParameters(string $targetPath): array
141170
$urlParameters = [];
142171
$targetPathParts = explode('/', trim($targetPath, '/'));
143172
$count = count($targetPathParts) - 1;
144-
145-
for ($i = 3; $i < $count; $i += 2) {
173+
//phpcs:ignore Generic.CodeAnalysis.ForLoopWithTestFunctionCall
174+
for ($index = 3; $index < $count; $index += 2) {
146175
$urlParameters[] = [
147-
'name' => $targetPathParts[$i],
148-
'value' => $targetPathParts[$i + 1]
176+
'name' => $targetPathParts[$index],
177+
'value' => $targetPathParts[$index + 1]
149178
];
150179
}
151180

0 commit comments

Comments
 (0)