Gergő Tisza has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/320326

Change subject: [WIP] Add API endpoints
......................................................................

[WIP] Add API endpoints

TODO:
* fix prop=pageviews result setting
* add uniques
* i18n

Bug: T144865
Change-Id: Icc3b078180c3ddb7f30c82f6033a931be09e5f22
---
M extension.json
A includes/ApiQueryMostViewed.php
A includes/ApiQueryPageViews.php
A includes/ApiQuerySiteViews.php
M includes/ServiceWiring.php
5 files changed, 247 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/PageViewInfo 
refs/changes/26/320326/1

diff --git a/extension.json b/extension.json
index 923ef1c..b100d15 100644
--- a/extension.json
+++ b/extension.json
@@ -15,7 +15,19 @@
                "MediaWiki\\Extensions\\PageViewInfo\\Hooks": 
"includes/Hooks.php",
                "MediaWiki\\Extensions\\PageViewInfo\\PageViewService": 
"includes/PageViewService.php",
                "MediaWiki\\Extensions\\PageViewInfo\\CachedPageViewService": 
"includes/CachedPageViewService.php",
-               
"MediaWiki\\Extensions\\PageViewInfo\\WikimediaPageViewService": 
"includes/WikimediaPageViewService.php"
+               
"MediaWiki\\Extensions\\PageViewInfo\\WikimediaPageViewService": 
"includes/WikimediaPageViewService.php",
+               "MediaWiki\\Extensions\\PageViewInfo\\ApiQueryMostViewed": 
"includes/ApiQueryMostViewed.php",
+               "MediaWiki\\Extensions\\PageViewInfo\\ApiQuerySiteViews": 
"includes/ApiQuerySiteViews.php",
+               "MediaWiki\\Extensions\\PageViewInfo\\ApiQueryPageViews": 
"includes/ApiQueryPageViews.php"
+       },
+       "APIListModules": {
+               "mostviewed": 
"MediaWiki\\Extensions\\PageViewInfo\\ApiQueryMostViewed"
+       },
+       "APIMetaModules": {
+               "siteviews": 
"MediaWiki\\Extensions\\PageViewInfo\\ApiQuerySiteViews"
+       },
+       "APIPropModules": {
+               "pageviews": 
"MediaWiki\\Extensions\\PageViewInfo\\ApiQueryPageViews"
        },
        "MessagesDirs": {
                "PageViewInfo": [
diff --git a/includes/ApiQueryMostViewed.php b/includes/ApiQueryMostViewed.php
new file mode 100644
index 0000000..b76a125
--- /dev/null
+++ b/includes/ApiQueryMostViewed.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace MediaWiki\Extensions\PageViewInfo;
+
+use ApiBase;
+use ApiPageSet;
+use ApiQueryGeneratorBase;
+use MediaWiki\MediaWikiServices;
+use Status;
+use Title;
+
+/**
+ * Expose PageViewService::getTopPages().
+ */
+class ApiQueryMostViewed extends ApiQueryGeneratorBase {
+       public function __construct( $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'pvim' );
+       }
+
+       public function execute() {
+               $this->run();
+       }
+
+       public function executeGenerator( $resultPageSet ) {
+               $this->run( $resultPageSet );
+       }
+
+       /**
+        * @param ApiPageSet|null $resultPageSet
+        */
+       private function run( ApiPageSet $resultPageSet = null ) {
+               /** @var PageViewService $service */
+               $service = MediaWikiServices::getInstance()->getService( 
'PageViewService' );
+               $status = $service->getTopPages();
+
+               if ( $status->isOK() ) {
+                       $params = $this->extractRequestParams();
+                       $limit = $params['limit'];
+                       $offset = $params['offset'];
+
+                       $data = $status->getValue();
+                       if ( count( $data ) > $offset + $limit ) {
+                               $this->setContinueEnumParameter( 'offset', 
$offset + $limit );
+                       }
+                       $data = array_slice( $data, $offset, $limit, true );
+
+                       if ( $resultPageSet ) {
+                               $titles = [];
+                               foreach ( $data as $title => $_ ) {
+                                       $titles[] = Title::newFromText( $title 
);
+                               }
+                               $resultPageSet->populateFromTitles( $titles );
+                       } else {
+                               $data = array_map( function ( $title, 
$titleData ) {
+                                       $item = [];
+                                       self::addTitleInfo( $item, 
\Title::newFromText( $title ) );
+                                       $item['count'] = $titleData;
+                                       return $item;
+                               }, array_keys( $data), $data );
+
+                               $result = $this->getResult();
+                               $result->addValue( 'query', 
$this->getModuleName(), $data );
+                               $result->addIndexedTagName( [ 'query', 
$this->getModuleName() ], 'page' );
+                       }
+               }
+               $this->getErrorFormatter()->addMessagesFromStatus( 
$this->getModuleName(),
+                       Status::wrap( $status ) );
+       }
+
+       public function getCacheMode( $params ) {
+               return 'public';
+       }
+
+       public function getAllowedParams() {
+               return [
+                       'limit' => [
+                               ApiBase::PARAM_DFLT => 10,
+                               ApiBase::PARAM_TYPE => 'limit',
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+                       ],
+                       'offset' => [
+                               ApiBase::PARAM_DFLT => 0,
+                               ApiBase::PARAM_TYPE => 'integer',
+                               ApiBase::PARAM_HELP_MSG => 
'api-help-param-continue',
+                       ],
+               ];
+       }
+
+       protected function getExamplesMessages() {
+               return [
+                       'action=query&list=mostviewed' => 
'apihelp-query+mostviewed-example',
+               ];
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/Extension:PageViewInfo';
+       }
+}
diff --git a/includes/ApiQueryPageViews.php b/includes/ApiQueryPageViews.php
new file mode 100644
index 0000000..f0fcf34
--- /dev/null
+++ b/includes/ApiQueryPageViews.php
@@ -0,0 +1,86 @@
+<?php
+
+namespace MediaWiki\Extensions\PageViewInfo;
+
+use ApiBase;
+use ApiQueryBase;
+use ApiResult;
+use MediaWiki\MediaWikiServices;
+use Status;
+use Title;
+
+/**
+ * Expose PageViewService::getPageData().
+ */
+class ApiQueryPageViews extends ApiQueryBase {
+       public function __construct( $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'pvip' );
+       }
+
+       public function execute() {
+               $continue = intval( $this->extractRequestParams()['continue'] );
+               $titles = $this->getPageSet()->getMissingTitles()
+                       + $this->getPageSet()->getSpecialTitles()
+                       + $this->getPageSet()->getGoodTitles();
+               $titles = array_slice( $titles, $continue, null, true );
+               /** @var PageViewService $service */
+               $service = MediaWikiServices::getInstance()->getService( 
'PageViewService' );
+               $status = $service->getPageData( $titles, 60 );
+               if ( $status->isOK() ) {
+                       $data = $status->getValue();
+                       foreach ( $titles as $i => $title ) {
+                               $fit = $this->addData( $i, $title, $data );
+                               if ( !$fit ) {
+                                       $this->setContinueEnumParameter( 
'continue', $continue );
+                                       break;
+                               }
+                               $continue++;
+                       }
+               }
+               $this->getErrorFormatter()->addMessagesFromStatus( 
$this->getModuleName(),
+                       Status::wrap( $status ) );
+       }
+
+       /**
+        * @param int $index Pageset ID (real or fake)
+        * @param Title $title
+        * @param array $data Data for all titles.
+        * @return bool Success.
+        */
+       protected function addData( $index, Title $title, array $data ) {
+               if ( !isset( $data[$title->getPrefixedDBkey()] ) ) {
+                       // PageViewService retains the ordering of titles so 
the first missing title means we
+                       // have run out of data.
+                       return false;
+               }
+               $value = $data[$title->getPrefixedDBkey()];
+               ApiResult::setArrayType( $value, 'kvp', 'date' );
+               $retval = $this->addPageSubItems( $index, $value );
+               $this->getResult()->addIndexedTagName( [ 'query', 'pages', 
$index, $this->getModuleName() ],
+                       'count' );
+               return $retval;
+       }
+
+       public function getCacheMode( $params ) {
+               return 'public';
+       }
+
+       public function getAllowedParams() {
+               return [
+                       'continue' => [
+                               ApiBase::PARAM_TYPE => 'integer',
+                               ApiBase::PARAM_HELP_MSG => 
'api-help-param-continue',
+                       ],
+               ];
+       }
+
+       protected function getExamplesMessages() {
+               return [
+                       'action=query&title=Main_Page&prop=pageviews' => 
'apihelp-query+pageviews-example',
+               ];
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/Extension:PageViewInfo';
+       }
+}
diff --git a/includes/ApiQuerySiteViews.php b/includes/ApiQuerySiteViews.php
new file mode 100644
index 0000000..bc32158
--- /dev/null
+++ b/includes/ApiQuerySiteViews.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace MediaWiki\Extensions\PageViewInfo;
+
+use ApiQueryBase;
+use ApiResult;
+use MediaWiki\MediaWikiServices;
+use Status;
+
+/**
+ * Expose PageViewService::getSiteData().
+ */
+class ApiQuerySiteViews extends ApiQueryBase  {
+       public function __construct( $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'pvis' );
+       }
+
+       public function execute() {
+               /** @var PageViewService $service */
+               $service = MediaWikiServices::getInstance()->getService( 
'PageViewService' );
+               $status = $service->getSiteData( 60 );
+               if ( $status->isOK() ) {
+                       $result = $this->getResult();
+                       $value = $status->getValue();
+                       ApiResult::setArrayType( $value, 'kvp', 'date' );
+                       ApiResult::setIndexedTagName( $value, 
$this->getModulePrefix() );
+                       $result->addValue( 'query', $this->getModuleName(), 
$value );
+                       $result->addIndexedTagName( [ 'query', 
$this->getModuleName() ], 'count' );
+               }
+               $this->getErrorFormatter()->addMessagesFromStatus( 
$this->getModuleName(),
+                       Status::wrap( $status ) );
+       }
+
+       public function getCacheMode( $params ) {
+               return 'public';
+       }
+
+       protected function getExamplesMessages() {
+               return [
+                       'action=query&meta=siteviews' => 
'apihelp-query+siteviews-example',
+               ];
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/Extension:PageViewInfo';
+       }
+}
diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php
index 981aea9..a45712e 100644
--- a/includes/ServiceWiring.php
+++ b/includes/ServiceWiring.php
@@ -20,6 +20,7 @@
                        $extensionConfig->get( 
'PageViewInfoWikimediaRequestLimit' ) );
                $service->setLogger( $logger );
                $cachedService = new CachedPageViewService( $service, $cache );
+               $cachedService->setCachedDays( 60 );
                $cachedService->setLogger( $logger );
                return $cachedService;
        },

-- 
To view, visit https://gerrit.wikimedia.org/r/320326
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Icc3b078180c3ddb7f30c82f6033a931be09e5f22
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/PageViewInfo
Gerrit-Branch: master
Gerrit-Owner: Gergő Tisza <gti...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to