This repository was archived by the owner on Dec 19, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 153
Added URL rewrites data to the product interface #107
Merged
Merged
Changes from all commits
Commits
Show all changes
17 commits
Select commit
Hold shift + click to select a range
d6d0872
Added URL rewrites data to the product interface
rogyar b583ee7
Merge remote-tracking branch 'origin/2.3-develop' into product-url-re…
57c2e4c
Merge branch '2.3-develop' into product-url-rewrites
rogyar 46a871e
Api-functional test for product with no categories
rogyar dfabfe5
Api-functional test for product with categories
rogyar e0f4132
url_rewrites attribute moved to UrlRewriteGraphQl module
rogyar e9a06a6
API-functional tests improvements
rogyar b062bd9
Merge branch '2.3-develop' into product-url-rewrites
rogyar 1700740
Remove value factory. Return value directly
rogyar f141a0d
Merge branch '2.3-develop' into product-url-rewrites
rogyar e2cad89
Fix schema definitions after resolving the conflict
rogyar 16b72a8
Merge branch 'product-url-rewrites' of github.com:magento/graphql-ce …
df3360b
Merge remote-tracking branch 'origin/2.3-develop' into product-url-re…
987b138
GraphQL-84: Return URL Rewrites for products
0fe1ae5
GraphQL-84: Return URL Rewrites for products
7b8799d
GraphQL-84: Return URL Rewrites for products
6d8e43d
Merge remote-tracking branch 'origin/2.3-develop' into product-url-re…
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
148 changes: 148 additions & 0 deletions
148
app/code/Magento/UrlRewriteGraphQl/Model/Resolver/EntityUrl.php
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,148 @@ | ||
<?php | ||
/** | ||
* Copyright © Magento, Inc. All rights reserved. | ||
* See COPYING.txt for license details. | ||
*/ | ||
declare(strict_types=1); | ||
|
||
namespace Magento\UrlRewriteGraphQl\Model\Resolver; | ||
|
||
use Magento\Framework\GraphQl\Exception\GraphQlInputException; | ||
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo; | ||
use Magento\Framework\GraphQl\Config\Element\Field; | ||
use Magento\Framework\GraphQl\Query\ResolverInterface; | ||
use Magento\Store\Model\StoreManagerInterface; | ||
use Magento\UrlRewrite\Model\UrlFinderInterface; | ||
use Magento\UrlRewriteGraphQl\Model\Resolver\UrlRewrite\CustomUrlLocatorInterface; | ||
|
||
/** | ||
* UrlRewrite field resolver, used for GraphQL request processing. | ||
*/ | ||
class EntityUrl implements ResolverInterface | ||
{ | ||
/** | ||
* @var UrlFinderInterface | ||
*/ | ||
private $urlFinder; | ||
|
||
/** | ||
* @var StoreManagerInterface | ||
*/ | ||
private $storeManager; | ||
|
||
/** | ||
* @var CustomUrlLocatorInterface | ||
*/ | ||
private $customUrlLocator; | ||
|
||
/** | ||
* @param UrlFinderInterface $urlFinder | ||
* @param StoreManagerInterface $storeManager | ||
* @param CustomUrlLocatorInterface $customUrlLocator | ||
*/ | ||
public function __construct( | ||
UrlFinderInterface $urlFinder, | ||
StoreManagerInterface $storeManager, | ||
CustomUrlLocatorInterface $customUrlLocator | ||
) { | ||
$this->urlFinder = $urlFinder; | ||
$this->storeManager = $storeManager; | ||
$this->customUrlLocator = $customUrlLocator; | ||
} | ||
|
||
/** | ||
* @inheritdoc | ||
*/ | ||
public function resolve( | ||
Field $field, | ||
$context, | ||
ResolveInfo $info, | ||
array $value = null, | ||
array $args = null | ||
) { | ||
if (!isset($args['url']) || empty(trim($args['url']))) { | ||
throw new GraphQlInputException(__('"url" argument should be specified and not empty')); | ||
} | ||
|
||
$result = null; | ||
$url = $args['url']; | ||
if (substr($url, 0, 1) === '/' && $url !== '/') { | ||
$url = ltrim($url, '/'); | ||
} | ||
$customUrl = $this->customUrlLocator->locateUrl($url); | ||
$url = $customUrl ?: $url; | ||
$urlRewrite = $this->findCanonicalUrl($url); | ||
if ($urlRewrite) { | ||
$result = [ | ||
'id' => $urlRewrite->getEntityId(), | ||
'canonical_url' => $urlRewrite->getTargetPath(), | ||
'type' => $this->sanitizeType($urlRewrite->getEntityType()) | ||
]; | ||
} | ||
return $result; | ||
} | ||
|
||
/** | ||
* Find the canonical url passing through all redirects if any | ||
* | ||
* @param string $requestPath | ||
* @return \Magento\UrlRewrite\Service\V1\Data\UrlRewrite|null | ||
*/ | ||
private function findCanonicalUrl(string $requestPath) : ?\Magento\UrlRewrite\Service\V1\Data\UrlRewrite | ||
{ | ||
$urlRewrite = $this->findUrlFromRequestPath($requestPath); | ||
if ($urlRewrite && $urlRewrite->getRedirectType() > 0) { | ||
while ($urlRewrite && $urlRewrite->getRedirectType() > 0) { | ||
$urlRewrite = $this->findUrlFromRequestPath($urlRewrite->getTargetPath()); | ||
} | ||
} | ||
if (!$urlRewrite) { | ||
$urlRewrite = $this->findUrlFromTargetPath($requestPath); | ||
} | ||
|
||
return $urlRewrite; | ||
} | ||
|
||
/** | ||
* Find a url from a request url on the current store | ||
* | ||
* @param string $requestPath | ||
* @return \Magento\UrlRewrite\Service\V1\Data\UrlRewrite|null | ||
*/ | ||
private function findUrlFromRequestPath(string $requestPath) : ?\Magento\UrlRewrite\Service\V1\Data\UrlRewrite | ||
{ | ||
return $this->urlFinder->findOneByData( | ||
[ | ||
'request_path' => $requestPath, | ||
'store_id' => $this->storeManager->getStore()->getId() | ||
] | ||
); | ||
} | ||
|
||
/** | ||
* Find a url from a target url on the current store | ||
* | ||
* @param string $targetPath | ||
* @return \Magento\UrlRewrite\Service\V1\Data\UrlRewrite|null | ||
*/ | ||
private function findUrlFromTargetPath(string $targetPath) : ?\Magento\UrlRewrite\Service\V1\Data\UrlRewrite | ||
{ | ||
return $this->urlFinder->findOneByData( | ||
[ | ||
'target_path' => $targetPath, | ||
'store_id' => $this->storeManager->getStore()->getId() | ||
] | ||
); | ||
} | ||
|
||
/** | ||
* Sanitize the type to fit schema specifications | ||
* | ||
* @param string $type | ||
* @return string | ||
*/ | ||
private function sanitizeType(string $type) : string | ||
{ | ||
return strtoupper(str_replace('-', '_', $type)); | ||
} | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,25 @@ | ||
# Copyright © Magento, Inc. All rights reserved. | ||
# See COPYING.txt for license details. | ||
|
||
type EntityUrl @doc(description: "EntityUrl is an output object containing the `id`, `relative_url`, and `type` attributes") { | ||
type EntityUrl @doc(description: "EntityUrl is an output object containing the `id`, `canonical_url`, and `type` attributes") { | ||
id: Int @doc(description: "The ID assigned to the object associated with the specified url. This could be a product ID, category ID, or page ID.") | ||
relative_url: String @doc(description: "The internal relative URL. If the specified url is a redirect, the query returns the redirected URL, not the original.") | ||
canonical_url: String @doc(description: "The internal relative URL. If the specified url is a redirect, the query returns the redirected URL, not the original.") | ||
type: UrlRewriteEntityTypeEnum @doc(description: "One of PRODUCT, CATEGORY, or CMS_PAGE.") | ||
} | ||
|
||
type Query { | ||
urlResolver(url: String!): EntityUrl @resolver(class: "Magento\\UrlRewriteGraphQl\\Model\\Resolver\\UrlRewrite") @doc(description: "The urlResolver query returns the relative URL for a specified product, category or CMS page") | ||
urlResolver(url: String!): EntityUrl @resolver(class: "Magento\\UrlRewriteGraphQl\\Model\\Resolver\\EntityUrl") @doc(description: "The urlResolver query returns the relative URL for a specified product, category or CMS page") | ||
} | ||
|
||
enum UrlRewriteEntityTypeEnum { | ||
} | ||
|
||
type UrlRewrite @doc(description: "The object contains URL rewrite details") { | ||
url: String @doc(description: "Request URL") | ||
parameters: [HttpQueryParameter] @doc(description: "Request parameters") | ||
} | ||
|
||
type HttpQueryParameter @doc(description: "The object details of target path parameters") { | ||
name: String @doc(description: "Parameter name") | ||
value: String @doc(description: "Parameter value") | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As EntityUrl and UrlRewrite are pretty similar it is better to describe their purpose in class comments (now both classes have same description so to understand what is needed source code should be explored)