Current File : //var/www/prestashop/modules/ps_metrics/src/Presenter/ShopDataPresenter.php
<?php

/**
 * Copyright since 2007 PrestaShop SA and Contributors
 * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License version 3.0
 * that is bundled with this package in the file LICENSE.md.
 * It is also available through the world-wide-web at this URL:
 * https://opensource.org/licenses/AFL-3.0
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@prestashop.com so we can send you a copy immediately.
 *
 * @author    PrestaShop SA and Contributors <contact@prestashop.com>
 * @copyright Since 2007 PrestaShop SA and Contributors
 * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0
 */
namespace PrestaShop\Module\Ps_metrics\Presenter;

use PrestaShop\Module\Ps_metrics\Helper\MultishopHelper;
use PrestaShop\Module\Ps_metrics\Helper\PrestaShopHelper;
use PrestaShop\Module\Ps_metrics\Helper\ShopHelper;
use PrestaShop\Module\Ps_metrics\Helper\ToolsHelper;
use PrestaShop\Module\Ps_metrics\Module\GAInstaller;
use PrestaShop\Module\Ps_metrics\Provider\AnalyticsAccountsListProvider;
use PrestaShop\Module\Ps_metrics\Repository\ConfigurationRepository;
use ps_metrics_module_v4_0_6\PrestaShop\PsAccountsInstaller\Installer\Exception\InstallerException;
use ps_metrics_module_v4_0_6\PrestaShop\PsAccountsInstaller\Installer\Facade\PsAccounts;
class ShopDataPresenter
{
    /**
     * @var \Ps_metrics
     */
    private $module;
    /**
     * @var PrestaShopHelper
     */
    private $prestashopHelper;
    /**
     * @var ConfigurationRepository
     */
    private $configurationRepository;
    /**
     * @var ShopHelper
     */
    private $shopHelper;
    /**
     * @var AnalyticsAccountsListProvider
     */
    private $analyticsAccountsListProvider;
    /**
     * @var GAInstaller
     */
    private $gaInstaller;
    /**
     * @var PsAccounts
     */
    private $psAccountsFacade;
    /**
     * @var ToolsHelper
     */
    private $toolsHelper;
    /**
     * @var MultishopHelper
     */
    private $multishopHelper;
    /**
     * Presenter constructor.
     *
     * @param \Ps_metrics $module
     * @param PrestaShopHelper $prestashopHelper
     * @param ConfigurationRepository $configurationRepository
     * @param ShopHelper $shopHelper
     * @param AnalyticsAccountsListProvider $analyticsAccountsListProvider
     * @param GAInstaller $gaInstaller
     * @param PsAccounts $psAccountsFacade
     * @param ToolsHelper $toolsHelper
     * @param MultishopHelper $multishopHelper
     *
     * @return void
     */
    public function __construct(\Ps_metrics $module, PrestaShopHelper $prestashopHelper, ConfigurationRepository $configurationRepository, ShopHelper $shopHelper, AnalyticsAccountsListProvider $analyticsAccountsListProvider, GAInstaller $gaInstaller, PsAccounts $psAccountsFacade, ToolsHelper $toolsHelper, MultishopHelper $multishopHelper)
    {
        $this->module = $module;
        $this->prestashopHelper = $prestashopHelper;
        $this->configurationRepository = $configurationRepository;
        $this->shopHelper = $shopHelper;
        $this->analyticsAccountsListProvider = $analyticsAccountsListProvider;
        $this->gaInstaller = $gaInstaller;
        $this->psAccountsFacade = $psAccountsFacade;
        $this->toolsHelper = $toolsHelper;
        $this->multishopHelper = $multishopHelper;
    }
    /**
     * Get shop datas for replacing the shop data in the module settings page.
     *
     * @return array
     */
    public function getShopData()
    {
        $currentShop = $this->shopHelper->getShopUrl($this->prestashopHelper->getShopId());
        try {
            $psAccountsService = $this->psAccountsFacade->getPsAccountsService();
            $psAccountsJWT = $psAccountsService->getOrRefreshToken();
            $psAccountIsOnboarded = $psAccountsService->isAccountLinked();
            $psAccountsToken = $psAccountsService->getRefreshToken();
            $shopUuidV4 = $psAccountsService->getShopUuidV4();
            $email = $psAccountsService->getEmail();
            $emailIsValidated = $psAccountsService->isEmailValidated();
            $accountsUrl = $psAccountsService->getAdminAjaxUrl();
        } catch (InstallerException $e) {
            $psAccountsToken = '';
            $psAccountsJWT = '';
            $psAccountIsOnboarded = \false;
            $shopUuidV4 = '';
            $email = '';
            $emailIsValidated = \false;
            $accountsUrl = '';
        }
        $psEventBusModuleVersion = '0.0.0';
        if (\Module::isInstalled('ps_eventbus')) {
            /** @var \Module $psEventBusModule */
            $psEventBusModule = \Module::getInstanceByName('ps_eventbus');
            $psEventBusModuleVersion = $psEventBusModule->version;
        }
        $psAccountsModuleVersion = '0.0.0';
        if (\Module::isInstalled('ps_accounts')) {
            /** @var \Module $psAccountsModule */
            $psAccountsModule = \Module::getInstanceByName('ps_accounts');
            $psAccountsModuleVersion = $psAccountsModule->version;
        }
        $link = $this->prestashopHelper->getLink();
        $googleLinkedUrl = $link->getAdminLink('MetricsOauthController', \true, ['route' => 'metrics_oauth', 'from' => 'PS']);
        $response = ['modules' => ['psMetrics' => ['name' => $this->module->name, 'displayName' => $this->module->displayName, 'version' => $this->module->version, 'emailSupport' => $this->module->emailSupport, 'termsOfServiceUrl' => $this->module->termsOfServiceUrl], 'psEventBus' => ['version' => $psEventBusModuleVersion], 'psAccounts' => ['version' => $psAccountsModuleVersion, 'userInfos' => ['email' => $email, 'emailIsValidated' => $emailIsValidated, 'isSuperAdmin' => (new PrestaShopHelper())->getEmployee()->isSuperAdmin()], 'apiUrl' => $accountsUrl, 'token' => $psAccountsToken, 'jwt' => $psAccountsJWT, 'isOnboarded' => $psAccountIsOnboarded], 'psAnalytics' => ['version' => $this->gaInstaller->getModuleVersion(), 'isInstalled' => $this->gaInstaller->isInstalled(), 'isEnabled' => $this->gaInstaller->isEnabled(), 'installLink' => $this->gaInstaller->getInstallLink(), 'enableLink' => $this->gaInstaller->getEnableLink(), 'configLink' => $this->gaInstaller->getConfigLink()]], 'links' => ['api' => ['graphql' => $link->getAdminLink('MetricsGraphqlController', \true, ['route' => 'metrics_graphql']), 'accountsRetrieveToken' => $accountsUrl], 'controllers' => ['metrics' => $link->getAdminLink('MetricsController', \true, ['route' => 'metrics_page']), 'dashboard' => $link->getAdminLink('AdminDashboard', \true, []), 'upgrade' => $link->getAdminLink('AdminModules', \true, []), 'settings' => $link->getAdminLink('MetricsController', \true, ['route' => 'metrics_page']) . '#/settings']], 'faq' => ['data' => [], 'docsUrl' => $this->getReadme()], 'shopInfos' => ['uuid' => $shopUuidV4, 'shopVersion' => _PS_VERSION_, 'domain' => $currentShop['domain'], 'name' => \Configuration::get('PS_SHOP_NAME'), 'isMultiShop' => $this->multishopHelper->isMultishopActive(), 'shopList' => $this->multishopHelper->getAllShopsOrGroupShops(), 'selectedShopData' => $this->multishopHelper->getSelectedShop(), 'shopContext' => $this->multishopHelper->getShopContextLitteral(), 'adminToken' => ''], 'i18n' => ['isoCode' => $this->prestashopHelper->getLanguageIsoCode(), 'currencyIsoCode' => $this->prestashopHelper->getCurrencyIsoCode()], 'serverInfos' => ['phpVersion' => \phpversion()], 'employeeInfos' => ['email' => $this->prestashopHelper->getEmployeeEmail(), 'ip' => isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ''], 'pagesContext' => ['isLegacyStatsPage' => $this->checkIfPageIsLegacyStats(), 'app' => ''], 'googleAccount' => ['isLinked' => (bool) $this->configurationRepository->getGoogleLinkedValue(), 'linkedUrl' => $googleLinkedUrl, 'list' => $this->analyticsAccountsListProvider->getAccountsList(), 'selected' => $this->analyticsAccountsListProvider->getSelectedAccount(), 'username' => $this->analyticsAccountsListProvider->getUserName(), 'error' => $this->toolsHelper->getValue('google_message_error')]];
        return $response;
    }
    /**
     * Check if page is ols stats page
     *
     * @return bool
     */
    private function checkIfPageIsLegacyStats()
    {
        return $this->prestashopHelper->getControllerName() === 'AdminStats';
    }
    /**
     * Get the documentation url depending on the current language
     *
     * @return string path of the doc
     */
    private function getReadme()
    {
        $isoCode = $this->prestashopHelper->getLanguageIsoCode();
        $baseUrl = 'https://storage.googleapis.com/psessentials-documentation/' . $this->module->name;
        if (!$this->checkFileExist($baseUrl . '/user_guide_' . $isoCode . '.pdf')) {
            $isoCode = 'en';
        }
        return $baseUrl . '/user_guide_' . $isoCode . '.pdf';
    }
    /**
     * Use cUrl to get HTTP headers and detect any HTTP 404
     *
     * @param string $docUrl
     *
     * @return bool
     */
    private function checkFileExist($docUrl)
    {
        $ch = \curl_init($docUrl);
        if (\false === $ch) {
            return \false;
        }
        \curl_setopt($ch, \CURLOPT_NOBODY, \true);
        \curl_exec($ch);
        $retcode = \curl_getinfo($ch, \CURLINFO_HTTP_CODE);
        \curl_close($ch);
        return $retcode < 400;
    }
}