From 4d02abdbb61c7883e3a13e0fde93df49fdeae9fc Mon Sep 17 00:00:00 2001
From: Thomas Steur <thomas.steur@gmail.com>
Date: Sun, 7 Aug 2016 11:48:13 +0000
Subject: [PATCH] API.getReportMetadata should work only for one site

---
 plugins/API/API.php                           | 13 ++++++++++---
 plugins/API/ProcessedReport.php               | 19 ++++++++-----------
 plugins/Actions/Reports/SiteSearchBase.php    |  4 ++--
 .../common/services/report-metadata-model.js  |  4 ++--
 plugins/Ecommerce/Reports/Base.php            |  6 ++----
 plugins/Goals/Reports/Base.php                |  6 ++----
 plugins/ImageGraph/ImageGraph.php             |  7 +++----
 7 files changed, 29 insertions(+), 30 deletions(-)

diff --git a/plugins/API/API.php b/plugins/API/API.php
index a3a9b4fb02..7548cf312b 100644
--- a/plugins/API/API.php
+++ b/plugins/API/API.php
@@ -264,19 +264,26 @@ class API extends \Piwik\Plugin\API
      * Triggers a hook to ask plugins for available Reports.
      * Returns metadata information about each report (category, name, dimension, metrics, etc.)
      *
-     * @param string $idSites Comma separated list of website Ids
+     * @param string $idSites THIS PARAMETER IS DEPRECATED AND WILL BE REMOVED IN PIWIK 4
      * @param bool|string $period
      * @param bool|Date $date
      * @param bool $hideMetricsDoc
      * @param bool $showSubtableReports
+     * @param int $idSite
      * @return array
      */
     public function getReportMetadata($idSites = '', $period = false, $date = false, $hideMetricsDoc = false,
-                                      $showSubtableReports = false)
+                                      $showSubtableReports = false, $idSite = false)
     {
+        if (empty($idSite) && !empty($idSites)) {
+            $idSite = array_shift($idSites);
+        } elseif (empty($idSites)) {
+            throw new \Exception('Calling API.getReportMetadata without any idSite is no longer supported since Piwik 3.0.0. Please specifiy at least one idSite via the "idSite" parameter.');
+        }
+
         Piwik::checkUserHasViewAccess($idSites);
 
-        $metadata = $this->processedReport->getReportMetadata($idSites, $period, $date, $hideMetricsDoc, $showSubtableReports);
+        $metadata = $this->processedReport->getReportMetadata($idSite, $period, $date, $hideMetricsDoc, $showSubtableReports);
         return $metadata;
     }
 
