Suppress events from comments that are more than 10 minutes old

Bug: T290803
Change-Id: Ic0e23f439eef8a1b785f408d4557bec0abe9104b
This commit is contained in:
Ed Sanders 2021-11-08 18:00:25 +00:00
parent a86d308d66
commit 0fba9b0048
2 changed files with 30 additions and 0 deletions

View file

@ -10,6 +10,8 @@
namespace MediaWiki\Extension\DiscussionTools\Notifications;
use ChangeTags;
use DateInterval;
use DateTimeImmutable;
use DeferredUpdates;
use EchoEvent;
use Error;
@ -239,6 +241,13 @@ class EventDispatcher {
if ( $newComment->getAuthor() !== $user->getName() ) {
continue;
}
// Ignore comments which are more than 10 minutes old, as this may be a user archiving
// their own comment. (T290803)
$revTimestamp = new DateTimeImmutable( $newRevRecord->getTimestamp() );
$threshold = $revTimestamp->sub( new DateInterval( 'PT10M' ) );
if ( $newComment->getTimestamp() <= $threshold ) {
continue;
}
$heading = $newComment->getSubscribableHeading();
if ( !$heading ) {
continue;

View file

@ -2,6 +2,7 @@
namespace MediaWiki\Extension\DiscussionTools\Tests;
use DateTimeImmutable;
use MediaWiki\Page\PageIdentityValue;
use MediaWiki\Revision\MutableRevisionRecord;
use MediaWiki\User\UserIdentityValue;
@ -45,6 +46,8 @@ class EventDispatcherTest extends IntegrationTestCase {
$fakeUser = new UserIdentityValue( 0, $authorUsername );
$fakeTitle = new PageIdentityValue( 0, NS_TALK, __CLASS__, PageIdentityValue::LOCAL );
$fakeRevRecord = new MutableRevisionRecord( $fakeTitle );
// All mock comments are posted between 00:00 and 00:10 on 2020-01-01
$fakeRevRecord->setTimestamp( ( new DateTimeImmutable( '2020-01-01T00:10' ) )->format( 'c' ) );
MockEventDispatcher::generateEventsFromParsers(
$events, $parser1, $parser2, $fakeRevRecord, $fakeTitle, $fakeUser
);
@ -59,6 +62,24 @@ class EventDispatcherTest extends IntegrationTestCase {
}
self::assertEquals( $expectedEvents, $events );
// Assert that no events are generated for comments saved >10 minutes after their timestamps
$events = self::getJson( $other, true );
$fakeRevRecord->setTimestamp( ( new DateTimeImmutable( '2020-01-01T00:20' ) )->format( 'c' ) );
MockEventDispatcher::generateEventsFromParsers(
$events, $parser1, $parser2, $fakeRevRecord, $fakeTitle, $fakeUser
);
foreach ( $events as &$event ) {
$event = json_decode( json_encode( $event ), false );
}
// Other events (e.g. from Echo) are never removed
$events = array_filter( $events, static function ( $event ) {
return $event->type === 'dt-subscribed-new-comment';
} );
self::assertEquals( [], $events );
}
public function provideGenerateCases(): array {