Skip to content
This repository has been archived by the owner on Dec 19, 2019. It is now read-only.

#31 CMS page/block coverage #105

Merged
merged 33 commits into from
Sep 11, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
a617b80
#31 Inited a new module and implement a basic support of CMS page ent…
Jun 30, 2018
94c904e
#31 Removed ID from array
Jun 30, 2018
9b26913
#31 Made it possible to return active pages only
Jun 30, 2018
e17c536
#32 Inited a new graph QL module that enables support of CMS blocks API
Jun 30, 2018
a7f0871
#32 Changed exception to throw
Jun 30, 2018
1f9c09e
#31 Refactored the code & committed composer.lock
Jun 30, 2018
0e2a2a6
#32 Refactored the code
Jun 30, 2018
85e6826
#31 Refactored module
Jun 30, 2018
c776df6
#32 Fixed code styling
Jul 2, 2018
f35af8b
#31 Refactored the code
Jul 2, 2018
5074178
#32 Added strict typing to bootstrap file
Jul 14, 2018
48fa7b5
#31 Fixed typo
Jul 14, 2018
5552cdc
#31 Removed the line
Jul 14, 2018
874f564
Merge remote-tracking branch 'origin/2.3-develop' into 31-cms-page-gr…
Jul 17, 2018
eb1ed7a
GraphQL-31: CMS page coverage
Jul 19, 2018
3bdd690
Merge branch '31-cms-page-graphql-support' into 32-cms-block-graphql-…
Jul 19, 2018
02ab4bf
GraphQL-32: CMS block coverage
Jul 19, 2018
dce6c11
Merge pull request #109 from magento/32-cms-block-graphql-support
Jul 19, 2018
7a9b5bd
#31 Made it possible to return rendered content of CMS entities
Jul 24, 2018
1f2e6fa
#31 Imported dependencies
Jul 24, 2018
dacd786
GraphQL-31: CMS page coverage
Aug 9, 2018
3eeb28f
Merge remote-tracking branch 'origin/2.3-develop' into 31-cms-page-gr…
Aug 9, 2018
23567bc
GraphQL-31: CMS page coverage
Aug 13, 2018
c5ecc0c
Merge remote-tracking branch 'origin/2.3-develop' into 31-cms-page-gr…
Aug 13, 2018
68fafd7
GraphQL-31: CMS page coverage
Aug 13, 2018
4016812
Merge remote-tracking branch 'origin/2.3-develop' into 31-cms-page-gr…
Aug 14, 2018
01c5a3d
GraphQL-31: CMS page coverage
Aug 14, 2018
0091c4e
Merge remote-tracking branch 'origin/2.3-develop' into 31-cms-page-gr…
Aug 15, 2018
122fc46
Merge remote-tracking branch 'origin/2.3-develop' into 31-cms-page-gr…
Aug 17, 2018
8ac4471
GraphQL-31: CMS page coverage
Aug 17, 2018
7ee4000
Merge remote-tracking branch 'origin/2.3-develop' into 31-cms-page-gr…
Aug 27, 2018
709a1f7
GraphQL-31: CMS page coverage
Aug 27, 2018
2966ac3
GraphQL-31: CMS page coverage
Aug 27, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 101 additions & 0 deletions app/code/Magento/CmsGraphQl/Model/Resolver/Blocks.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\CmsGraphQl\Model\Resolver;

use Magento\CmsGraphQl\Model\Resolver\DataProvider\Block as BlockDataProvider;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\GraphQl\Config\Element\Field;
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
use Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException;
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;

/**
* CMS blocks field resolver, used for GraphQL request processing
*/
class Blocks implements ResolverInterface
{
/**
* @var BlockDataProvider
*/
private $blockDataProvider;

/**
* @var ValueFactory
*/
private $valueFactory;

/**
* @param BlockDataProvider $blockDataProvider
* @param ValueFactory $valueFactory
*/
public function __construct(
BlockDataProvider $blockDataProvider,
ValueFactory $valueFactory
) {
$this->blockDataProvider = $blockDataProvider;
$this->valueFactory = $valueFactory;
}

/**
* @inheritdoc
*/
public function resolve(
Field $field,
$context,
ResolveInfo $info,
array $value = null,
array $args = null
) : Value {

$result = function () use ($args) {
$blockIdentifiers = $this->getBlockIdentifiers($args);
$blocksData = $this->getBlocksData($blockIdentifiers);

$resultData = [
'items' => $blocksData,
];
return $resultData;
};
return $this->valueFactory->create($result);
}

/**
* @param array $args
* @return string[]
* @throws GraphQlInputException
*/
private function getBlockIdentifiers(array $args): array
{
if (!isset($args['identifiers']) || !is_array($args['identifiers']) || count($args['identifiers']) === 0) {
throw new GraphQlInputException(__('"identifiers" of CMS blocks should be specified'));
}

return $args['identifiers'];
}

/**
* @param array $blockIdentifiers
* @return array
* @throws GraphQlNoSuchEntityException
*/
private function getBlocksData(array $blockIdentifiers): array
{
$blocksData = [];
try {
foreach ($blockIdentifiers as $blockIdentifier) {
$blocksData[$blockIdentifier] = $this->blockDataProvider->getData($blockIdentifier);
}
} catch (NoSuchEntityException $e) {
throw new GraphQlNoSuchEntityException(__($e->getMessage()), $e);
}
return $blocksData;
}
}
64 changes: 64 additions & 0 deletions app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\CmsGraphQl\Model\Resolver\DataProvider;

use Magento\Cms\Api\BlockRepositoryInterface;
use Magento\Cms\Api\Data\BlockInterface;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Widget\Model\Template\FilterEmulate;

