MediaWiki  master
ApiQueryWatchlistRaw.php
Go to the documentation of this file.
1 <?php
24 
32 
33  public function __construct( ApiQuery $query, $moduleName ) {
34  parent::__construct( $query, $moduleName, 'wr' );
35  }
36 
37  public function execute() {
38  $this->run();
39  }
40 
41  public function executeGenerator( $resultPageSet ) {
42  $this->run( $resultPageSet );
43  }
44 
49  private function run( $resultPageSet = null ) {
50  $params = $this->extractRequestParams();
51 
52  $user = $this->getWatchlistUser( $params );
53 
54  $prop = array_flip( (array)$params['prop'] );
55  $show = array_flip( (array)$params['show'] );
56  if ( isset( $show[WatchedItemQueryService::FILTER_CHANGED] )
58  ) {
59  $this->dieWithError( 'apierror-show' );
60  }
61 
62  $options = [];
63  if ( $params['namespace'] ) {
64  $options['namespaceIds'] = $params['namespace'];
65  }
66  if ( isset( $show[WatchedItemQueryService::FILTER_CHANGED] ) ) {
68  }
69  if ( isset( $show[WatchedItemQueryService::FILTER_NOT_CHANGED] ) ) {
71  }
72 
73  if ( isset( $params['continue'] ) ) {
74  $cont = explode( '|', $params['continue'] );
75  $this->dieContinueUsageIf( count( $cont ) != 2 );
76  $ns = (int)$cont[0];
77  $this->dieContinueUsageIf( strval( $ns ) !== $cont[0] );
78  $title = $cont[1];
79  $options['startFrom'] = new TitleValue( $ns, $title );
80  }
81 
82  if ( isset( $params['fromtitle'] ) ) {
83  list( $ns, $title ) = $this->prefixedTitlePartToKey( $params['fromtitle'] );
84  $options['from'] = new TitleValue( $ns, $title );
85  }
86 
87  if ( isset( $params['totitle'] ) ) {
88  list( $ns, $title ) = $this->prefixedTitlePartToKey( $params['totitle'] );
89  $options['until'] = new TitleValue( $ns, $title );
90  }
91 
93  if ( $params['dir'] === 'descending' ) {
95  }
96  $options['limit'] = $params['limit'] + 1;
97 
98  $titles = [];
99  $count = 0;
100  $services = MediaWikiServices::getInstance();
101  $items = $services->getWatchedItemQueryService()
102  ->getWatchedItemsForUser( $user, $options );
103 
104  // Get gender information
105  if ( $items !== [] && $resultPageSet === null &&
106  $services->getContentLanguage()->needsGenderDistinction()
107  ) {
108  $nsInfo = $services->getNamespaceInfo();
109  $usernames = [];
110  foreach ( $items as $item ) {
111  $linkTarget = $item->getLinkTarget();
112  if ( $nsInfo->hasGenderDistinction( $linkTarget->getNamespace() ) ) {
113  $usernames[] = $linkTarget->getText();
114  }
115  }
116  if ( $usernames !== [] ) {
117  $services->getGenderCache()->doQuery( $usernames, __METHOD__ );
118  }
119  }
120 
121  foreach ( $items as $item ) {
122  $ns = $item->getLinkTarget()->getNamespace();
123  $dbKey = $item->getLinkTarget()->getDBkey();
124  if ( ++$count > $params['limit'] ) {
125  // We've reached the one extra which shows that there are
126  // additional pages to be had. Stop here...
127  $this->setContinueEnumParameter( 'continue', $ns . '|' . $dbKey );
128  break;
129  }
130  $t = Title::makeTitle( $ns, $dbKey );
131 
132  if ( is_null( $resultPageSet ) ) {
133  $vals = [];
134  ApiQueryBase::addTitleInfo( $vals, $t );
135  if ( isset( $prop['changed'] ) && !is_null( $item->getNotificationTimestamp() ) ) {
136  $vals['changed'] = wfTimestamp( TS_ISO_8601, $item->getNotificationTimestamp() );
137  }
138  $fit = $this->getResult()->addValue( $this->getModuleName(), null, $vals );
139  if ( !$fit ) {
140  $this->setContinueEnumParameter( 'continue', $ns . '|' . $dbKey );
141  break;
142  }
143  } else {
144  $titles[] = $t;
145  }
146  }
147  if ( is_null( $resultPageSet ) ) {
148  $this->getResult()->addIndexedTagName( $this->getModuleName(), 'wr' );
149  } else {
150  $resultPageSet->populateFromTitles( $titles );
151  }
152  }
153 
154  public function getAllowedParams() {
155  return [
156  'continue' => [
157  ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
158  ],
159  'namespace' => [
160  ApiBase::PARAM_ISMULTI => true,
161  ApiBase::PARAM_TYPE => 'namespace'
162  ],
163  'limit' => [
164  ApiBase::PARAM_DFLT => 10,
165  ApiBase::PARAM_TYPE => 'limit',
166  ApiBase::PARAM_MIN => 1,
169  ],
170  'prop' => [
171  ApiBase::PARAM_ISMULTI => true,
173  'changed',
174  ],
176  ],
177  'show' => [
178  ApiBase::PARAM_ISMULTI => true,
182  ]
183  ],
184  'owner' => [
185  ApiBase::PARAM_TYPE => 'user'
186  ],
187  'token' => [
188  ApiBase::PARAM_TYPE => 'string',
189  ApiBase::PARAM_SENSITIVE => true,
190  ],
191  'dir' => [
192  ApiBase::PARAM_DFLT => 'ascending',
194  'ascending',
195  'descending'
196  ],
197  ],
198  'fromtitle' => [
199  ApiBase::PARAM_TYPE => 'string'
200  ],
201  'totitle' => [
202  ApiBase::PARAM_TYPE => 'string'
203  ],
204  ];
205  }
206 
207  protected function getExamplesMessages() {
208  return [
209  'action=query&list=watchlistraw'
210  => 'apihelp-query+watchlistraw-example-simple',
211  'action=query&generator=watchlistraw&gwrshow=changed&prop=info'
212  => 'apihelp-query+watchlistraw-example-generator',
213  ];
214  }
215 
216  public function getHelpUrls() {
217  return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Watchlistraw';
218  }
219 }
const PARAM_TYPE
(string|string[]) Either an array of allowed value strings, or a string type as described below...
Definition: ApiBase.php:94
const LIMIT_BIG2
Fast query, apihighlimits limit.
Definition: ApiBase.php:261
executeGenerator( $resultPageSet)
static addTitleInfo(&$arr, $title, $prefix='')
Add information (title and namespace) about a Title object to a result array.
getResult()
Get the result object.
Definition: ApiBase.php:640
prefixedTitlePartToKey( $titlePart, $defaultNamespace=NS_MAIN)
Convert an input title or title prefix into a namespace constant and dbkey.
const PARAM_DFLT
(null|boolean|integer|string) Default value of the parameter.
Definition: ApiBase.php:55
const LIMIT_BIG1
Fast query, standard limit.
Definition: ApiBase.php:259
const PARAM_MAX
(integer) Max value allowed for the parameter, for PARAM_TYPE &#39;integer&#39; and &#39;limit&#39;.
Definition: ApiBase.php:97
Represents a page (or page fragment) title within MediaWiki.
Definition: TitleValue.php:36
dieWithError( $msg, $code=null, $data=null, $httpCode=null)
Abort execution with an error.
Definition: ApiBase.php:2006
extractRequestParams( $options=[])
Using getAllowedParams(), this function makes an array of the values provided by the user...
Definition: ApiBase.php:761
const PARAM_HELP_MSG_PER_VALUE
((string|array|Message)[]) When PARAM_TYPE is an array, this is an array mapping those values to $msg...
Definition: ApiBase.php:164
setContinueEnumParameter( $paramName, $paramValue)
Overridden to set the generator param if in generator mode.
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
dieContinueUsageIf( $condition)
Die with the &#39;badcontinue&#39; error.
Definition: ApiBase.php:2200
run( $resultPageSet=null)
getModuleName()
Get the name of the module being executed by this instance.
Definition: ApiBase.php:520
const PARAM_MAX2
(integer) Max value allowed for the parameter for users with the apihighlimits right, for PARAM_TYPE &#39;limit&#39;.
Definition: ApiBase.php:103
This is the main query class.
Definition: ApiQuery.php:37
__construct(ApiQuery $query, $moduleName)
const PARAM_HELP_MSG
(string|array|Message) Specify an alternative i18n documentation message for this parameter...
Definition: ApiBase.php:131
const PARAM_SENSITIVE
(boolean) Is the parameter sensitive? Note &#39;password&#39;-type fields are always sensitive regardless of ...
Definition: ApiBase.php:200
static makeTitle( $ns, $title, $fragment='', $interwiki='')
Create a new Title from a namespace index and a DB key.
Definition: Title.php:584
getWatchlistUser( $params)
Gets the user for whom to get the watchlist.
Definition: ApiBase.php:1757
const PARAM_ISMULTI
(boolean) Accept multiple pipe-separated values for this parameter (e.g.
Definition: ApiBase.php:58
This query action allows clients to retrieve a list of pages on the logged-in user&#39;s watchlist...
const PARAM_MIN
(integer) Lowest value allowed for the parameter, for PARAM_TYPE &#39;integer&#39; and &#39;limit&#39;.
Definition: ApiBase.php:106