EventDispatcher: Generate dt-added-topic events

Change-Id: I98b67e016995866558274809743fa21ed23ee063
This commit is contained in:
Ed Sanders 2023-01-31 15:50:34 +00:00
parent fd519ff015
commit 4367595bfd
7 changed files with 115 additions and 1 deletions

View file

@ -6,6 +6,7 @@ use Config;
use LogicException;
use MediaWiki\Extension\DiscussionTools\ThreadItem\ContentCommentItem;
use MediaWiki\Extension\DiscussionTools\ThreadItem\ContentThreadItem;
use Title;
use Wikimedia\Assert\Assert;
use Wikimedia\Parsoid\DOM\Comment;
use Wikimedia\Parsoid\DOM\Element;
@ -761,4 +762,14 @@ class CommentUtils {
return false;
}
/**
* Get the ID for a new topics subscription from a page title
*
* @param Title $title Page title
* @return string ID for a new topics subscription
*/
public static function getNewTopicsSubscriptionId( Title $title ) {
return "p-topics-{$title->getNamespace()}:{$title->getDBkey()}";
}
}

View file

@ -92,6 +92,7 @@ class EchoHooks {
case 'dt-subscribed-new-comment':
$bundleString = $event->getType() . '-' . $event->getExtraParam( 'subscribed-comment-name' );
break;
case 'dt-added-topic':
case 'dt-removed-topic':
$bundleString = $event->getType() . '-' . $event->getTitle()->getNamespace()
. '-' . $event->getTitle()->getDBkey();

View file

@ -17,6 +17,7 @@ use EchoEvent;
use ExtensionRegistry;
use IDBAccessObject;
use Iterator;
use MediaWiki\Extension\DiscussionTools\CommentUtils;
use MediaWiki\Extension\DiscussionTools\ContentThreadItemSet;
use MediaWiki\Extension\DiscussionTools\Hooks\HookUtils;
use MediaWiki\Extension\DiscussionTools\SubscriptionItem;
@ -226,6 +227,13 @@ class EventDispatcher {
$newHeadings = static::groupSubscribableHeadings( $newItemSet->getThreads() );
$oldHeadings = static::groupSubscribableHeadings( $oldItemSet->getThreads() );
$addedHeadings = [];
foreach ( static::findAddedItems( $oldHeadings, $newHeadings ) as $newHeading ) {
Assert::precondition( $newHeading instanceof ContentHeadingItem, 'Must be ContentHeadingItem' );
$addedHeadings[] = $newHeading;
}
$removedHeadings = [];
// Pass swapped parameters to findAddedItems() to find *removed* items
foreach ( static::findAddedItems( $newHeadings, $oldHeadings ) as $oldHeading ) {
@ -293,6 +301,10 @@ class EventDispatcher {
continue;
}
$events[] = [
// This probably should've been called "dt-new-comment": this code is
// unaware if there are any subscriptions to the containing topic and
// an event is generated for every comment posted.
// However, changing this would require a complex migration.
'type' => 'dt-subscribed-new-comment',
'title' => $title,
'extra' => [
@ -325,6 +337,35 @@ class EventDispatcher {
'agent' => $user,
];
}
$titleObj = Title::castFromPageIdentity( $title );
if ( $titleObj ) {
foreach ( $addedHeadings as $newHeading ) {
// Don't use $event here as that already exists as a reference from above
$addTopicEvent = [
'type' => 'dt-added-topic',
'title' => $title,
'extra' => [
// As no one can be subscribed to a topic before it has been created,
// we will notify users who have subscribed to the whole page.
'subscribed-comment-name' => CommentUtils::getNewTopicsSubscriptionId( $titleObj ),
'heading-id' => $newHeading->getId(),
'heading-name' => $newHeading->getName(),
'section-title' => $newHeading->getLinkableTitle(),
'revid' => $newRevRecord->getId(),
],
'agent' => $user,
];
// Add metadata about the accompanying comment
$firstComment = $newHeading->getOldestReply();
if ( $firstComment ) {
$addTopicEvent['extra']['comment-id'] = $firstComment->getId();
$addTopicEvent['extra']['comment-name'] = $firstComment->getName();
$addTopicEvent['extra']['content'] = $firstComment->getBodyText( true );
}
$events[] = $addTopicEvent;
}
}
}
/**

View file

@ -12,5 +12,20 @@
"mentioned-users": []
},
"agent": {}
},
{
"type": "dt-added-topic",
"title": {},
"extra": {
"subscribed-comment-name": "p-topics-1:MediaWiki\\Extension\\DiscussionTools\\Tests\\EventDispatcherTest",
"heading-id": "h-C-2020-01-01T00:02:00.000Z",
"heading-name": "h-Y-2020-01-01T00:02:00.000Z",
"section-title": "C",
"revid": null,
"comment-id": "c-Y-2020-01-01T00:02:00.000Z-C",
"comment-name": "c-Y-2020-01-01T00:02:00.000Z",
"content": "D."
},
"agent": {}
}
]

View file

@ -12,5 +12,20 @@
"mentioned-users": []
},
"agent": {}
},
{
"type": "dt-added-topic",
"title": {},
"extra": {
"subscribed-comment-name": "p-topics-1:MediaWiki\\Extension\\DiscussionTools\\Tests\\EventDispatcherTest",
"heading-id": "h-E-2020-01-01T00:03:00.000Z",
"heading-name": "h-Z-2020-01-01T00:03:00.000Z",
"section-title": "E",
"revid": null,
"comment-id": "c-Z-2020-01-01T00:03:00.000Z-E",
"comment-name": "c-Z-2020-01-01T00:03:00.000Z",
"content": "F."
},
"agent": {}
}
]

View file

@ -1 +1,17 @@
[]
[
{
"type": "dt-added-topic",
"title": {},
"extra": {
"subscribed-comment-name": "p-topics-1:MediaWiki\\Extension\\DiscussionTools\\Tests\\EventDispatcherTest",
"heading-id": "h-E-2020-01-01T00:03:00.000Z",
"heading-name": "h-X-2020-01-01T00:03:00.000Z",
"section-title": "E",
"revid": null,
"comment-id": "c-X-2020-01-01T00:03:00.000Z-E",
"comment-name": "c-X-2020-01-01T00:03:00.000Z",
"content": "F."
},
"agent": {}
}
]

View file

@ -12,5 +12,20 @@
"mentioned-users": []
},
"agent": {}
},
{
"type": "dt-added-topic",
"title": {},
"extra": {
"subscribed-comment-name": "p-topics-1:MediaWiki\\Extension\\DiscussionTools\\Tests\\EventDispatcherTest",
"heading-id": "h-D-A-2020-01-01T00:03:00.000Z",
"heading-name": "h-Z-2020-01-01T00:03:00.000Z",
"section-title": "D",
"revid": null,
"comment-id": "c-Z-2020-01-01T00:03:00.000Z-D",
"comment-name": "c-Z-2020-01-01T00:03:00.000Z",
"content": "E."
},
"agent": {}
}
]