Skip to content

Commit

Permalink
Merge pull request #4185 from magento-engcom/graphql-develop-prs
Browse files Browse the repository at this point in the history
[Magento Community Engineering] Community Contributions - GraphQL
  • Loading branch information
naydav authored May 10, 2019
2 parents 2ec065d + 129641c commit 72aebb7
Show file tree
Hide file tree
Showing 43 changed files with 1,468 additions and 78 deletions.
47 changes: 8 additions & 39 deletions app/code/Magento/CatalogGraphQl/Model/Resolver/Product.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,13 @@

namespace Magento\CatalogGraphQl\Model\Resolver;

use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
use Magento\CatalogGraphQl\Model\Resolver\Product\ProductFieldsSelector;
use Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Deferred\Product as ProductDataProvider;
use Magento\Framework\GraphQl\Config\Element\Field;
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
use Magento\Framework\GraphQl\Query\FieldTranslator;
use Magento\Framework\GraphQl\Query\Resolver\Value;
use Magento\Framework\GraphQl\Query\Resolver\ValueFactory;
use Magento\Framework\GraphQl\Query\ResolverInterface;
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;

/**
* @inheritdoc
Expand All @@ -32,23 +31,23 @@ class Product implements ResolverInterface
private $valueFactory;

/**
* @var FieldTranslator
* @var ProductFieldsSelector
*/
private $fieldTranslator;
private $productFieldsSelector;

/**
* @param ProductDataProvider $productDataProvider
* @param ValueFactory $valueFactory
* @param FieldTranslator $fieldTranslator
* @param ProductFieldsSelector $productFieldsSelector
*/
public function __construct(
ProductDataProvider $productDataProvider,
ValueFactory $valueFactory,
FieldTranslator $fieldTranslator
ProductFieldsSelector $productFieldsSelector
) {
$this->productDataProvider = $productDataProvider;
$this->valueFactory = $valueFactory;
$this->fieldTranslator = $fieldTranslator;
$this->productFieldsSelector = $productFieldsSelector;
}

