mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Echo
synced 2024-12-01 02:46:46 +00:00
a05cb46922
Change-Id: I44e9707ba279a737dadb8c59013d53f3c67a5177
208 lines
4.9 KiB
PHP
208 lines
4.9 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Database backend for echo notification
|
|
*/
|
|
class MWDbEchoBackend extends MWEchoBackend {
|
|
|
|
/**
|
|
* Database object
|
|
*/
|
|
private $dbr;
|
|
private $dbw;
|
|
|
|
protected function __construct() {
|
|
$this->dbr = wfGetDB( DB_SLAVE );
|
|
$this->dbw = wfGetDB( DB_MASTER );
|
|
}
|
|
|
|
/**
|
|
* @param $row array
|
|
*/
|
|
public function createNotification( $row ) {
|
|
$row['notification_timestamp'] = $this->dbw->timestamp( $row['notification_timestamp'] );
|
|
$this->dbw->insert( 'echo_notification', $row, __METHOD__ );
|
|
}
|
|
|
|
/**
|
|
* @param $user User the user to get notifications for
|
|
* @param $unread bool true to get only unread notifications
|
|
* @param $limit int The maximum number of notifications to return
|
|
* @param $timestamp int The timestamp to start from
|
|
* @param $offset int The notification event id to start from
|
|
* @param $outputFormat string The output format of the notifications (web,
|
|
* email, etc.)
|
|
* @return array
|
|
*/
|
|
public function loadNotifications( $user, $unread, $limit, $timestamp, $offset, $outputFormat = 'web' ) {
|
|
|
|
$eventTypesToLoad = $this->getUserEnabledEvents( $user, $outputFormat );
|
|
if ( !$eventTypesToLoad ) {
|
|
return array();
|
|
}
|
|
|
|
$conds = array(
|
|
'notification_user' => $user->getID(),
|
|
'event_type' => $eventTypesToLoad,
|
|
);
|
|
|
|
if ( $unread ) {
|
|
$conds['notification_read_timestamp'] = null;
|
|
}
|
|
|
|
// start points are specified
|
|
if ( $timestamp && $offset ) {
|
|
$conds[] = 'notification_timestamp <= ' . $this->dbr->addQuotes( $this->dbr->timestamp( $timestamp ) );
|
|
$conds[] = 'notification_event < ' . intval( $offset );
|
|
}
|
|
|
|
$res = $this->dbr->select(
|
|
array( 'echo_notification', 'echo_event' ),
|
|
'*',
|
|
$conds,
|
|
__METHOD__,
|
|
array(
|
|
// Todo: check if key ( user, timestamp ) is sufficient, if not,
|
|
// we need to replace it with ( user, timestamp, event )
|
|
'ORDER BY' => 'notification_timestamp DESC, notification_event DESC',
|
|
'LIMIT' => $limit,
|
|
),
|
|
array(
|
|
'echo_event' => array( 'LEFT JOIN', 'notification_event=event_id' ),
|
|
)
|
|
);
|
|
|
|
return iterator_to_array( $res, false );
|
|
}
|
|
|
|
/**
|
|
* @param $row array
|
|
* @return int
|
|
*/
|
|
public function createEvent( $row ) {
|
|
$id = $this->dbw->nextSequenceValue( 'echo_event_id' );
|
|
|
|
$row['event_timestamp'] = $this->dbw->timestamp( $row['event_timestamp'] );
|
|
|
|
$this->dbw->insert( 'echo_event', $row, __METHOD__ );
|
|
|
|
if ( !$id ) {
|
|
$id = $this->dbw->insertId();
|
|
}
|
|
|
|
return $id;
|
|
}
|
|
|
|
/**
|
|
* @param $id int
|
|
* @param $fromMaster bool
|
|
* @return ResultWrapper
|
|
* @throws MWException
|
|
*/
|
|
public function loadEvent( $id, $fromMaster = false ) {
|
|
$db = $fromMaster ? $this->dbw : $this->dbr;
|
|
|
|
$row = $db->selectRow( 'echo_event', '*', array( 'event_id' => $id ), __METHOD__ );
|
|
|
|
if ( !$row && !$fromMaster ) {
|
|
return $this->loadEvent( $id, true );
|
|
} elseif ( !$row ) {
|
|
throw new MWException( "No EchoEvent found with ID: $id" );
|
|
}
|
|
|
|
return $row;
|
|
}
|
|
|
|
/**
|
|
* @param $event EchoEvent
|
|
*/
|
|
public function updateEventExtra( $event ) {
|
|
$this->dbw->update(
|
|
'echo_event',
|
|
array( 'event_extra' => $event->serializeExtra() ),
|
|
array( 'event_id' => $event->getId() ),
|
|
__METHOD__
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @param $conds array
|
|
* @param $rows array
|
|
*/
|
|
public function createSubscription( $conds, $rows ) {
|
|
$this->dbw->begin();
|
|
$this->dbw->delete( 'echo_subscription', $conds, __METHOD__ );
|
|
|
|
if ( count( $rows ) ) {
|
|
$this->dbw->insert( 'echo_subscription', $rows, __METHOD__ );
|
|
}
|
|
|
|
$this->dbw->commit();
|
|
}
|
|
|
|
/**
|
|
* @param $conds array
|
|
* @return ResultWrapper
|
|
*/
|
|
public function loadSubscription( $conds ) {
|
|
$res = $this->dbr->select( 'echo_subscription', '*', $conds, __METHOD__, array( 'order by' => 'sub_user asc' ) );
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* @param $user User
|
|
* @param $eventIDs array
|
|
*/
|
|
public function markRead( $user, $eventIDs ) {
|
|
if ( !$eventIDs ) {
|
|
return;
|
|
}
|
|
$this->dbw->update(
|
|
'echo_notification',
|
|
array( 'notification_read_timestamp' => $this->dbw->timestamp( wfTimestampNow() ) ),
|
|
array(
|
|
'notification_user' => $user->getId(),
|
|
'notification_event' => $eventIDs,
|
|
),
|
|
__METHOD__
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @param $user User object to check notifications for
|
|
* @param $dbSource string use master or slave storage to pull count
|
|
* @return ResultWrapper|bool
|
|
*/
|
|
public function getNotificationCount( $user, $dbSource ) {
|
|
// double check
|
|
if ( !in_array( $dbSource, array( DB_SLAVE, DB_MASTER ) ) ) {
|
|
$dbSource = DB_SLAVE;
|
|
}
|
|
|
|
$eventTypesToLoad = $this->getUserEnabledEvents( $user, 'web' );
|
|
|
|
if ( !$eventTypesToLoad ) {
|
|
return false;
|
|
}
|
|
|
|
$db = wfGetDB( $dbSource );
|
|
$res = $db->selectRow(
|
|
array( 'echo_notification', 'echo_event' ),
|
|
array( 'num' => 'COUNT(notification_event)' ),
|
|
array(
|
|
'notification_user' => $user->getId(),
|
|
'notification_read_timestamp' => null,
|
|
'event_type' => $eventTypesToLoad,
|
|
),
|
|
__METHOD__,
|
|
array(),
|
|
array(
|
|
'echo_event' => array( 'LEFT JOIN', 'notification_event=event_id' ),
|
|
)
|
|
);
|
|
|
|
return $res;
|
|
}
|
|
|
|
}
|