Current File : /var/www/prestashop/modules/ps_eventbus/src/Provider/ProductDataProvider.php
<?php

namespace PrestaShop\Module\PsEventbus\Provider;

use PrestaShop\Module\PsEventbus\Config\Config;
use PrestaShop\Module\PsEventbus\Decorator\ProductDecorator;
use PrestaShop\Module\PsEventbus\Repository\LanguageRepository;
use PrestaShop\Module\PsEventbus\Repository\ProductRepository;

class ProductDataProvider implements PaginatedApiDataProviderInterface
{
    /**
     * @var ProductRepository
     */
    private $productRepository;
    /**
     * @var ProductDecorator
     */
    private $productDecorator;
    /**
     * @var ProductSupplierDataProvider
     */
    private $productSupplierDataProvider;
    /**
     * @var LanguageRepository
     */
    private $languageRepository;

    public function __construct(
        ProductRepository $productRepository,
        ProductDecorator $productDecorator,
        ProductSupplierDataProvider $productSupplierDataProvider,
        LanguageRepository $languageRepository
    ) {
        $this->productRepository = $productRepository;
        $this->productDecorator = $productDecorator;
        $this->productSupplierDataProvider = $productSupplierDataProvider;
        $this->languageRepository = $languageRepository;
    }

    /**
     * @param int $offset
     * @param int $limit
     * @param string $langIso
     *
     * @return array<mixed>
     *
     * @@throws \PrestaShopDatabaseException
     */
    public function getFormattedData($offset, $limit, $langIso)
    {
        $langId = $this->languageRepository->getLanguageIdByIsoCode($langIso);

        $products = $this->productRepository->getProducts($offset, $limit, $langId);

        if (!$products) {
            return [];
        }

        $this->productDecorator->decorateProducts($products, $langIso, $langId);

        $bundles = $this->productDecorator->getBundles($products);

        $productSuppliers = $this->productSupplierDataProvider->getFormattedData($offset, $limit, $langIso);

        $products = array_map(function ($product) {
            return [
                'id' => $product['unique_product_id'],
                'collection' => Config::COLLECTION_PRODUCTS,
                'properties' => $product,
            ];
        }, $products);

        return array_merge($products, $bundles, $productSuppliers);
    }

    /**
     * @param int $offset
     * @param string $langIso
     *
     * @return int
     *
     * @@throws \PrestaShopDatabaseException
     */
    public function getRemainingObjectsCount($offset, $langIso)
    {
        $langId = $this->languageRepository->getLanguageIdByIsoCode($langIso);

        return (int) $this->productRepository->getRemainingProductsCount($offset, $langId);
    }

    /**
     * @param int $limit
     * @param string $langIso
     * @param array<mixed> $objectIds
     *
     * @return array<mixed>
     *
     * @@throws \PrestaShopDatabaseException
     */
    public function getFormattedDataIncremental($limit, $langIso, $objectIds)
    {
        $langId = $this->languageRepository->getLanguageIdByIsoCode($langIso);

        $products = $this->productRepository->getProductsIncremental($limit, $langId, $objectIds);

        if (!empty($products)) {
            $this->productDecorator->decorateProducts($products, $langIso, $langId);
        } else {
            return [];
        }

        $bundles = $this->productDecorator->getBundles($products);

        $productSuppliers = $this->productSupplierDataProvider->getFormattedDataIncremental($limit, $langIso, $objectIds);

        $products = array_map(function ($product) {
            return [
                'id' => $product['unique_product_id'],
                'collection' => Config::COLLECTION_PRODUCTS,
                'properties' => $product,
            ];
        }, $products);

        return array_merge($products, $bundles, $productSuppliers);
    }

    /**
     * @param int $offset
     * @param int $limit
     * @param string $langIso
     *
     * @return array<mixed>
     *
     * @@throws \PrestaShopDatabaseException
     */
    public function getQueryForDebug($offset, $limit, $langIso)
    {
        $langId = $this->languageRepository->getLanguageIdByIsoCode($langIso);

        return $this->productRepository->getQueryForDebug($offset, $limit, $langId);
    }
}