2013-09-18 21:10:37 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
class ApiEchoMarkRead extends ApiBase {
|
|
|
|
|
|
|
|
public function execute() {
|
|
|
|
// To avoid API warning, register the parameter used to bust browser cache
|
|
|
|
$this->getMain()->getVal( '_' );
|
|
|
|
|
|
|
|
$user = $this->getUser();
|
|
|
|
if ( $user->isAnon() ) {
|
2016-11-03 19:16:56 +00:00
|
|
|
$this->dieWithError( 'apierror-mustbeloggedin-generic', 'login-required' );
|
2018-02-22 03:07:45 +00:00
|
|
|
} elseif ( MWEchoDbFactory::newFromDefault()->isReadOnly() ) {
|
|
|
|
$this->dieReadOnly();
|
2013-09-18 21:10:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
$notifUser = MWEchoNotifUser::newFromUser( $user );
|
|
|
|
|
|
|
|
$params = $this->extractRequestParams();
|
|
|
|
|
|
|
|
// There is no need to trigger markRead if all notifications are read
|
NotifUser: Refactor getNotificationCount() and friends, add caching for global counts
Previously, getNotificationCount() only looked at local notifications,
and foreign notifications were added in separately by getMessageCount()
and getAlertCount(). This didn't make any sense and resulted in
counter-intuitive things like I4d49b543.
Instead, add a $global flag to getNotificationCount(). If $global=false,
the local count is returned as before, but if $global=true, the
global count (=local+foreign) is returned. If $global is omitted,
the user's cross-wiki notification preference determines which is returned.
Update getLastUnreadNotificationCount() in the same way, since it had
the same issues.
Also add caching for global counts and timestamps, using a global
memc key.
Bug: T133623
Change-Id: If78bfc710acd91a075771b565cc99f4c302a104d
2016-04-27 07:12:32 +00:00
|
|
|
if ( $notifUser->getLocalNotificationCount() > 0 ) {
|
2013-09-18 21:10:37 +00:00
|
|
|
if ( count( $params['list'] ) ) {
|
|
|
|
// Make sure there is a limit to the update
|
|
|
|
$notifUser->markRead( array_slice( $params['list'], 0, ApiBase::LIMIT_SML2 ) );
|
2014-08-13 22:00:25 +00:00
|
|
|
// Mark all as read
|
2013-09-18 21:10:37 +00:00
|
|
|
} elseif ( $params['all'] ) {
|
|
|
|
$notifUser->markAllRead();
|
2014-08-13 22:00:25 +00:00
|
|
|
// Mark all as read for sections
|
|
|
|
} elseif ( $params['sections'] ) {
|
|
|
|
$notifUser->markAllRead( $params['sections'] );
|
2013-09-18 21:10:37 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-04 22:44:22 +00:00
|
|
|
// Mark as unread
|
2018-07-07 23:34:43 +00:00
|
|
|
if ( $params['unreadlist'] !== null && $params['unreadlist'] !== [] ) {
|
2016-03-04 22:44:22 +00:00
|
|
|
// Make sure there is a limit to the update
|
|
|
|
$notifUser->markUnRead( array_slice( $params['unreadlist'], 0, ApiBase::LIMIT_SML2 ) );
|
|
|
|
}
|
|
|
|
|
2016-12-05 18:51:07 +00:00
|
|
|
$result = [
|
2014-08-05 21:50:54 +00:00
|
|
|
'result' => 'success'
|
2016-12-05 18:51:07 +00:00
|
|
|
];
|
2014-08-05 21:50:54 +00:00
|
|
|
$rawCount = 0;
|
|
|
|
foreach ( EchoAttributeManager::$sections as $section ) {
|
2018-05-31 23:11:57 +00:00
|
|
|
$rawSectionCount = $notifUser->getNotificationCount( $section );
|
2014-08-05 21:50:54 +00:00
|
|
|
$result[$section]['rawcount'] = $rawSectionCount;
|
|
|
|
$result[$section]['count'] = EchoNotificationController::formatNotificationCount( $rawSectionCount );
|
|
|
|
$rawCount += $rawSectionCount;
|
|
|
|
}
|
|
|
|
|
2016-12-05 18:51:07 +00:00
|
|
|
$result += [
|
2013-09-25 00:18:02 +00:00
|
|
|
'rawcount' => $rawCount,
|
|
|
|
'count' => EchoNotificationController::formatNotificationCount( $rawCount ),
|
2016-12-05 18:51:07 +00:00
|
|
|
];
|
2013-09-18 21:10:37 +00:00
|
|
|
$this->getResult()->addValue( 'query', $this->getModuleName(), $result );
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getAllowedParams() {
|
2016-12-05 18:51:07 +00:00
|
|
|
return [
|
|
|
|
'list' => [
|
2013-09-18 21:10:37 +00:00
|
|
|
ApiBase::PARAM_ISMULTI => true,
|
2016-12-05 18:51:07 +00:00
|
|
|
],
|
|
|
|
'unreadlist' => [
|
2016-03-04 22:44:22 +00:00
|
|
|
ApiBase::PARAM_ISMULTI => true,
|
2016-12-05 18:51:07 +00:00
|
|
|
],
|
|
|
|
'all' => [
|
2013-09-18 21:10:37 +00:00
|
|
|
ApiBase::PARAM_REQUIRED => false,
|
|
|
|
ApiBase::PARAM_TYPE => 'boolean'
|
2016-12-05 18:51:07 +00:00
|
|
|
],
|
|
|
|
'sections' => [
|
2014-08-13 22:00:25 +00:00
|
|
|
ApiBase::PARAM_TYPE => EchoAttributeManager::$sections,
|
|
|
|
ApiBase::PARAM_ISMULTI => true,
|
2016-12-05 18:51:07 +00:00
|
|
|
],
|
|
|
|
'token' => [
|
2013-09-18 21:10:37 +00:00
|
|
|
ApiBase::PARAM_REQUIRED => true,
|
2016-12-05 18:51:07 +00:00
|
|
|
],
|
|
|
|
];
|
2013-09-18 21:10:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public function needsToken() {
|
2014-08-09 13:07:07 +00:00
|
|
|
return 'csrf';
|
2013-09-18 21:10:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public function getTokenSalt() {
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
|
|
|
|
public function mustBePosted() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function isWriteMode() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-10-28 19:42:41 +00:00
|
|
|
/**
|
|
|
|
* @see ApiBase::getExamplesMessages()
|
2018-08-13 07:25:22 +00:00
|
|
|
* @return string[]
|
2014-10-28 19:42:41 +00:00
|
|
|
*/
|
|
|
|
protected function getExamplesMessages() {
|
2016-12-05 18:51:07 +00:00
|
|
|
return [
|
2014-10-28 19:42:41 +00:00
|
|
|
'action=echomarkread&list=8'
|
|
|
|
=> 'apihelp-echomarkread-example-1',
|
|
|
|
'action=echomarkread&all=true'
|
|
|
|
=> 'apihelp-echomarkread-example-2',
|
2016-03-04 22:44:22 +00:00
|
|
|
'action=echomarkread&unreadlist=1'
|
|
|
|
=> 'apihelp-echomarkread-example-3',
|
2016-12-05 18:51:07 +00:00
|
|
|
];
|
2014-10-28 19:42:41 +00:00
|
|
|
}
|
|
|
|
|
2013-09-18 21:10:37 +00:00
|
|
|
public function getHelpUrls() {
|
2014-08-14 21:33:23 +00:00
|
|
|
return 'https://www.mediawiki.org/wiki/Echo_(Notifications)/API';
|
2013-09-18 21:10:37 +00:00
|
|
|
}
|
|
|
|
}
|