mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Echo
synced 2024-11-14 19:28:31 +00:00
25e32f1b3e
EchoNotificationDeleteJob now only processes one user at a time. If given multiple user ids, it will queue individual jobs for each user id rather than processing many at once. Bug: T102574 Change-Id: I627f059280d8fab3854d9ca8417f22179478772c
70 lines
2 KiB
PHP
70 lines
2 KiB
PHP
<?php
|
|
|
|
/**
|
|
* This job is created when sending notifications to the target users. The purpose
|
|
* of this job is to delete older notifications when the number of notifications a
|
|
* user has is more than $wgEchoMaxUpdateCount, it does not make sense to have tons
|
|
* of notifications in the history while users wouldn't bother to click 'load more'
|
|
* like 100 times to see them. What we gain from this is we could run expensive
|
|
* queries otherwise that would requires adding index and data denormalization.
|
|
*
|
|
* The initial job contains multiple users, which will in turn have individual jobs
|
|
* queued for them.
|
|
*/
|
|
class EchoNotificationDeleteJob extends Job {
|
|
|
|
/**
|
|
* UserIds to be processed
|
|
* @var int[]
|
|
*/
|
|
protected $userIds = array();
|
|
|
|
/**
|
|
* @param Title $title
|
|
* @param array $params
|
|
*/
|
|
public function __construct( $title, $params ) {
|
|
parent::__construct( __CLASS__, $title, $params );
|
|
$this->userIds = $params['userIds'];
|
|
}
|
|
|
|
/**
|
|
* Run the job of finding & deleting older notifications
|
|
*/
|
|
public function run() {
|
|
global $wgEchoMaxUpdateCount;
|
|
if ( count( $this->userIds ) > 1 ) {
|
|
// If there are multiple users, queue a single job for each one
|
|
$jobs = array();
|
|
foreach ( $this->userIds as $userId ) {
|
|
$jobs[] = new EchoNotificationDeleteJob( $this->title, array( 'userIds' => array( $userId ) ) );
|
|
}
|
|
JobQueueGroup::singleton()->push( $jobs );
|
|
return true;
|
|
}
|
|
|
|
$notifMapper = new EchoNotificationMapper();
|
|
$targetMapper = new EchoTargetPageMapper();
|
|
|
|
$userId = $this->userIds[0];
|
|
$user = User::newFromId( $userId );
|
|
$notif = $notifMapper->fetchByUserOffset( $user, $wgEchoMaxUpdateCount );
|
|
if ( $notif ) {
|
|
$res = $notifMapper->deleteByUserEventOffset(
|
|
$user, $notif->getEvent()->getId()
|
|
);
|
|
if ( $res ) {
|
|
$res = $targetMapper->deleteByUserEventOffset(
|
|
$user, $notif->getEvent()->getId()
|
|
);
|
|
}
|
|
if ( $res ) {
|
|
$notifUser = MWEchoNotifUser::newFromUser( $user );
|
|
$notifUser->resetNotificationCount( DB_MASTER );
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
}
|