Pour tout problème contactez-nous par mail : support@froggit.fr | La FAQ :grey_question: | Rejoignez-nous sur le Chat :speech_balloon:

Skip to content
Snippets Groups Projects
CategoryWidgets.php 2.87 KiB
Newer Older
Nicolas's avatar
Nicolas committed
<?php
declare(strict_types=1);

namespace NicolasBejean\CategoryWidget\Model\Resolver;

use \NicolasBejean\CategoryWidget\Model\Resolver\DataProvider\CategoryWidget as CategoryWidgetDataProvider;

use \Magento\Framework\GraphQl\Config\Element\Field;
use \Magento\Framework\GraphQl\Query\ResolverInterface;
use \Magento\Framework\GraphQl\Schema\Type\ResolveInfo;

use \Magento\Framework\Exception\NoSuchEntityException;
use \Magento\Framework\GraphQl\Exception\GraphQlInputException;
use \Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException;

/**
 * Class CategoryWidgets
 *
 * @category PHP
 * @package  NicolasBejean\CategoryWidget\Model\Resolver
 * @author   Nicolas Béjean <nicolas@bejean.eu>
 * @license  https://github.com/nicolasbejean/category-widget/blob/master/licence.txt BSD Licence
 * @link     https://www.bejean.eu
 */
class CategoryWidgets implements ResolverInterface
{
    /**
     * @var CategoryWidgetDataProvider
     */
    private $dataProvider;

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

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

        $categoryWidgetIdentifiers = $this->getCategoryWidgetIdentifiers($args);
        $categoryWidgetsData = $this->getCategoryWidgetsData($categoryWidgetIdentifiers);

        $resultData = [
            'items' => $categoryWidgetsData,
        ];
        return $resultData;
    }

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

        return $args['identifiers'];
    }

    /**
     * Get category widgets data
     *
     * @param array $categoryWidgetIdentifiers
     * @return array
     * @throws GraphQlNoSuchEntityException
     */
    private function getCategoryWidgetsData(array $categoryWidgetIdentifiers): array
    {
        $categoryWidgetsData = [];
        foreach ($categoryWidgetIdentifiers as $categoryWidgetIdentifier) {
            try {
                $categoryWidgetsData[$categoryWidgetIdentifier] = $this->dataProvider->getData($categoryWidgetIdentifier);
            } catch (NoSuchEntityException $e) {
                $categoryWidgetsData[$categoryWidgetIdentifier] = new GraphQlNoSuchEntityException(__($e->getMessage()), $e);
            }
        }
        return $categoryWidgetsData;
    }
}