From b3a5c7c0d59357c9a10de931bb5873fbf0bc44d1 Mon Sep 17 00:00:00 2001 From: Clara Andrew-Wani Date: Fri, 15 May 2020 12:35:45 -0400 Subject: [PATCH] Use new TalkPageNotificationManager Bug: T239640 Change-Id: I7c06d145854ab39faaef528e169f6b51de1c8d99 --- includes/Storage/DerivedPageDataUpdater.php | 6 +++-- includes/api/ApiQueryUserInfo.php | 3 ++- includes/cache/HTMLFileCache.php | 4 +++- includes/page/WikiPage.php | 4 +++- includes/user/User.php | 23 +++++++++++-------- .../includes/api/ApiClearHasMsgTest.php | 10 +++++--- 6 files changed, 33 insertions(+), 17 deletions(-) diff --git a/includes/Storage/DerivedPageDataUpdater.php b/includes/Storage/DerivedPageDataUpdater.php index 3aa904f1c6f..b099c7fed7c 100644 --- a/includes/Storage/DerivedPageDataUpdater.php +++ b/includes/Storage/DerivedPageDataUpdater.php @@ -1550,11 +1550,13 @@ class DerivedPageDataUpdater implements IDBAccessObject, LoggerAwareInterface { // TODO: replace legacy hook! Use a listener on PageEventEmitter instead! if ( Hooks::run( 'ArticleEditUpdateNewTalk', [ &$wikiPage, $recipient ] ) ) { $revRecord = $legacyRevision->getRevisionRecord(); + $talkPageNotificationManager = MediaWikiServices::getInstance() + ->getTalkPageNotificationManager(); if ( User::isIP( $shortTitle ) ) { // An anonymous user - $recipient->setNewtalk( true, $revRecord ); + $talkPageNotificationManager->setUserHasNewMessages( $recipient, $revRecord ); } elseif ( $recipient->isLoggedIn() ) { - $recipient->setNewtalk( true, $revRecord ); + $talkPageNotificationManager->setUserHasNewMessages( $recipient, $revRecord ); } else { wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" ); } diff --git a/includes/api/ApiQueryUserInfo.php b/includes/api/ApiQueryUserInfo.php index efc43fdeb01..5b1a8a7c393 100644 --- a/includes/api/ApiQueryUserInfo.php +++ b/includes/api/ApiQueryUserInfo.php @@ -111,7 +111,8 @@ class ApiQueryUserInfo extends ApiQueryBase { } if ( isset( $this->prop['hasmsg'] ) ) { - $vals['messages'] = $user->getNewtalk(); + $vals['messages'] = MediaWikiServices::getInstance() + ->getTalkPageNotificationManager()->userHasNewMessages( $user ); } if ( isset( $this->prop['groups'] ) ) { diff --git a/includes/cache/HTMLFileCache.php b/includes/cache/HTMLFileCache.php index 28f062d6619..3ae28621127 100644 --- a/includes/cache/HTMLFileCache.php +++ b/includes/cache/HTMLFileCache.php @@ -124,7 +124,9 @@ class HTMLFileCache extends FileCacheBase { return false; } - if ( ( $mode === self::MODE_NORMAL ) && $user->getNewtalk() ) { + $userHasNewMessages = MediaWikiServices::getInstance() + ->getTalkPageNotificationManager()->userHasNewMessages( $user ); + if ( ( $mode === self::MODE_NORMAL ) && $userHasNewMessages ) { return false; } diff --git a/includes/page/WikiPage.php b/includes/page/WikiPage.php index 44cf9866598..f1ffe54df5b 100644 --- a/includes/page/WikiPage.php +++ b/includes/page/WikiPage.php @@ -3544,7 +3544,9 @@ class WikiPage implements Page, IDBAccessObject { if ( $title->getNamespace() == NS_USER_TALK ) { $user = User::newFromName( $title->getText(), false ); if ( $user ) { - $user->setNewtalk( false ); + MediaWikiServices::getInstance() + ->getTalkPageNotificationManager() + ->removeUserHasNewMessages( $user ); } } diff --git a/includes/user/User.php b/includes/user/User.php index d21e9e8268b..b8ddfead830 100644 --- a/includes/user/User.php +++ b/includes/user/User.php @@ -2265,17 +2265,18 @@ class User implements IDBAccessObject, UserIdentity { return $talks; } - if ( !$this->getNewtalk() ) { + $services = MediaWikiServices::getInstance(); + $userHasNewMessages = $services->getTalkPageNotificationManager() + ->userHasNewMessages( $this ); + if ( !$userHasNewMessages ) { return []; } $utp = $this->getTalkPage(); - $timestamp = MediaWikiServices::getInstance() - ->getTalkPageNotificationManager() + $timestamp = $services->getTalkPageNotificationManager() ->getLatestSeenMessageTimestamp( $this ); $rev = null; if ( $timestamp ) { - $revRecord = MediaWikiServices::getInstance() - ->getRevisionLookup() + $revRecord = $services->getRevisionLookup() ->getRevisionByTimestamp( $utp, $timestamp ); if ( $revRecord ) { $rev = new Revision( $revRecord ); @@ -3451,12 +3452,14 @@ class User implements IDBAccessObject, UserIdentity { // Try to update the DB post-send and only if needed... DeferredUpdates::addCallableUpdate( function () use ( $oldid ) { - if ( !$this->getNewtalk() ) { + $talkPageNotificationManager = MediaWikiServices::getInstance() + ->getTalkPageNotificationManager(); + if ( !$talkPageNotificationManager->userHasNewMessages( $this ) ) { return; // no notifications to clear } // Delete the last notifications (they stack up) - $this->setNewtalk( false ); + $talkPageNotificationManager->removeUserHasNewMessages( $this ); // If there is a new, unseen, revision, use its timestamp if ( $oldid ) { @@ -3465,7 +3468,7 @@ class User implements IDBAccessObject, UserIdentity { if ( $oldRev ) { $newRev = $rl->getNextRevision( $oldRev ); if ( $newRev ) { - $this->setNewtalk( true, $newRev ); + $talkPageNotificationManager->setUserHasNewMessages( $this, $newRev ); } } } @@ -3508,7 +3511,9 @@ class User implements IDBAccessObject, UserIdentity { } if ( !$wgUseEnotif && !$wgShowUpdatedMarker ) { - $this->setNewtalk( false ); + MediaWikiServices::getInstance() + ->getTalkPageNotificationManager() + ->removeUserHasNewMessages( $this ); return; } diff --git a/tests/phpunit/includes/api/ApiClearHasMsgTest.php b/tests/phpunit/includes/api/ApiClearHasMsgTest.php index 5b124074dc7..f63fa0afdac 100644 --- a/tests/phpunit/includes/api/ApiClearHasMsgTest.php +++ b/tests/phpunit/includes/api/ApiClearHasMsgTest.php @@ -1,5 +1,7 @@ getUser(); - $user->setNewtalk( true ); - $this->assertTrue( $user->getNewtalk(), 'sanity check' ); + $talkPageNotificationManager = MediaWikiServices::getInstance() + ->getTalkPageNotificationManager(); + $talkPageNotificationManager->setUserHasNewMessages( $user ); + $this->assertTrue( $talkPageNotificationManager->userHasNewMessages( $user ), 'sanity check' ); $data = $this->doApiRequest( [ 'action' => 'clearhasmsg' ], [] ); $this->assertEquals( 'success', $data[0]['clearhasmsg'] ); - $this->assertFalse( $user->getNewtalk() ); + $this->assertFalse( $talkPageNotificationManager->userHasNewMessages( $user ) ); } }