* @ingroup API
*/
class ApiWatch extends ApiBase {
+ private $mPageSet = null;
public function execute() {
$user = $this->getUser();
if ( !$user->isLoggedIn() ) {
$this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
}
+
if ( !$user->isAllowed( 'editmywatchlist' ) ) {
$this->dieUsage( 'You don\'t have permission to edit your watchlist', 'permissiondenied' );
}
$params = $this->extractRequestParams();
- $title = Title::newFromText( $params['title'] );
+ $pageSet = $this->getPageSet();
+ // by default we use pageset to extract the page to work on.
+ // title is still supported for backward compatibility
+ if ( !isset( $params['title'] ) ) {
+ $pageSet->execute();
+ $res = $pageSet->getInvalidTitlesAndRevisions( array(
+ 'invalidTitles',
+ 'special',
+ 'missingIds',
+ 'missingRevIds',
+ 'interwikiTitles'
+ ) );
+
+ foreach ( $pageSet->getMissingTitles() as $title ) {
+ $r = $this->watchTitle( $title, $user, $params );
+ $r['missing'] = 1;
+ $res[] = $r;
+ }
+
+ foreach ( $pageSet->getGoodTitles() as $title ) {
+ $r = $this->watchTitle( $title, $user, $params );
+ $res[] = $r;
+ }
+ $this->getResult()->setIndexedTagName( $res, 'w' );
+ } else {
+ // dont allow use of old title parameter with new pageset parameters.
+ $extraParams = array_keys( array_filter( $pageSet->extractRequestParams(), function ( $x ) {
+ return $x !== null && $x !== false;
+ } ) );
+
+ if ( $extraParams ) {
+ $p = $this->getModulePrefix();
+ $this->dieUsage(
+ "The parameter {$p}title can not be used with " . implode( ", ", $extraParams ),
+ 'invalidparammix'
+ );
+ }
+
+ $title = Title::newFromText( $params['title'] );
+ if ( !$title || !$title->isWatchable() ) {
+ $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+ }
+ $res = $this->watchTitle( $title, $user, $params, true );
+ }
+ $this->getResult()->addValue( null, $this->getModuleName(), $res );
+ }
- if ( !$title || !$title->isWatchable() ) {
- $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+ private function watchTitle( Title $title, User $user, array $params,
+ $compatibilityMode = false
+ ) {
+ if ( !$title->isWatchable() ) {
+ return array( 'title' => $title->getPrefixedText(), 'watchable' => 0 );
}
$res = array( 'title' => $title->getPrefixedText() );
}
if ( $params['unwatch'] ) {
- $res['unwatched'] = '';
- $res['message'] = $this->msg( 'removedwatchtext', $title->getPrefixedText() )
- ->title( $title )->parseAsBlock();
$status = UnwatchAction::doUnwatch( $title, $user );
+ if ( $status->isOK() ) {
+ $res['unwatched'] = '';
+ $res['message'] = $this->msg( 'removedwatchtext', $title->getPrefixedText() )
+ ->title( $title )->parseAsBlock();
+ }
} else {
- $res['watched'] = '';
- $res['message'] = $this->msg( 'addedwatchtext', $title->getPrefixedText() )
- ->title( $title )->parseAsBlock();
$status = WatchAction::doWatch( $title, $user );
+ if ( $status->isOK() ) {
+ $res['watched'] = '';
+ $res['message'] = $this->msg( 'addedwatchtext', $title->getPrefixedText() )
+ ->title( $title )->parseAsBlock();
+ }
}
if ( !is_null( $oldLang ) ) {
}
if ( !$status->isOK() ) {
- $this->dieStatus( $status );
+ if ( $compatibilityMode ) {
+ $this->dieStatus( $status );
+ }
+ $res['error'] = $this->getErrorFromStatus( $status );
}
- $this->getResult()->addValue( null, $this->getModuleName(), $res );
+
+ return $res;
+ }
+
+ /**
+ * Get a cached instance of an ApiPageSet object
+ * @return ApiPageSet
+ */
+ private function getPageSet() {
+ if ( $this->mPageSet === null ) {
+ $this->mPageSet = new ApiPageSet( $this );
+ }
+
+ return $this->mPageSet;
}
public function mustBePosted() {
return 'watch';
}
- public function getAllowedParams() {
- return array(
+ public function getAllowedParams( $flags = 0 ) {
+ $result = array(
'title' => array(
ApiBase::PARAM_TYPE => 'string',
- ApiBase::PARAM_REQUIRED => true
+ ApiBase::PARAM_DEPRECATED => true
),
'unwatch' => false,
'uselang' => null,
ApiBase::PARAM_REQUIRED => true
),
);
+ if ( $flags ) {
+ $result += $this->getPageSet()->getFinalParams( $flags );
+ }
+
+ return $result;
}
public function getParamDescription() {
- return array(
- 'title' => 'The page to (un)watch',
+ $psModule = $this->getPageSet();
+
+ return $psModule->getParamDescription() + array(
+ 'title' => 'The page to (un)watch. use titles instead',
'unwatch' => 'If set the page will be unwatched rather than watched',
'uselang' => 'Language to show the message in',
'token' => 'A token previously acquired via prop=info',
}
public function getDescription() {
- return 'Add or remove a page from/to the current user\'s watchlist';
+ return 'Add or remove pages from/to the current user\'s watchlist.';
}
public function getPossibleErrors() {
public function getExamples() {
return array(
- 'api.php?action=watch&title=Main_Page' => 'Watch the page "Main Page"',
- 'api.php?action=watch&title=Main_Page&unwatch=' => 'Unwatch the page "Main Page"',
+ 'api.php?action=watch&titles=Main_Page' => 'Watch the page "Main Page"',
+ 'api.php?action=watch&titles=Main_Page&unwatch=' => 'Unwatch the page "Main Page"',
);
}