Skip to content

Commit 4835285

Browse files
committed
GraphQl-198: Products: access to related/up-sell/cross-sell product fields
1 parent 4a5b330 commit 4835285

File tree

8 files changed

+275
-316
lines changed

8 files changed

+275
-316
lines changed

app/code/Magento/RelatedProductGraphQl/Model/DataProvider/RelatedDataProvider.php

Lines changed: 0 additions & 80 deletions
This file was deleted.
Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66
declare(strict_types=1);
77

8-
namespace Magento\RelatedProductGraphQl\Model\DataProvider\Products;
8+
namespace Magento\RelatedProductGraphQl\Model\DataProvider;
99

1010
use Magento\Catalog\Model\Product;
1111
use Magento\Catalog\Model\Product\Link;
@@ -14,7 +14,7 @@
1414
/**
1515
* Related Products Data Provider
1616
*/
17-
class LinkedProductsDataProvider
17+
class RelatedProductDataProvider
1818
{
1919
/**
2020
* @var LinkFactory
@@ -24,24 +24,45 @@ class LinkedProductsDataProvider
2424
/**
2525
* @param LinkFactory $linkFactory
2626
*/
27-
public function __construct(LinkFactory $linkFactory)
28-
{
27+
public function __construct(
28+
LinkFactory $linkFactory
29+
) {
2930
$this->linkFactory = $linkFactory;
3031
}
3132

3233
/**
33-
* Get Related Products by Product and Link Type
34+
* Related Products Data
35+
*
36+
* @param Product $product
37+
* @param array $fields
38+
* @param int $linkType
39+
* @return array
40+
*/
41+
public function getData(Product $product, array $fields, int $linkType): array
42+
{
43+
$relatedProducts = $this->getRelatedProducts($product, $fields, $linkType);
44+
45+
$data = [];
46+
foreach ($relatedProducts as $relatedProduct) {
47+
$relatedProductData = $relatedProduct->getData();
48+
$relatedProductData['model'] = $relatedProduct;
49+
}
50+
return $data;
51+
}
52+
53+
/**
54+
* Get Related Products
3455
*
3556
* @param Product $product
3657
* @param array $fields
3758
* @param int $linkType
3859
* @return Product[]
3960
*/
40-
public function getRelatedProducts(Product $product, array $fields, int $linkType): array
61+
private function getRelatedProducts(Product $product, array $fields, int $linkType): array
4162
{
4263
/** @var Link $link */
4364
$link = $this->linkFactory->create([ 'data' => [
44-
'link_type_id' => $linkType
65+
'link_type_id' => $linkType,
4566
]]);
4667

4768
$collection = $link->getProductCollection();

app/code/Magento/RelatedProductGraphQl/Model/Resolver/CrossSellProducts.php

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77

88
namespace Magento\RelatedProductGraphQl\Model\Resolver;
99

10-
use Magento\RelatedProductGraphQl\Model\DataProvider\RelatedDataProvider;
10+
use Magento\Catalog\Model\Product\Link;
11+
use Magento\CatalogGraphQl\Model\Resolver\Product\ProductFieldsSelector;
12+
use Magento\Framework\Exception\LocalizedException;
13+
use Magento\RelatedProductGraphQl\Model\DataProvider\RelatedProductDataProvider;
1114
use Magento\Framework\GraphQl\Config\Element\Field;
1215
use Magento\Framework\GraphQl\Query\ResolverInterface;
1316
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
@@ -18,27 +21,39 @@
1821
class CrossSellProducts implements ResolverInterface
1922
{
2023
/**
21-
* @see module di.xml
22-
* @var RelatedDataProvider
24+
* @var ProductFieldsSelector
2325
*/
24-
private $dataProvider;
26+
private $productFieldsSelector;
2527

2628
/**
27-
* @param RelatedDataProvider $dataProvider
29+
* @var RelatedProductDataProvider
30+
*/
31+
private $relatedProductDataProvider;
32+
33+
/**
34+
* @param ProductFieldsSelector $productFieldsSelector
35+
* @param RelatedProductDataProvider $relatedProductDataProvider
2836
*/
2937
public function __construct(
30-
RelatedDataProvider $dataProvider
38+
ProductFieldsSelector $productFieldsSelector,
39+
RelatedProductDataProvider $relatedProductDataProvider
3140
) {
32-
$this->dataProvider = $dataProvider;
41+
$this->productFieldsSelector = $productFieldsSelector;
42+
$this->relatedProductDataProvider = $relatedProductDataProvider;
3343
}
3444

3545
/**
3646
* @inheritdoc
3747
*/
3848
public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null)
3949
{
40-
$data = $this->dataProvider->getProducts($info, $value);
50+
if (!isset($value['model'])) {
51+
throw new LocalizedException(__('"model" value should be specified'));
52+
}
53+
$product = $value['model'];
54+
$fields = $this->productFieldsSelector->getProductFieldsFromInfo($info, 'crosssell_products');
4155

56+
$data = $this->relatedProductDataProvider->getData($product, $fields, Link::LINK_TYPE_CROSSSELL);
4257
return $data;
4358
}
4459
}

app/code/Magento/RelatedProductGraphQl/Model/Resolver/RelatedProducts.php

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77

88
namespace Magento\RelatedProductGraphQl\Model\Resolver;
99

10-
use Magento\RelatedProductGraphQl\Model\DataProvider\RelatedDataProvider;
10+
use Magento\Catalog\Model\Product\Link;
11+
use Magento\CatalogGraphQl\Model\Resolver\Product\ProductFieldsSelector;
12+
use Magento\Framework\Exception\LocalizedException;
13+
use Magento\RelatedProductGraphQl\Model\DataProvider\RelatedProductDataProvider;
1114
use Magento\Framework\GraphQl\Config\Element\Field;
1215
use Magento\Framework\GraphQl\Query\ResolverInterface;
1316
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
@@ -18,26 +21,39 @@
1821
class RelatedProducts implements ResolverInterface
1922
{
2023
/**
21-
* @var RelatedDataProvider
24+
* @var ProductFieldsSelector
2225
*/
23-
private $dataProvider;
26+
private $productFieldsSelector;
2427

2528
/**
26-
* @param RelatedDataProvider $dataProvider
29+
* @var RelatedProductDataProvider
30+
*/
31+
private $relatedProductDataProvider;
32+
33+
/**
34+
* @param ProductFieldsSelector $productFieldsSelector
35+
* @param RelatedProductDataProvider $relatedProductDataProvider
2736
*/
2837
public function __construct(
29-
RelatedDataProvider $dataProvider
38+
ProductFieldsSelector $productFieldsSelector,
39+
RelatedProductDataProvider $relatedProductDataProvider
3040
) {
31-
$this->dataProvider = $dataProvider;
41+
$this->productFieldsSelector = $productFieldsSelector;
42+
$this->relatedProductDataProvider = $relatedProductDataProvider;
3243
}
3344

3445
/**
3546
* @inheritdoc
3647
*/
3748
public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null)
3849
{
39-
$data = $this->dataProvider->getProducts($info, $value);
50+
if (!isset($value['model'])) {
51+
throw new LocalizedException(__('"model" value should be specified'));
52+
}
53+
$product = $value['model'];
54+
$fields = $this->productFieldsSelector->getProductFieldsFromInfo($info, 'related_products');
4055

56+
$data = $this->relatedProductDataProvider->getData($product, $fields, Link::LINK_TYPE_RELATED);
4157
return $data;
4258
}
4359
}

app/code/Magento/RelatedProductGraphQl/Model/Resolver/UpSellProducts.php

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77

88
namespace Magento\RelatedProductGraphQl\Model\Resolver;
99

10-
use Magento\RelatedProductGraphQl\Model\DataProvider\RelatedDataProvider;
10+
use Magento\Catalog\Model\Product\Link;
11+
use Magento\CatalogGraphQl\Model\Resolver\Product\ProductFieldsSelector;
12+
use Magento\Framework\Exception\LocalizedException;
13+
use Magento\RelatedProductGraphQl\Model\DataProvider\RelatedProductDataProvider;
1114
use Magento\Framework\GraphQl\Config\Element\Field;
1215
use Magento\Framework\GraphQl\Query\ResolverInterface;
1316
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
@@ -18,27 +21,39 @@
1821
class UpSellProducts implements ResolverInterface
1922
{
2023
/**
21-
* @see module di.xml
22-
* @var RelatedDataProvider
24+
* @var ProductFieldsSelector
2325
*/
24-
private $dataProvider;
26+
private $productFieldsSelector;
2527

2628
/**
27-
* @param RelatedDataProvider $dataProvider
29+
* @var RelatedProductDataProvider
30+
*/
31+
private $relatedProductDataProvider;
32+
33+
/**
34+
* @param ProductFieldsSelector $productFieldsSelector
35+
* @param RelatedProductDataProvider $relatedProductDataProvider
2836
*/
2937
public function __construct(
30-
RelatedDataProvider $dataProvider
38+
ProductFieldsSelector $productFieldsSelector,
39+
RelatedProductDataProvider $relatedProductDataProvider
3140
) {
32-
$this->dataProvider = $dataProvider;
41+
$this->productFieldsSelector = $productFieldsSelector;
42+
$this->relatedProductDataProvider = $relatedProductDataProvider;
3343
}
3444

3545
/**
3646
* @inheritdoc
3747
*/
3848
public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null)
3949
{
40-
$data = $this->dataProvider->getProducts($info, $value);
50+
if (!isset($value['model'])) {
51+
throw new LocalizedException(__('"model" value should be specified'));
52+
}
53+
$product = $value['model'];
54+
$fields = $this->productFieldsSelector->getProductFieldsFromInfo($info, 'upsell_products');
4155

56+
$data = $this->relatedProductDataProvider->getData($product, $fields, Link::LINK_TYPE_UPSELL);
4257
return $data;
4358
}
4459
}

app/code/Magento/RelatedProductGraphQl/etc/graphql/di.xml

Lines changed: 0 additions & 31 deletions
This file was deleted.

0 commit comments

Comments
 (0)