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 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
LqtRedirector
0.00% covered (danger)
0.00%
0 / 31
0.00% covered (danger)
0.00%
0 / 6
110
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 afterHeaderImported
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 afterPostImported
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
 afterTopicImported
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
12
 importAborted
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 doRedirect
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace Flow\Import\Postprocessor;
4
5use Flow\Import\IImportHeader;
6use Flow\Import\IImportPost;
7use Flow\Import\IImportTopic;
8use Flow\Import\LiquidThreadsApi\ImportPost;
9use Flow\Import\LiquidThreadsApi\ImportTopic;
10use Flow\Import\PageImportState;
11use Flow\Import\TopicImportState;
12use Flow\Model\PostRevision;
13use Flow\Model\UUID;
14use Flow\UrlGenerator;
15use MediaWiki\MediaWikiServices;
16use MediaWiki\Title\Title;
17use MediaWiki\User\User;
18use WikitextContent;
19
20class LqtRedirector implements Postprocessor {
21    /** @var UrlGenerator */
22    protected $urlGenerator;
23    /**
24     * @var array[]
25     * @phan-var non-empty-array[]
26     */
27    protected $redirectsToDo;
28    /** @var User */
29    protected $user;
30
31    public function __construct( UrlGenerator $urlGenerator, User $user ) {
32        $this->urlGenerator = $urlGenerator;
33        $this->redirectsToDo = [];
34        $this->user = $user;
35    }
36
37    public function afterHeaderImported( PageImportState $state, IImportHeader $header ) {
38        // not a thing to do, yet
39    }
40
41    public function afterPostImported( TopicImportState $state, IImportPost $post, PostRevision $newPost ) {
42        if ( $post instanceof ImportPost /* LQT */ ) {
43            $this->redirectsToDo[] = [
44                $post->getTitle(),
45                $state->topicWorkflow->getId(),
46                $newPost->getPostId()
47            ];
48        }
49    }
50
51    public function afterTopicImported( TopicImportState $state, IImportTopic $topic ) {
52        if ( !$topic instanceof ImportTopic /* LQT */ ) {
53            return;
54        }
55        $this->doRedirect(
56            $topic->getTitle(),
57            $state->topicWorkflow->getId()
58        );
59        foreach ( $this->redirectsToDo as $args ) {
60            // @phan-suppress-next-line PhanParamTooFewUnpack
61            $this->doRedirect( ...$args );
62        }
63
64        $this->redirectsToDo = [];
65    }
66
67    public function importAborted() {
68        $this->redirectsToDo = [];
69    }
70
71    protected function doRedirect( Title $fromTitle, UUID $toTopic, UUID $toPost = null ) {
72        if ( $toPost ) {
73            $redirectAnchor = $this->urlGenerator->postLink( null, $toTopic, $toPost );
74        } else {
75            $redirectAnchor = $this->urlGenerator->topicLink( null, $toTopic );
76        }
77
78        $redirectTarget = $redirectAnchor->resolveTitle();
79
80        $newContent = new WikitextContent( "#REDIRECT [[" . $redirectTarget->getFullText() . "]]" );
81        $page = MediaWikiServices::getInstance()->getWikiPageFactory()->newFromTitle( $fromTitle );
82        $summary = wfMessage( 'flow-lqt-redirect-reason' )->plain();
83        $page->doUserEditContent( $newContent, $this->user, $summary, EDIT_FORCE_BOT );
84
85        MediaWikiServices::getInstance()->getWatchedItemStore()->duplicateAllAssociatedEntries(
86            $fromTitle, $redirectTarget
87        );
88    }
89}