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