diff --git a/plugins/API/ProcessedReport.php b/plugins/API/ProcessedReport.php
index b7dd476075..d957b1e717 100644
--- a/plugins/API/ProcessedReport.php
+++ b/plugins/API/ProcessedReport.php
@@ -109,7 +109,7 @@ class ProcessedReport
 
     public function getReportMetadataByUniqueId($idSite, $apiMethodUniqueId)
     {
-        $metadata = $this->getReportMetadata(array($idSite));
+        $metadata = $this->getReportMetadata($idSite);
 
         foreach ($metadata as $report) {
             if ($report['uniqueId'] == $apiMethodUniqueId) {
@@ -148,23 +148,20 @@ class ProcessedReport
      * Triggers a hook to ask plugins for available Reports.
      * Returns metadata information about each report (category, name, dimension, metrics, etc.)
      *
-     * @param string $idSites Comma separated list of website Ids
+     * @param int $idSite
      * @param bool|string $period
      * @param bool|Date $date
      * @param bool $hideMetricsDoc
      * @param bool $showSubtableReports
      * @return array
      */
-    public function getReportMetadata($idSites, $period = false, $date = false, $hideMetricsDoc = false, $showSubtableReports = false)
+    public function getReportMetadata($idSite, $period = false, $date = false, $hideMetricsDoc = false, $showSubtableReports = false)
     {
-        $idSites = Site::getIdSitesFromIdSitesString($idSites);
-        if (!empty($idSites)) {
-            Piwik::checkUserHasViewAccess($idSites);
-        }
+        Piwik::checkUserHasViewAccess($idSite);
 
         // as they cache key contains a lot of information there would be an even better cache result by caching parts of
         // this huge method separately but that makes it also more complicated. leaving it like this for now.
-        $key   = $this->buildReportMetadataCacheKey($idSites, $period, $date, $hideMetricsDoc, $showSubtableReports);
+        $key   = $this->buildReportMetadataCacheKey($idSite, $period, $date, $hideMetricsDoc, $showSubtableReports);
         $key   = CacheId::pluginAware($key);
         $cache = PiwikCache::getTransientCache();
 
@@ -172,7 +169,7 @@ class ProcessedReport
             return $cache->fetch($key);
         }
 
-        $parameters = array('idSites' => $idSites, 'period' => $period, 'date' => $date);
+        $parameters = array('idSite' => $idSite, 'period' => $period, 'date' => $date);
 
         $availableReports = array();
 
@@ -721,7 +718,7 @@ class ProcessedReport
         return null;
     }
 
-    private function buildReportMetadataCacheKey($idSites, $period, $date, $hideMetricsDoc, $showSubtableReports)
+    private function buildReportMetadataCacheKey($idSite, $period, $date, $hideMetricsDoc, $showSubtableReports)
     {
         if (isset($_GET) && isset($_POST) && is_array($_GET) && is_array($_POST)) {
             $request = $_GET + $_POST;
@@ -742,7 +739,7 @@ class ProcessedReport
             }
         }
 
-        $key .= implode(',', $idSites) . ($period === false ? 0 : $period) . ($date === false ? 0 : $date);
+        $key .= $idSite . 'x' . ($period === false ? 0 : $period) . 'x' . ($date === false ? 0 : $date);
         $key .= (int)$hideMetricsDoc . (int)$showSubtableReports . Piwik::getCurrentUserLogin();
         return 'reportMetadata' . md5($key);
     }
diff --git a/plugins/Actions/Reports/SiteSearchBase.php b/plugins/Actions/Reports/SiteSearchBase.php
index d4715e04e6..787ce89fe6 100644
--- a/plugins/Actions/Reports/SiteSearchBase.php
+++ b/plugins/Actions/Reports/SiteSearchBase.php
@@ -37,9 +37,9 @@ abstract class SiteSearchBase extends Base
 
     public function configureReportMetadata(&$availableReports, $infos)
     {
-        $idSites = !empty($infos['idSites']) ? $infos['idSites'] : array();
+        $idSite = array($infos['idSite']);
 
-        if (!$this->isEnabledForIdSites($idSites, Common::getRequestVar('idSite', 0, 'int'))) {
+        if (!$this->isEnabledForIdSites($idSite, Common::getRequestVar('idSite', 0, 'int'))) {
             return;
         }
 
diff --git a/plugins/CoreHome/angularjs/common/services/report-metadata-model.js b/plugins/CoreHome/angularjs/common/services/report-metadata-model.js
index fcf8e4690e..c5fd42b73a 100644
--- a/plugins/CoreHome/angularjs/common/services/report-metadata-model.js
+++ b/plugins/CoreHome/angularjs/common/services/report-metadata-model.js
@@ -39,8 +39,8 @@
             if (!reportsPromise) {
                 reportsPromise = piwikApi.fetch({
                     method: 'API.getReportMetadata',
-                    idSites: piwik.idSite || piwik.broadcast.getValueFromUrl('idSite'),
-                    filter_limit: '-1'
+                    filter_limit: '-1',
+                    idSite: piwik.idSite || piwik.broadcast.getValueFromUrl('idSite')
                 }).then(function (response) {
                     model.reports = response;
                     return response;
diff --git a/plugins/Ecommerce/Reports/Base.php b/plugins/Ecommerce/Reports/Base.php
index 28a3a4a36f..5fe49dd1e8 100644
--- a/plugins/Ecommerce/Reports/Base.php
+++ b/plugins/Ecommerce/Reports/Base.php
@@ -54,14 +54,12 @@ abstract class Base extends Report
 
     private function isEcommerceEnabledByInfos($infos)
     {
-        $idSites = $infos['idSites'];
+        $idSite = $infos['idSite'];
 
-        if (count($idSites) != 1) {
+        if (empty($idSite)) {
             return false;
         }
 
-        $idSite = reset($idSites);
-
         return $this->isEcommerceEnabled($idSite);
     }
 
diff --git a/plugins/Goals/Reports/Base.php b/plugins/Goals/Reports/Base.php
index f9e36d6787..4c2a57e755 100644
--- a/plugins/Goals/Reports/Base.php
+++ b/plugins/Goals/Reports/Base.php
@@ -41,14 +41,12 @@ abstract class Base extends \Piwik\Plugin\Report
 
     protected function getIdSiteFromInfos($infos)
     {
-        $idSites = $infos['idSites'];
+        $idSite = $infos['idSite'];
 
-        if (count($idSites) != 1) {
+        if (empty($idSite)) {
             return null;
         }
 
-        $idSite = reset($idSites);
-
         return $idSite;
     }
 
diff --git a/plugins/ImageGraph/ImageGraph.php b/plugins/ImageGraph/ImageGraph.php
index 9869d37081..86a1d45cfc 100644
--- a/plugins/ImageGraph/ImageGraph.php
+++ b/plugins/ImageGraph/ImageGraph.php
@@ -52,14 +52,13 @@ class ImageGraph extends \Piwik\Plugin
      */
     public function getReportMetadata(&$reports, $info)
     {
-        $idSites = $info['idSites'];
+        $idSite = $info['idSite'];
 
         // If only one website is selected, we add the Graph URL
-        if (count($idSites) != 1) {
+        if (empty($idSite)) {
             return;
         }
-        $idSite = reset($idSites);
-
+        
         // in case API.getReportMetadata was not called with date/period we use sane defaults
         if (empty($info['period'])) {
             $info['period'] = 'day';
-- 
GitLab