Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 37
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
ArticleChangedJob
0.00% covered (danger)
0.00%
0 / 37
0.00% covered (danger)
0.00%
0 / 4
72
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 newSpec
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 run
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
30
 notify
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace MediaWiki\Extension\Wikistories\Jobs;
4
5use ExtensionRegistry;
6use IJobSpecification;
7use Job;
8use JobSpecification;
9use MediaWiki\Config\Config;
10use MediaWiki\Extension\Wikistories\Hooks\EchoNotificationsHandlers;
11use MediaWiki\Extension\Wikistories\PageLinksSearch;
12use MediaWiki\Extension\Wikistories\StoryContent;
13use MediaWiki\Extension\Wikistories\StoryContentAnalyzer;
14use MediaWiki\Page\WikiPageFactory;
15use MediaWiki\Revision\RevisionLookup;
16use MediaWiki\Title\Title;
17use MediaWiki\User\UserIdentity;
18
19class ArticleChangedJob extends Job {
20
21    private const COMMAND = 'ArticleChangedJob';
22
23    /** @var StoryContentAnalyzer */
24    private $analyzer;
25
26    /** @var RevisionLookup */
27    private $revisionLookup;
28
29    /** @var WikiPageFactory */
30    private $wikiPageFactory;
31
32    /** @var PageLinksSearch */
33    private $pageLinksSearch;
34
35    /** @var Config */
36    private $config;
37
38    /**
39     * @param string $command
40     * @param array $params
41     * @param RevisionLookup $revisionLookup
42     * @param StoryContentAnalyzer $analyzer
43     * @param WikiPageFactory $wikiPageFactory
44     * @param PageLinksSearch $pageLinksSearch
45     * @param Config $config
46     */
47    public function __construct(
48        $command,
49        $params,
50        RevisionLookup $revisionLookup,
51        StoryContentAnalyzer $analyzer,
52        WikiPageFactory $wikiPageFactory,
53        PageLinksSearch $pageLinksSearch,
54        Config $config
55    ) {
56        parent::__construct( self::COMMAND, $params );
57        // Delay to let multiple edits be deduplicated
58        $params[ 'jobReleaseTimestamp' ] = time() + 60;
59        $this->analyzer = $analyzer;
60        $this->revisionLookup = $revisionLookup;
61        $this->wikiPageFactory = $wikiPageFactory;
62        $this->pageLinksSearch = $pageLinksSearch;
63        $this->config = $config;
64    }
65
66    /**
67     * @param int $pageId
68     * @return IJobSpecification
69     */
70    public static function newSpec( int $pageId ): IJobSpecification {
71        return new JobSpecification(
72            self::COMMAND,
73            [ 'article_id' => $pageId ],
74            [ 'removeDuplicates' => true ]
75        );
76    }
77
78    /**
79     * Run the job
80     *
81     * @return bool Success
82     */
83    public function run() {
84        $notify = ExtensionRegistry::getInstance()->isLoaded( 'Echo' ) &&
85            $this->config->get( 'WikistoriesNotifyAboutStoryMaintenance' );
86        $articleId = $this->params[ 'article_id' ];
87        $rev = $this->revisionLookup->getRevisionByPageId( $articleId );
88        $agent = $rev->getUser();
89        $articleTitle = $rev->getPage()->getDBkey();
90        $pageIds = $this->pageLinksSearch->getPageLinks( $articleTitle, 99 );
91        foreach ( $pageIds as $pageId ) {
92            $page = $this->wikiPageFactory->newFromID( $pageId );
93            /** @var StoryContent $story */
94            $story = $page->getContent();
95            '@phan-var StoryContent $story';
96            if ( $notify && $this->analyzer->hasOutdatedText( $story ) ) {
97                $this->notify( $agent, $page->getTitle(), $articleTitle, $rev->getId() );
98            }
99            $page->doPurge();
100        }
101        return true;
102    }
103
104    /**
105     * @param UserIdentity $agent
106     * @param Title $storyTitle
107     * @param string $articleTitle
108     * @param int $revId
109     */
110    private function notify( UserIdentity $agent, Title $storyTitle, string $articleTitle, int $revId ) {
111        \EchoEvent::create( [
112            'type' => EchoNotificationsHandlers::NOTIFICATION_TYPE,
113            'agent' => $agent,
114            'title' => $storyTitle,
115            'extra' => [
116                'articleTitle' => $articleTitle,
117                'articleRevId' => $revId,
118                'notifyAgent' => true,
119            ],
120        ] );
121    }
122}