Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 37 |
|
0.00% |
0 / 4 |
CRAP | |
0.00% |
0 / 1 |
ArticleChangedJob | |
0.00% |
0 / 37 |
|
0.00% |
0 / 4 |
72 | |
0.00% |
0 / 1 |
__construct | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
2 | |||
newSpec | |
0.00% |
0 / 5 |
|
0.00% |
0 / 1 |
2 | |||
run | |
0.00% |
0 / 15 |
|
0.00% |
0 / 1 |
30 | |||
notify | |
0.00% |
0 / 10 |
|
0.00% |
0 / 1 |
2 |
1 | <?php |
2 | |
3 | namespace MediaWiki\Extension\Wikistories\Jobs; |
4 | |
5 | use ExtensionRegistry; |
6 | use IJobSpecification; |
7 | use Job; |
8 | use JobSpecification; |
9 | use MediaWiki\Config\Config; |
10 | use MediaWiki\Extension\Wikistories\Hooks\EchoNotificationsHandlers; |
11 | use MediaWiki\Extension\Wikistories\PageLinksSearch; |
12 | use MediaWiki\Extension\Wikistories\StoryContent; |
13 | use MediaWiki\Extension\Wikistories\StoryContentAnalyzer; |
14 | use MediaWiki\Page\WikiPageFactory; |
15 | use MediaWiki\Revision\RevisionLookup; |
16 | use MediaWiki\Title\Title; |
17 | use MediaWiki\User\UserIdentity; |
18 | |
19 | class 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 | } |