/**
Expand All @@ -60,7 +59,7 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
throw new GraphQlInputException(__('No child sku found for product link.'));
}
$this->productDataProvider->addProductSku($value['sku']);
$fields = $this->getProductFields($info);
$fields = $this->productFieldsSelector->getProductFieldsFromInfo($info);
$this->productDataProvider->addEavAttributes($fields);

$result = function () use ($value) {
Expand All @@ -86,34 +85,4 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value

return $this->valueFactory->create($result);
}

/**
* Return field names for all requested product fields.
*
* @param ResolveInfo $info
* @return string[]
*/
private function getProductFields(ResolveInfo $info) : array
{
$fieldNames = [];
foreach ($info->fieldNodes as $node) {
if ($node->name->value !== 'product') {
continue;
}
foreach ($node->selectionSet->selections as $selectionNode) {
if ($selectionNode->kind === 'InlineFragment') {
foreach ($selectionNode->selectionSet->selections as $inlineSelection) {
if ($inlineSelection->kind === 'InlineFragment') {
continue;
}
$fieldNames[] = $this->fieldTranslator->translate($inlineSelection->name->value);
}
continue;
}
$fieldNames[] = $this->fieldTranslator->translate($selectionNode->name->value);
}
}

return $fieldNames;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\CatalogGraphQl\Model\Resolver\Product;

use Magento\Framework\GraphQl\Query\FieldTranslator;
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;

/**
* Select Product Fields From Resolve Info
*/
class ProductFieldsSelector
{
/**
* @var FieldTranslator
*/
private $fieldTranslator;

/**
* @param FieldTranslator $fieldTranslator
*/
public function __construct(FieldTranslator $fieldTranslator)
{
$this->fieldTranslator = $fieldTranslator;
}

/**
* Return field names for all requested product fields.
*
* @param ResolveInfo $info
* @param string $productNodeName
* @return string[]
*/
public function getProductFieldsFromInfo(ResolveInfo $info, string $productNodeName = 'product') : array
{
$fieldNames = [];
foreach ($info->fieldNodes as $node) {
if ($node->name->value !== $productNodeName) {
continue;
}
foreach ($node->selectionSet->selections as $selectionNode) {
if ($selectionNode->kind === 'InlineFragment') {
foreach ($selectionNode->selectionSet->selections as $inlineSelection) {
if ($inlineSelection->kind === 'InlineFragment') {
continue;
}
$fieldNames[] = $this->fieldTranslator->translate($inlineSelection->name->value);
}
continue;
}
$fieldNames[] = $this->fieldTranslator->translate($selectionNode->name->value);
}
}

return $fieldNames;
}
}
15 changes: 15 additions & 0 deletions app/code/Magento/CatalogGraphQl/etc/graphql/di.xml
Original file line number Diff line number Diff line change
Expand Up @@ -80,4 +80,19 @@
</virtualType>
<preference for="Magento\Framework\Search\Adapter\Mysql\Query\Builder\Match"
type="Magento\CatalogGraphQl\Model\Search\Adapter\Mysql\Query\Builder\Match" />
<type name="Magento\StoreGraphQl\Model\Resolver\Store\StoreConfigDataProvider">
<arguments>
<argument name="extendedConfigData" xsi:type="array">
<item name="product_url_suffix" xsi:type="string">catalog/seo/product_url_suffix</item>
<item name="category_url_suffix" xsi:type="string">catalog/seo/category_url_suffix</item>
<item name="title_separator" xsi:type="string">catalog/seo/title_separator</item>
<item name="list_mode" xsi:type="string">catalog/frontend/list_mode</item>
<item name="grid_per_page_values" xsi:type="string">catalog/frontend/grid_per_page_values</item>
<item name="list_per_page_values" xsi:type="string">catalog/frontend/list_per_page_values</item>
<item name="grid_per_page" xsi:type="string">catalog/frontend/grid_per_page</item>
<item name="list_per_page" xsi:type="string">catalog/frontend/list_per_page</item>
<item name="catalog_default_sort_by" xsi:type="string">catalog/frontend/default_sort_by</item>
</argument>
</arguments>
</type>
</config>
12 changes: 12 additions & 0 deletions app/code/Magento/CatalogGraphQl/etc/schema.graphqls
Original file line number Diff line number Diff line change
Expand Up @@ -401,3 +401,15 @@ type SortFields @doc(description: "SortFields contains a default value for sort
default: String @doc(description: "Default value of sort fields")
options: [SortField] @doc(description: "Available sort fields")
}

type StoreConfig @doc(description: "The type contains information about a store config") {
product_url_suffix : String @doc(description: "Product URL Suffix")
category_url_suffix : String @doc(description: "Category URL Suffix")
title_separator : String @doc(description: "Page Title Separator")
list_mode : String @doc(description: "List Mode")
grid_per_page_values : String @doc(description: "Products per Page on Grid Allowed Values")
list_per_page_values : String @doc(description: "Products per Page on List Allowed Values")
grid_per_page : Int @doc(description: "Products per Page on Grid Default Value")
list_per_page : Int @doc(description: "Products per Page on List Default Value")
catalog_default_sort_by : String @doc(description: "Default Sort By")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\CheckoutAgreementsGraphQl\Model\Resolver;

use Magento\CheckoutAgreements\Model\AgreementModeOptions;
use Magento\CheckoutAgreements\Model\ResourceModel\Agreement\Collection;
use Magento\Framework\GraphQl\Config\Element\Field;
use Magento\Framework\GraphQl\Query\ResolverInterface;
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
use Magento\CheckoutAgreements\Api\Data\AgreementInterface;
use Magento\CheckoutAgreements\Model\ResourceModel\Agreement\CollectionFactory;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Store\Model\ScopeInterface;
use Magento\Store\Model\StoreManagerInterface;

/**
* Checkout Agreements resolver, used for GraphQL request processing
*/
class CheckoutAgreements implements ResolverInterface
{
/**
* @var CollectionFactory
*/
private $agreementCollectionFactory;

/**
* @var StoreManagerInterface
*/
private $storeManager;

/**
* @var ScopeConfigInterface
*/
private $scopeConfig;

/**
* @param CollectionFactory $agreementCollectionFactory
* @param StoreManagerInterface $storeManager
* @param ScopeConfigInterface $scopeConfig
*/
public function __construct(
CollectionFactory $agreementCollectionFactory,
StoreManagerInterface $storeManager,
ScopeConfigInterface $scopeConfig
) {
$this->agreementCollectionFactory = $agreementCollectionFactory;
$this->storeManager = $storeManager;
$this->scopeConfig = $scopeConfig;
}

/**
* @inheritdoc
*/
public function resolve(
Field $field,
$context,
ResolveInfo $info,
array $value = null,
array $args = null
) {
if (!$this->scopeConfig->isSetFlag('checkout/options/enable_agreements', ScopeInterface::SCOPE_STORE)) {
return [];
}

/** @var Collection $agreementsCollection */
$agreementsCollection = $this->agreementCollectionFactory->create();
$agreementsCollection->addStoreFilter($this->storeManager->getStore()->getId());
$agreementsCollection->addFieldToFilter(AgreementInterface::IS_ACTIVE, 1);

$checkoutAgreementData = [];
/** @var AgreementInterface $checkoutAgreement */
foreach ($agreementsCollection->getItems() as $checkoutAgreement) {
$checkoutAgreementData[] = [
AgreementInterface::AGREEMENT_ID => $checkoutAgreement->getAgreementId(),
AgreementInterface::CONTENT => $checkoutAgreement->getContent(),
AgreementInterface::NAME => $checkoutAgreement->getName(),
AgreementInterface::CONTENT_HEIGHT => $checkoutAgreement->getContentHeight(),
AgreementInterface::CHECKBOX_TEXT => $checkoutAgreement->getCheckboxText(),
AgreementInterface::IS_HTML => $checkoutAgreement->getIsHtml(),
AgreementInterface::MODE =>
AgreementModeOptions::MODE_AUTO === (int)$checkoutAgreement->getMode() ? 'AUTO' : 'MANUAL',
];
}
return $checkoutAgreementData;
}
}
4 changes: 4 additions & 0 deletions app/code/Magento/CheckoutAgreementsGraphQl/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# CheckoutAgreementsGraphQl

**CheckoutAgreementsGraphQl** provides type information for the GraphQl module
to generate Checkout Agreements fields for Checkout Agreements information endpoints.
26 changes: 26 additions & 0 deletions app/code/Magento/CheckoutAgreementsGraphQl/composer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"name": "magento/module-checkout-agreements-graph-ql",
"description": "N/A",
"type": "magento2-module",
"require": {
"php": "~7.1.3||~7.2.0",
"magento/framework": "*",
"magento/module-store": "*",
"magento/module-checkout-agreements": "*"
},
"suggest": {
"magento/module-graph-ql": "*"
},
"license": [
"OSL-3.0",
"AFL-3.0"
],
"autoload": {
"files": [
"registration.php"
],
"psr-4": {
"Magento\\CheckoutAgreementsGraphQl\\": ""
}
}
}
10 changes: 10 additions & 0 deletions app/code/Magento/CheckoutAgreementsGraphQl/etc/module.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0"?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Magento_CheckoutAgreementsGraphQl" />
</config>
21 changes: 21 additions & 0 deletions app/code/Magento/CheckoutAgreementsGraphQl/etc/schema.graphqls
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Copyright © Magento, Inc. All rights reserved.
# See COPYING.txt for license details.

type Query {
checkoutAgreements: [CheckoutAgreement] @resolver(class: "Magento\\CheckoutAgreementsGraphQl\\Model\\Resolver\\CheckoutAgreements") @doc(description: "The Checkout Agreements information")
}

type CheckoutAgreement @doc(description: "Defines all Checkout Agreement information") {
agreement_id: Int! @doc(description: "Checkout Agreement identifier")
name: String! @doc(description: "Checkout Agreement name")
content: String! @doc(description: "Checkout Agreement content")
content_height: String @doc(description: "Checkout Agreement content height")
checkbox_text: String! @doc(description: "Checkout Agreement checkbox text")
is_html: Boolean! @doc(description: "Is Checkout Agreement content in HTML format")
mode: CheckoutAgreementMode!
}

enum CheckoutAgreementMode {
AUTO
MANUAL
}
10 changes: 10 additions & 0 deletions app/code/Magento/CheckoutAgreementsGraphQl/registration.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

use Magento\Framework\Component\ComponentRegistrar;

ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Magento_CheckoutAgreementsGraphQl', __DIR__);
Loading

0 comments on commit 72aebb7

Please sign in to comment.