EmicoEcommerce/Magento2Tweakwise

View on GitHub
Model/Autocomplete/DataProviderHelper.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php

namespace Tweakwise\Magento2Tweakwise\Model\Autocomplete;

use Tweakwise\Magento2Tweakwise\Model\Autocomplete\DataProvider\ProductItemFactory;
use Tweakwise\Magento2Tweakwise\Model\Client\Response\AutocompleteProductResponseInterface;
use Tweakwise\Magento2Tweakwise\Model\Config;
use Magento\Catalog\Api\CategoryRepositoryInterface;
use Magento\Catalog\Model\Category;
use Magento\Catalog\Model\Layer\Category\CollectionFilter;
use Magento\Catalog\Model\Product\Visibility;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory as ProductCollectionFactory;
use Magento\Framework\App\Request\Http as HttpRequest;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Search\Model\Autocomplete\ItemInterface;
use Magento\Search\Model\Query;
use Magento\Search\Model\QueryFactory;
use Magento\Store\Model\StoreManagerInterface;

class DataProviderHelper
{
    /**
     * @var Config
     */
    protected $config;

    /**
     * @var QueryFactory
     */
    protected $queryFactory;

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

    /**
     * @var CategoryRepositoryInterface
     */
    protected $categoryRepository;

    /**
     * @var HttpRequest
     */
    protected $request;

    /**
     * @var ProductCollectionFactory
     */
    protected $productCollectionFactory;

    /**
     * @var CollectionFilter
     */
    protected $collectionFilter;

    /**
     * @var ProductItemFactory
     */
    protected $productItemFactory;

    /**
     * AutocompleteDataProvider constructor
     * @param Config $config
     * @param QueryFactory $queryFactory
     * @param StoreManagerInterface $storeManager
     * @param CategoryRepositoryInterface $categoryRepository
     * @param HttpRequest $request
     * @param ProductCollectionFactory $productCollectionFactory
     * @param CollectionFilter $collectionFilter
     * @param ProductItemFactory $productItemFactory
     */
    public function __construct(
        Config $config,
        QueryFactory $queryFactory,
        StoreManagerInterface $storeManager,
        CategoryRepositoryInterface $categoryRepository,
        HttpRequest $request,
        ProductCollectionFactory $productCollectionFactory,
        CollectionFilter $collectionFilter,
        ProductItemFactory $productItemFactory
    ) {
        $this->config = $config;
        $this->queryFactory = $queryFactory;
        $this->storeManager = $storeManager;
        $this->categoryRepository = $categoryRepository;
        $this->request = $request;
        $this->productCollectionFactory = $productCollectionFactory;
        $this->collectionFilter = $collectionFilter;
        $this->productItemFactory = $productItemFactory;
    }

    /**
     * @return Query|mixed|string|null
     */
    public function getQuery()
    {
        /** @var Query $query */
        $query = $this->queryFactory->get();

        return $query->getQueryText();
    }

    /**
     * @return Category
     * @noinspection PhpIncompatibleReturnTypeInspection
     */
    public function getCategory()
    {
        $categoryId = (int)$this->request->getParam('cid');
        if ($categoryId && $this->config->isAutocompleteStayInCategory()) {
            try {
                return $this->categoryRepository->get($categoryId);
            } catch (NoSuchEntityException $e) {
            }
        }

        $store = $this->storeManager->getStore();
        $categoryId = $store->getRootCategoryId();
        return $this->categoryRepository->get($categoryId);
    }

    /**
     * @param AutocompleteProductResponseInterface $response
     * @return ItemInterface[]
     * @throws LocalizedException
     */
    public function getProductItems(AutocompleteProductResponseInterface $response)
    {
        $productCollection = $this->productCollectionFactory->create();
        $productCollection->setStore($this->storeManager->getStore());
        $productCollection->addAttributeToFilter('entity_id', ['in' => $response->getProductIds()]);
        $productCollection->addFieldToFilter('visibility', ['in' => [
            Visibility::VISIBILITY_BOTH,
            Visibility::VISIBILITY_IN_SEARCH
        ]]);
        $this->collectionFilter->filter($productCollection, $this->getCategory());

        $result = [];
        foreach ($response->getProductData() as $item) {
            $product = $productCollection->getItemById($item['id']);

            if (!$product) {
                continue;
            }

            $product->setData('tweakwise_price', $item['tweakwise_price']);
            $product->setData('tweakwise_final_price', $item['tweakwise_final_price']);

            $result[] = $this->productItemFactory->create(['product' => $product]);
        }

        return $result;
    }
}