mediawiki-extensions-Echo/includes/UnreadWikis.php
Kunal Mehta b85f978ddd Track what wikis a user has unread notifications on
This implements a backend layer and database storage for tracking what
wikis a user has unread notifications on. It is not yet exposed via any
API.

Whenever the notification counts on the local wiki are reset, a deferred
update is queued to also update the central database table.

Change-Id: Id1498bdeb5811d6848dc66781ffca03e726eab90
2015-11-20 15:54:11 -08:00

146 lines
2.9 KiB
PHP

<?php
/**
* Manages what wikis a user has unread notifications on
*
*/
class EchoUnreadWikis {
const ALERT = 'alert';
const MESSAGE = 'message';
/**
* @var int
*/
private $id;
/**
* @var MWEchoDbFactory
*/
private $dbFactory;
/**
* @param int $id Central user id
*/
public function __construct( $id ) {
$this->id = $id;
$this->dbFactory = MWEchoDbFactory::newFromDefault();
}
/**
* If CentralAuth is installed, use that. Otherwise
* assume they're using shared user tables.
*
* @param User $user
* @return EchoUnreadWikis|bool
*/
public static function newFromUser( User $user ) {
if ( class_exists( 'CentralAuth' ) ) {
// @todo don't be CA specific (see T111302/CentralIdLookup)
$caUser = CentralAuthUser::getInstance( $user );
if ( $caUser->isAttached() ) {
return new self( $caUser->getId() );
} else {
return false;
}
}
return new self( $user->getId() );
}
/**
* @param int $index DB_* constant
* @return bool|DatabaseBase
*/
private function getDB( $index ) {
return $this->dbFactory->getSharedDb( $index );
}
/**
* @return array
*/
public function getUnreadCounts() {
$dbr = $this->getDB( DB_SLAVE );
if ( $dbr === false ) {
return array();
}
$rows = $dbr->select(
'echo_unread_wikis',
array(
'euw_wiki',
'euw_alerts', 'euw_alerts_ts',
'euw_messages', 'euw_messages_ts',
),
array( 'euw_user' => $this->id ),
__METHOD__
);
$wikis = array();
foreach ( $rows as $row ) {
if ( !$row->euw_alerts && !$row->euw_messages ) {
// This shouldn't happen, but lets be safe...
continue;
}
$wikis[$row->euw_wiki] = array(
self::ALERT => array(
'count' => $row->euw_alerts,
'ts' => $row->euw_alerts_ts,
),
self::MESSAGE => array(
'count' => $row->euw_messages,
'ts' => $row->euw_messages_ts,
),
);
}
return $wikis;
}
/**
* @param string $wiki
* @param int $alertCount
* @param MWTimestamp|bool $alertTime
* @param int $msgCount
* @param MWTimestamp|bool $msgTime
*/
public function updateCount( $wiki, $alertCount, $alertTime, $msgCount, $msgTime ) {
$dbw = $this->getDB( DB_MASTER );
if ( $dbw === false ) {
return;
}
$defaultTS = '00000000000000';
if ( $alertCount || $msgCount ) {
$values = array(
'euw_alerts' => $alertCount,
'euw_alerts_ts' => $alertCount
? $alertTime->getTimestamp( TS_MW )
: $defaultTS,
'euw_messages' => $msgCount,
'euw_messages_ts' => $msgCount
? $msgTime->getTimestamp( TS_MW )
: $defaultTS,
);
$dbw->upsert(
'echo_unread_wikis',
array(
'euw_user' => $this->id,
'euw_wiki' => $wiki,
) + $values,
array( 'euw_user', 'euw_wiki' ),
$values,
__METHOD__
);
} else {
// No unread notifications, delete the row
$dbw->delete(
'echo_unread_wikis',
array( 'euw_user' => $this->id, 'euw_wiki' => $wiki ),
__METHOD__
);
}
}
}