Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 31 |
|
0.00% |
0 / 4 |
CRAP | |
0.00% |
0 / 1 |
DeferredMarkAsDeletedUpdate | |
0.00% |
0 / 31 |
|
0.00% |
0 / 4 |
56 | |
0.00% |
0 / 1 |
add | |
0.00% |
0 / 5 |
|
0.00% |
0 / 1 |
6 | |||
addInternal | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
filterEventsWithTitleDbLag | |
0.00% |
0 / 16 |
|
0.00% |
0 / 1 |
12 | |||
doUpdate | |
0.00% |
0 / 9 |
|
0.00% |
0 / 1 |
2 |
1 | <?php |
2 | |
3 | namespace MediaWiki\Extension\Notifications; |
4 | |
5 | use MediaWiki\Deferred\DeferrableUpdate; |
6 | use MediaWiki\Deferred\DeferredUpdates; |
7 | use MediaWiki\Extension\Notifications\Controller\ModerationController; |
8 | use MediaWiki\Extension\Notifications\Model\Event; |
9 | use MediaWiki\Logger\LoggerFactory; |
10 | |
11 | /** |
12 | * Mark event notifications as deleted at the end of a request. Used to queue up |
13 | * individual events to mark due to formatting failures. |
14 | */ |
15 | class DeferredMarkAsDeletedUpdate implements DeferrableUpdate { |
16 | /** |
17 | * @var Event[] |
18 | */ |
19 | protected $events = []; |
20 | |
21 | /** |
22 | * @param Event $event |
23 | */ |
24 | public static function add( Event $event ) { |
25 | static $update; |
26 | if ( $update === null ) { |
27 | $update = new self(); |
28 | DeferredUpdates::addUpdate( $update ); |
29 | } |
30 | $update->addInternal( $event ); |
31 | } |
32 | |
33 | /** |
34 | * @param Event $event |
35 | */ |
36 | private function addInternal( Event $event ) { |
37 | $this->events[] = $event; |
38 | } |
39 | |
40 | private function filterEventsWithTitleDbLag() { |
41 | return array_filter( |
42 | $this->events, |
43 | static function ( Event $event ) { |
44 | if ( !$event->getTitle() && $event->getTitle( true ) ) { |
45 | // It is very likely this event was found |
46 | // unrenderable because of replica lag. |
47 | // Do not moderate it at this time. |
48 | LoggerFactory::getInstance( 'Echo' )->debug( |
49 | 'DeferredMarkAsDeletedUpdate: Event {eventId} was found unrenderable' . |
50 | ' but its associated title exists on primary database. Skipping.', |
51 | [ |
52 | 'eventId' => $event->getId(), |
53 | 'title' => $event->getTitle()->getPrefixedText(), |
54 | ] |
55 | ); |
56 | return false; |
57 | } |
58 | return true; |
59 | } |
60 | ); |
61 | } |
62 | |
63 | /** |
64 | * Marks all queued notifications as read. |
65 | * Satisfies DeferrableUpdate interface |
66 | */ |
67 | public function doUpdate() { |
68 | $events = $this->filterEventsWithTitleDbLag(); |
69 | |
70 | $eventIds = array_map( |
71 | static function ( Event $event ) { |
72 | return $event->getId(); |
73 | }, |
74 | $events |
75 | ); |
76 | |
77 | ModerationController::moderate( $eventIds, true ); |
78 | $this->events = []; |
79 | } |
80 | } |