diff --git a/app/code/Magento/CmsGraphQl/Model/Resolver/Cms/CmsBlockDataProvider.php b/app/code/Magento/CmsGraphQl/Model/Resolver/Cms/CmsBlockDataProvider.php new file mode 100644 index 00000000000..35c83662773 --- /dev/null +++ b/app/code/Magento/CmsGraphQl/Model/Resolver/Cms/CmsBlockDataProvider.php @@ -0,0 +1,69 @@ +cmsBlockRepository = $cmsBlockRepository; + } + + /** + * Get CMS block data by identifier + * + * @param string $cmsBlockIdentifier + * @return array|GraphQlInputException + * @throws NoSuchEntityException + */ + public function getCmsBlockById(string $cmsBlockIdentifier) + { + $cmsBlockModel = $this->cmsBlockRepository->getById($cmsBlockIdentifier); + + if (!$cmsBlockModel->isActive()) { + throw new NoSuchEntityException(); + } + + return $this->processCmsBlock($cmsBlockModel); + } + + /** + * Transform single CMS block data from object to in array format + * + * @param CmsBlockInterface $cmsBlockModel + * @return array + */ + private function processCmsBlock(CmsBlockInterface $cmsBlockModel) : array + { + $cmsBlockData = [ + 'identifier' => $cmsBlockModel->getIdentifier(), + 'title' => $cmsBlockModel->getTitle(), + 'content' => $cmsBlockModel->getContent(), + ]; + + return $cmsBlockData; + } + +} diff --git a/app/code/Magento/CmsGraphQl/Model/Resolver/CmsBlocks.php b/app/code/Magento/CmsGraphQl/Model/Resolver/CmsBlocks.php new file mode 100644 index 00000000000..34bf0bdde19 --- /dev/null +++ b/app/code/Magento/CmsGraphQl/Model/Resolver/CmsBlocks.php @@ -0,0 +1,101 @@ +valueFactory = $valueFactory; + $this->cmsBlockDataProvider = $cmsBlockDataProvider; + } + + /** + * {@inheritdoc} + */ + public function resolve( + Field $field, + $context, + ResolveInfo $info, + array $value = null, + array $args = null + ) : Value { + + $cmsBlockListData = []; + $cmsBlockIdentifiers = $this->getCmsBlockIdentifiers($args); + + foreach ($cmsBlockIdentifiers as $cmsBlockIdentifier) { + try { + $cmsBlockListData[$cmsBlockIdentifier] = $this->cmsBlockDataProvider->getCmsBlockById( + $cmsBlockIdentifier + ); + } catch (NoSuchEntityException $ex) { + $cmsBlockListData[$cmsBlockIdentifier] = new GraphQlInputException( + __( + 'CMS block with "%1" ID does not found', + $cmsBlockIdentifier + ) + ); + } + } + + $cmsBlocksData = [ + 'items' => $cmsBlockListData + ]; + + $result = function () use ($cmsBlocksData) { + return !empty($cmsBlocksData) ? $cmsBlocksData : []; + }; + + return $this->valueFactory->create($result); + } + + /** + * Retrieve CMS block identifiers to retrieve + * + * @param array $args + * @return string[] + * @throws GraphQlInputException + */ + private function getCmsBlockIdentifiers($args) + { + if (!isset($args['identifiers']) && is_array($args['identifiers']) && count($args['identifiers']) > 0) { + throw new GraphQlInputException(__('"identifiers" of CMS blocks should be specified')); + } + + return (array) $args['identifiers']; + } +} diff --git a/app/code/Magento/CmsGraphQl/README.md b/app/code/Magento/CmsGraphQl/README.md new file mode 100644 index 00000000000..970444837f1 --- /dev/null +++ b/app/code/Magento/CmsGraphQl/README.md @@ -0,0 +1,4 @@ +# CmsGraphQl + +**CmsGraphQl** provides type information for the GraphQl module +to generate CMS fields for cms information endpoints. diff --git a/app/code/Magento/CmsGraphQl/composer.json b/app/code/Magento/CmsGraphQl/composer.json new file mode 100644 index 00000000000..5e62f7ea3c5 --- /dev/null +++ b/app/code/Magento/CmsGraphQl/composer.json @@ -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-store": "*", + "magento/module-cms": "*" + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CmsGraphQl\\": "" + } + } +} diff --git a/app/code/Magento/CmsGraphQl/etc/module.xml b/app/code/Magento/CmsGraphQl/etc/module.xml new file mode 100644 index 00000000000..00af787c418 --- /dev/null +++ b/app/code/Magento/CmsGraphQl/etc/module.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + diff --git a/app/code/Magento/CmsGraphQl/etc/schema.graphqls b/app/code/Magento/CmsGraphQl/etc/schema.graphqls new file mode 100644 index 00000000000..ac4915d5599 --- /dev/null +++ b/app/code/Magento/CmsGraphQl/etc/schema.graphqls @@ -0,0 +1,18 @@ +# Copyright © Magento, Inc. All rights reserved. +# See COPYING.txt for license details. + +type Query { + cmsBlocks ( + identifiers: [String] @doc(description: "Identifiers of the CMS blocks") + ): CmsBlocks @resolver(class: "Magento\\CmsGraphQl\\Model\\Resolver\\CmsBlocks") @doc(description: "The CMS block query returns information about CMS blocks") +} + +type CmsBlocks @doc(description: "CMS blocks information") { + items: [CmsBlock] @doc(description: "An array of CMS blocks") +} + +type CmsBlock @doc(description: "CMS block defines all CMS block information") { + identifier: String @doc(description: "CMS block identifier") + title: String @doc(description: "CMS block title") + content: String @doc(description: "CMS block content") +} \ No newline at end of file diff --git a/app/code/Magento/CmsGraphQl/registration.php b/app/code/Magento/CmsGraphQl/registration.php new file mode 100644 index 00000000000..4ad6166b6a1 --- /dev/null +++ b/app/code/Magento/CmsGraphQl/registration.php @@ -0,0 +1,9 @@ +