Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
0.00% |
0 / 31 |
|
0.00% |
0 / 6 |
CRAP | |
0.00% |
0 / 1 |
| LqtRedirector | |
0.00% |
0 / 31 |
|
0.00% |
0 / 6 |
110 | |
0.00% |
0 / 1 |
| __construct | |
0.00% |
0 / 3 |
|
0.00% |
0 / 1 |
2 | |||
| afterHeaderImported | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
| afterPostImported | |
0.00% |
0 / 6 |
|
0.00% |
0 / 1 |
6 | |||
| afterTopicImported | |
0.00% |
0 / 9 |
|
0.00% |
0 / 1 |
12 | |||
| importAborted | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
| doRedirect | |
0.00% |
0 / 11 |
|
0.00% |
0 / 1 |
6 | |||
| 1 | <?php |
| 2 | |
| 3 | namespace Flow\Import\Postprocessor; |
| 4 | |
| 5 | use Flow\Import\IImportHeader; |
| 6 | use Flow\Import\IImportPost; |
| 7 | use Flow\Import\IImportTopic; |
| 8 | use Flow\Import\LiquidThreadsApi\ImportPost; |
| 9 | use Flow\Import\LiquidThreadsApi\ImportTopic; |
| 10 | use Flow\Import\PageImportState; |
| 11 | use Flow\Import\TopicImportState; |
| 12 | use Flow\Model\PostRevision; |
| 13 | use Flow\Model\UUID; |
| 14 | use Flow\UrlGenerator; |
| 15 | use MediaWiki\Content\WikitextContent; |
| 16 | use MediaWiki\MediaWikiServices; |
| 17 | use MediaWiki\Title\Title; |
| 18 | use MediaWiki\User\User; |
| 19 | |
| 20 | class 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 | } |