/**
* Cms block data provider
*/
class Block
{
/**
* @var BlockRepositoryInterface
*/
private $blockRepository;

/**
* @var FilterEmulate
*/
private $widgetFilter;

/**
* @param BlockRepositoryInterface $blockRepository
* @param FilterEmulate $widgetFilter
*/
public function __construct(
BlockRepositoryInterface $blockRepository,
FilterEmulate $widgetFilter
) {
$this->blockRepository = $blockRepository;
$this->widgetFilter = $widgetFilter;
}

/**
* @param string $blockIdentifier
* @return array
* @throws NoSuchEntityException
*/
public function getData(string $blockIdentifier): array
{
$block = $this->blockRepository->getById($blockIdentifier);

if (false === $block->isActive()) {
throw new NoSuchEntityException();
}

$renderedContent = $this->widgetFilter->filter($block->getContent());

$blockData = [
BlockInterface::IDENTIFIER => $block->getIdentifier(),
BlockInterface::TITLE => $block->getTitle(),
BlockInterface::CONTENT => $renderedContent,
];
return $blockData;
}
}
69 changes: 69 additions & 0 deletions app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Page.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\CmsGraphQl\Model\Resolver\DataProvider;

use Magento\Cms\Api\Data\PageInterface;
use Magento\Cms\Api\PageRepositoryInterface;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Widget\Model\Template\FilterEmulate;

/**
* Cms page data provider
*/
class Page
{
/**
* @var FilterEmulate
*/
private $widgetFilter;

/**
* @var PageRepositoryInterface
*/
private $pageRepository;

/**
* @param PageRepositoryInterface $pageRepository
* @param FilterEmulate $widgetFilter
*/
public function __construct(
PageRepositoryInterface $pageRepository,
FilterEmulate $widgetFilter
) {
$this->pageRepository = $pageRepository;
$this->widgetFilter = $widgetFilter;
}

/**
* @param int $pageId
* @return array
* @throws NoSuchEntityException
*/
public function getData(int $pageId): array
{
$page = $this->pageRepository->getById($pageId);

if (false === $page->isActive()) {
throw new NoSuchEntityException();
}

$renderedContent = $this->widgetFilter->filter($page->getContent());

$pageData = [
'url_key' => $page->getIdentifier(),
PageInterface::TITLE => $page->getTitle(),
PageInterface::CONTENT => $renderedContent,
PageInterface::CONTENT_HEADING => $page->getContentHeading(),
PageInterface::PAGE_LAYOUT => $page->getPageLayout(),
PageInterface::META_TITLE => $page->getMetaTitle(),
PageInterface::META_DESCRIPTION => $page->getMetaDescription(),
PageInterface::META_KEYWORDS => $page->getMetaKeywords(),
];
return $pageData;
}
}
95 changes: 95 additions & 0 deletions app/code/Magento/CmsGraphQl/Model/Resolver/Page.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\CmsGraphQl\Model\Resolver;

use Magento\CmsGraphQl\Model\Resolver\DataProvider\Page as PageDataProvider;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\GraphQl\Config\Element\Field;
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
use Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException;
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;

/**
* CMS page field resolver, used for GraphQL request processing
*/
class Page implements ResolverInterface
{
/**
* @var PageDataProvider
*/
private $pageDataProvider;

/**
* @var ValueFactory
*/
private $valueFactory;

/**
* @param PageDataProvider $pageDataProvider
* @param ValueFactory $valueFactory
*/
public function __construct(
PageDataProvider $pageDataProvider,
ValueFactory $valueFactory
) {
$this->pageDataProvider = $pageDataProvider;
$this->valueFactory = $valueFactory;
}

/**
* @inheritdoc
*/
public function resolve(
Field $field,
$context,
ResolveInfo $info,
array $value = null,
array $args = null
) : Value {

$result = function () use ($args) {
$pageId = $this->getPageId($args);
$pageData = $this->getPageData($pageId);

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

/**
* @param array $args
* @return int
* @throws GraphQlInputException
*/
private function getPageId(array $args): int
{
if (!isset($args['id'])) {
throw new GraphQlInputException(__('"Page id should be specified'));
}

return (int)$args['id'];
}

/**
* @param int $pageId
* @return array
* @throws GraphQlNoSuchEntityException
*/
private function getPageData(int $pageId): array
{
try {
$pageData = $this->pageDataProvider->getData($pageId);
} catch (NoSuchEntityException $e) {
throw new GraphQlNoSuchEntityException(__($e->getMessage()), $e);
}
return $pageData;
}
}
4 changes: 4 additions & 0 deletions app/code/Magento/CmsGraphQl/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# CmsGraphQl

**CmsGraphQl** provides type information for the GraphQl module
to generate CMS fields for cms information endpoints.
23 changes: 23 additions & 0 deletions app/code/Magento/CmsGraphQl/composer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"name": "magento/module-cms-graph-ql",
"description": "N/A",
"type": "magento2-module",
"require": {
"php": "~7.1.3||~7.2.0",
"magento/framework": "*",
"magento/module-cms": "*",
"magento/module-widget": "*"
},
"license": [
"OSL-3.0",
"AFL-3.0"
],
"autoload": {
"files": [
"registration.php"
],
"psr-4": {
"Magento\\CmsGraphQl\\": ""
}
}
}
14 changes: 14 additions & 0 deletions app/code/Magento/CmsGraphQl/etc/module.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?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_CmsGraphQl">
<sequence>
<module name="Magento_GraphQl"/>
</sequence>
</module>
</config>
Loading