Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 31
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
DeferredMarkAsDeletedUpdate
0.00% covered (danger)
0.00%
0 / 31
0.00% covered (danger)
0.00%
0 / 4
56
0.00% covered (danger)
0.00%
0 / 1
 add
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
 addInternal
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 filterEventsWithTitleDbLag
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
12
 doUpdate
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace MediaWiki\Extension\Notifications;
4
5use MediaWiki\Deferred\DeferrableUpdate;
6use MediaWiki\Deferred\DeferredUpdates;
7use MediaWiki\Extension\Notifications\Controller\ModerationController;
8use MediaWiki\Extension\Notifications\Model\Event;
9use 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 */
15class 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}