Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
SpecialGoToComment
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 2
132
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 getRedirect
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
110
1<?php
2
3namespace MediaWiki\Extension\DiscussionTools;
4
5use RedirectSpecialPage;
6use SpecialPage;
7use Title;
8
9class SpecialGoToComment extends RedirectSpecialPage {
10
11    private ThreadItemStore $threadItemStore;
12
13    public function __construct(
14        ThreadItemStore $threadItemStore
15    ) {
16        parent::__construct( 'GoToComment' );
17        $this->threadItemStore = $threadItemStore;
18    }
19
20    /**
21     * @inheritDoc
22     */
23    public function getRedirect( $subpage ) {
24        $results = [];
25
26        // Search for all thread items with the given ID or name, returning results from the latest
27        // revision of each page they appeared on.
28        //
29        // If there is exactly one result which is not transcluded from another page and in the current
30        // revision of its page, redirect to it.
31        //
32        // Otherwise, redirect to full search results on Special:FindComment.
33
34        if ( $subpage ) {
35            $threadItems = $this->threadItemStore->findNewestRevisionsById( $subpage );
36            foreach ( $threadItems as $item ) {
37                if ( $item->getRevision()->isCurrent() && !is_string( $item->getTranscludedFrom() ) ) {
38                    $results[] = $item;
39                }
40            }
41            $threadItems = $this->threadItemStore->findNewestRevisionsByName( $subpage );
42            foreach ( $threadItems as $item ) {
43                if ( $item->getRevision()->isCurrent() && !is_string( $item->getTranscludedFrom() ) ) {
44                    $results[] = $item;
45                }
46            }
47        }
48
49        if ( count( $results ) === 1 ) {
50            return Title::castFromPageIdentity( $results[0]->getPage() )->createFragmentTarget( $results[0]->getId() );
51        } else {
52            return SpecialPage::getTitleFor( 'FindComment', $subpage ?: false );
53        }
54    }
55}