mediawiki-extensions-Echo/includes/api/ApiCrossWikiBase.php
Roan Kattouw 05e531c7b6 Factor out cross-wiki API request code
Change-Id: Id926a607b99103d4489d1b734e00d104b7e80233
2016-06-08 22:35:57 +02:00

115 lines
3 KiB
PHP

<?php
use MediaWiki\Logger\LoggerFactory;
abstract class ApiCrossWikiBase extends ApiQueryBase {
/**
* @var EchoForeignNotifications
*/
protected $foreignNotifications;
/**
* @param ApiQuery $queryModule
* @param string $moduleName
* @param string $paramPrefix
*/
public function __construct( ApiQuery $queryModule, $moduleName, $paramPrefix = '' ) {
parent::__construct( $queryModule, $moduleName, $paramPrefix );
$this->foreignNotifications = new EchoForeignNotifications( $this->getUser() );
}
/**
* This will turn the current API call (with all of it's params) and execute
* it on all foreign wikis, returning an array of results per wiki.
*
* @return array
* @throws Exception
*/
protected function getFromForeign() {
$foreignReq = new EchoForeignWikiRequest(
$this->getUser(),
$this->getRequest()->getValues(),
$this->getRequestedForeignWikis(),
$this->getModulePrefix() . 'wikis'
);
return $foreignReq->execute();
}
/**
* @return bool
*/
protected function allowCrossWikiNotifications() {
global $wgEchoCrossWikiNotifications;
return $wgEchoCrossWikiNotifications;
}
/**
* This is basically equivalent to $params['wikis'], but some added checks:
* - `*` will expand to "all wikis with unread notifications"
* - if `$wgEchoCrossWikiNotifications` is off, foreign wikis will be excluded
*
* @return array
*/
protected function getRequestedWikis() {
$params = $this->extractRequestParams();
// if wiki is omitted from params, that's because crosswiki is/was not
// available, and it'll default to current wiki
$wikis = isset( $params['wikis'] ) ? $params['wikis'] : array( wfWikiID() );
if ( array_search( '*', $wikis ) !== false ) {
// expand `*` to all foreign wikis with unread notifications + local
$wikis = array_merge(
array( wfWikiID() ),
$this->getForeignWikisWithUnreadNotifications()
);
}
if ( !$this->allowCrossWikiNotifications() ) {
// exclude foreign wikis if x-wiki is not enabled
$wikis = array_intersect_key( array( wfWikiID() ), $wikis );
}
return $wikis;
}
/**
* @return array Wiki names
*/
protected function getRequestedForeignWikis() {
return array_diff( $this->getRequestedWikis(), array( wfWikiId() ) );
}
/**
* @return array Wiki names
*/
protected function getForeignWikisWithUnreadNotifications() {
return $this->foreignNotifications->getWikis();
}
/**
* @return array
*/
public function getAllowedParams() {
global $wgConf;
$params = array();
if ( $this->allowCrossWikiNotifications() ) {
$params += array(
// fetch notifications from multiple wikis
'wikis' => array(
ApiBase::PARAM_ISMULTI => true,
ApiBase::PARAM_DFLT => wfWikiId(),
// `*` will let you immediately fetch from all wikis that have
// unread notifications, without having to look them up first
ApiBase::PARAM_TYPE => array_unique( array_merge( $wgConf->wikis, array( wfWikiId(), '*' ) ) ),
),
);
}
return $params;
}
}