Skip to content
This repository was archived by the owner on Apr 29, 2019. It is now read-only.

Commit 8954d07

Browse files
authored
Merge pull request #1955 from magento-honey-badgers/MAGETWO-85687-Graphql-Declarative-schema
[honey] MAGETWO-85687: GraphQL Declarative Schema
2 parents f6d664e + eae97bd commit 8954d07

File tree

201 files changed

+5986
-2901
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

201 files changed

+5986
-2901
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\CatalogGraphQl\Model;
8+
9+
use Magento\Framework\GraphQl\Config\Data\TypeResolverInterface;
10+
use Magento\Framework\Exception\InputException;
11+
12+
/**
13+
* {@inheritdoc}
14+
*/
15+
class ConcreteTypeResolver implements TypeResolverInterface
16+
{
17+
/**
18+
* {@inheritdoc}
19+
*/
20+
public function resolveType(array $data)
21+
{
22+
if (!isset($data['type_id'])) {
23+
throw new InputException(
24+
__('%1 key doesn\'t exist in product data', [$data['type_id']])
25+
);
26+
}
27+
28+
if ($data['type_id'] == 'simple') {
29+
return 'SimpleProduct';
30+
}
31+
32+
return null;
33+
}
34+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\CatalogGraphQl\Model\Config;
8+
9+
use Magento\Framework\Config\ReaderInterface;
10+
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
11+
use Magento\Framework\GraphQl\Type\Entity\MapperInterface;
12+
use Magento\Framework\Reflection\TypeProcessor;
13+
use Magento\EavGraphQl\Model\Resolver\Query\Type;
14+
use Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory;
15+
use Magento\Catalog\Model\ResourceModel\Product\Attribute\Collection;
16+
17+
/**
18+
* Adds custom/eav attribute to Catalog product types in the GraphQL config.
19+
*/
20+
class AttributeReader implements ReaderInterface
21+
{
22+
/**
23+
* @var MapperInterface
24+
*/
25+
private $mapper;
26+
27+
/**
28+
* @var Type
29+
*/
30+
private $typeLocator;
31+
32+
/**
33+
* @var CollectionFactory
34+
*/
35+
private $collectionFactory;
36+
37+
/**
38+
* @param MapperInterface $mapper
39+
* @param Type $typeLocator
40+
* @param CollectionFactory $collectionFactory
41+
*/
42+
public function __construct(
43+
MapperInterface $mapper,
44+
Type $typeLocator,
45+
CollectionFactory $collectionFactory
46+
) {
47+
$this->mapper = $mapper;
48+
$this->typeLocator = $typeLocator;
49+
$this->collectionFactory = $collectionFactory;
50+
}
51+
52+
/**
53+
* Read configuration scope
54+
*
55+
* @param string|null $scope
56+
* @return array
57+
* @throws GraphQlInputException
58+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
59+
*/
60+
public function read($scope = null)
61+
{
62+
$targetStructures = $this->mapper->getMappedTypes(\Magento\Catalog\Model\Product::ENTITY);
63+
$config =[];
64+
/** @var Collection $collection */
65+
$collection = $this->collectionFactory->create();
66+
$collection->addFieldToFilter('is_user_defined', '1');
67+
$collection->addFieldToFilter('attribute_code', ['neq' => 'cost']);
68+
/** @var \Magento\Catalog\Model\ResourceModel\Eav\Attribute $attribute */
69+
foreach ($collection as $attribute) {
70+
$attributeCode = $attribute->getAttributeCode();
71+
$locatedType = $this->typeLocator->getType(
72+
$attributeCode,
73+
\Magento\Catalog\Model\Product::ENTITY
74+
) ?: 'String';
75+
$locatedType = $locatedType === TypeProcessor::NORMALIZED_ANY_TYPE ? 'String' : ucfirst($locatedType);
76+
foreach ($targetStructures as $structure) {
77+
$config[$structure]['fields'][$attributeCode] = [
78+
'name' => $attributeCode,
79+
'type' => $locatedType,
80+
'arguments' => []
81+
];
82+
}
83+
}
84+
85+
return $config;
86+
}
87+
}

app/code/Magento/GraphQlCatalog/Model/Resolver/Products.php renamed to app/code/Magento/CatalogGraphQl/Model/Resolver/Products.php

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,14 @@
44
* See COPYING.txt for license details.
55
*/
66

7-
namespace Magento\GraphQlCatalog\Model\Resolver;
7+
namespace Magento\CatalogGraphQl\Model\Resolver;
88

9-
use Magento\Framework\Api\Search\SearchCriteriaInterfaceFactory;
109
use Magento\GraphQl\Model\ResolverContextInterface;
1110
use Magento\GraphQl\Model\ResolverInterface;
1211
use Magento\Framework\GraphQl\Argument\SearchCriteria\Builder;
1312
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
14-
use Magento\GraphQl\Model\ContextInterface;
15-
use Magento\GraphQlCatalog\Model\Resolver\Products\Query\Filter;
16-
use Magento\GraphQlCatalog\Model\Resolver\Products\Query\Search;
13+
use Magento\CatalogGraphQl\Model\Resolver\Products\Query\Filter;
14+
use Magento\CatalogGraphQl\Model\Resolver\Products\Query\Search;
1715

1816
/**
1917
* Products field resolver, used for GraphQL request processing.
@@ -63,7 +61,12 @@ public function resolve(array $args, ResolverContextInterface $context)
6361
$searchResult = $this->filterQuery->getResult($searchCriteria);
6462
}
6563

66-
$maxPages = ceil($searchResult->getTotalCount() / $searchCriteria->getPageSize());
64+
//possible division by 0
65+
if ($searchCriteria->getPageSize()) {
66+
$maxPages = ceil($searchResult->getTotalCount() / $searchCriteria->getPageSize());
67+
} else {
68+
$maxPages = 0;
69+
}
6770
if ($searchCriteria->getCurrentPage() > $maxPages && $searchResult->getTotalCount() > 0) {
6871
throw new GraphQlInputException(
6972
__(

app/code/Magento/GraphQlCatalog/Model/Resolver/Products/DataProvider/Product.php renamed to app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Product.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* See COPYING.txt for license details.
55
*/
66

7-
namespace Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider;
7+
namespace Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider;
88

99
use Magento\Catalog\Api\ProductRepositoryInterface;
1010
use Magento\Catalog\Model\Product\Option;
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
* See COPYING.txt for license details.
55
*/
66

7-
namespace Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider\Product\Formatter;
7+
namespace Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\Formatter;
88

99
use Magento\Catalog\Model\Product;
10-
use Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider\Product\FormatterInterface;
10+
use Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\FormatterInterface;
1111

1212
/**
1313
* Grabs the data from the product
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
* See COPYING.txt for license details.
55
*/
66

7-
namespace Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider\Product\Formatter;
7+
namespace Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\Formatter;
88

99
use Magento\Catalog\Model\Product;
10-
use Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider\Product\FormatterInterface;
10+
use Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\FormatterInterface;
1111

1212
/**
1313
* Populates the custom attributes
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
* See COPYING.txt for license details.
55
*/
66

7-
namespace Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider\Product\Formatter;
7+
namespace Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\Formatter;
88

99
use Magento\Catalog\Model\Product;
10-
use Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider\Product\FormatterInterface;
10+
use Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\FormatterInterface;
1111

1212
/**
1313
* Fixed the id related data in the product data
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
* See COPYING.txt for license details.
55
*/
66

7-
namespace Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider\Product\Formatter;
7+
namespace Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\Formatter;
88

99
use Magento\Catalog\Model\Product;
10-
use Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider\Product\FormatterInterface;
10+
use Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\FormatterInterface;
1111

1212
/**
1313
* Format a product's media gallery information to conform to GraphQL schema representation
@@ -21,9 +21,9 @@ class MediaGalleryEntries implements FormatterInterface
2121
*/
2222
public function format(Product $product, array $productData = [])
2323
{
24-
$productData['media_gallery_entries'] = $product->getMediaGalleryEntries();
25-
if (isset($productData['media_gallery_entries'])) {
26-
foreach ($productData['media_gallery_entries'] as $key => $entry) {
24+
if (!empty($product->getMediaGalleryEntries())) {
25+
foreach ($product->getMediaGalleryEntries() as $key => $entry) {
26+
$productData['media_gallery_entries'][$key] = $entry->getData();
2727
if ($entry->getExtensionAttributes() && $entry->getExtensionAttributes()->getVideoContent()) {
2828
$productData['media_gallery_entries'][$key]['video_content']
2929
= $entry->getExtensionAttributes()->getVideoContent()->getData();
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\Formatter;
8+
9+
use Magento\Catalog\Model\Product;
10+
use Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\FormatterInterface;
11+
12+
/**
13+
* Format the new from and to typo of legacy fields news_from_date and news_to_date
14+
*/
15+
class NewFromTo implements FormatterInterface
16+
{
17+
/**
18+
* Transfer data from legacy news_from_date and news_to_date to new names corespondent fields
19+
*
20+
* {@inheritdoc}
21+
*/
22+
public function format(Product $product, array $productData = [])
23+
{
24+
if ($product->getData('news_from_date')) {
25+
$productData['new_from_date'] = $product->getData('news_from_date');
26+
}
27+
28+
if ($product->getData('news_to_date')) {
29+
$productData['new_to_date'] = $product->getData('news_to_date');
30+
}
31+
32+
return $productData;
33+
}
34+
}

app/code/Magento/GraphQlCatalog/Model/Resolver/Products/DataProvider/Product/Formatter/Options.php renamed to app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Product/Formatter/Options.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
* See COPYING.txt for license details.
55
*/
66

7-
namespace Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider\Product\Formatter;
7+
namespace Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\Formatter;
88

99
use Magento\Catalog\Model\Product;
1010
use Magento\Catalog\Model\Product\Option;
11-
use Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider\Product\FormatterInterface;
11+
use Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\FormatterInterface;
1212

1313
/**
1414
* Format a product's option information to conform to GraphQL schema representation

app/code/Magento/GraphQlCatalog/Model/Resolver/Products/DataProvider/Product/Formatter/Price.php renamed to app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Product/Formatter/Price.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,14 @@
44
* See COPYING.txt for license details.
55
*/
66

7-
namespace Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider\Product\Formatter;
7+
namespace Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\Formatter;
88

99
use Magento\Catalog\Model\Product;
1010
use Magento\Framework\Pricing\PriceInfo\Factory as PriceInfoFactory;
1111
use Magento\Framework\Pricing\Amount\AmountInterface;
1212
use Magento\Store\Model\StoreManagerInterface;
1313
use Magento\Framework\Pricing\Adjustment\AdjustmentInterface;
14-
use Magento\GraphQlCatalog\Model\Type\Handler\PriceAdjustment;
15-
use Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider\Product\FormatterInterface;
14+
use Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\FormatterInterface;
1615
use Magento\Catalog\Pricing\Price\RegularPrice;
1716
use Magento\Catalog\Pricing\Price\FinalPrice;
1817

@@ -85,13 +84,13 @@ private function createAdjustmentsArray(array $adjustments, AmountInterface $amo
8584
foreach ($adjustments as $adjustmentCode => $adjustment) {
8685
if ($amount->hasAdjustment($adjustmentCode) && $amount->getAdjustmentAmount($adjustmentCode)) {
8786
$priceAdjustmentsArray[] = [
88-
'code' => $adjustmentCode,
87+
'code' => strtoupper($adjustmentCode),
8988
'amount' => [
9089
'value' => $amount->getAdjustmentAmount($adjustmentCode),
9190
'currency' => $store->getCurrentCurrencyCode(),
9291
],
9392
'description' => $adjustment->isIncludedInDisplayPrice() ?
94-
PriceAdjustment::ADJUSTMENT_INCLUDED : PriceAdjustment::ADJUSTMENT_EXCLUDED
93+
'INCLUDED' : 'EXCLUDED'
9594
];
9695
}
9796
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
* See COPYING.txt for license details.
55
*/
66

7-
namespace Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider\Product\Formatter;
7+
namespace Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\Formatter;
88

99
use Magento\Catalog\Model\Product;
1010
use Magento\Catalog\Model\Product\TierPrice;
11-
use Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider\Product\FormatterInterface;
11+
use Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\FormatterInterface;
1212

1313
/**
1414
* Format a product's tier price information to conform to GraphQL schema representation

app/code/Magento/GraphQlCatalog/Model/Resolver/Products/DataProvider/Product/FormatterComposite.php renamed to app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Product/FormatterComposite.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* See COPYING.txt for license details.
55
*/
66

7-
namespace Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider\Product;
7+
namespace Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product;
88

99
use Magento\Catalog\Model\Product;
1010

app/code/Magento/GraphQlCatalog/Model/Resolver/Products/DataProvider/Product/FormatterInterface.php renamed to app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Product/FormatterInterface.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* See COPYING.txt for license details.
55
*/
66

7-
namespace Magento\GraphQlCatalog\Model\Resolver\Products\DataProvider\Product;
7+
namespace Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product;
88

99
use Magento\Catalog\Model\Product;
1010

0 commit comments

Comments
 (0)