Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
69.70% covered (warning)
69.70%
23 / 33
20.00% covered (danger)
20.00%
1 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
PageRerenderSerializer
69.70% covered (warning)
69.70%
23 / 33
20.00% covered (danger)
20.00%
1 / 5
5.70
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 eventDataForPage
100.00% covered (success)
100.00%
23 / 23
100.00% covered (success)
100.00%
1 / 1
1
 getCirrusConnection
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 getDomain
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getCanonicalPageURL
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace CirrusSearch\Event;
4
5use CirrusSearch\Connection;
6use CirrusSearch\SearchConfig;
7use MediaWiki\Config\Config;
8use MediaWiki\MainConfigNames;
9use MediaWiki\Page\PageRecord;
10use MediaWiki\Page\PageReference;
11use MediaWiki\Title\TitleFormatter;
12use Wikimedia\Assert\Assert;
13use Wikimedia\UUID\GlobalIdGenerator;
14
15class PageRerenderSerializer {
16    public const STREAM = 'mediawiki.cirrussearch.page_rerender.v1';
17    public const SCHEMA = '/mediawiki/cirrussearch/page_rerender/1.0.0';
18    public const LINKS_UPDATE_REASON = 'links_update';
19    private TitleFormatter $titleFormatter;
20    private SearchConfig $searchConfig;
21    private GlobalIdGenerator $globalIdGenerator;
22    private Config $mainConfig;
23    private Connection $cirrusConnection;
24
25    /**
26     * @param Config $mainConfig
27     * @param TitleFormatter $titleFormatter
28     * @param SearchConfig $searchConfig
29     * @param GlobalIdGenerator $globalIdGenerator
30     */
31    public function __construct(
32        Config $mainConfig,
33        TitleFormatter $titleFormatter,
34        SearchConfig $searchConfig,
35        GlobalIdGenerator $globalIdGenerator
36    ) {
37        $this->titleFormatter = $titleFormatter;
38        $this->searchConfig = $searchConfig;
39        $this->globalIdGenerator = $globalIdGenerator;
40        $this->mainConfig = $mainConfig;
41    }
42
43    public function eventDataForPage( PageRecord $page, string $reason, string $requestId, string $dt = null ): array {
44        Assert::parameter( $page->isRedirect() === false, '$page', 'Redirects are not supported' );
45        $connection = $this->getCirrusConnection();
46        $attrs = [
47            '$schema' => self::SCHEMA,
48            'meta' => [
49                'stream' => self::STREAM,
50                'uid' => $this->globalIdGenerator->newUUIDv4(),
51                'request_id' => $requestId,
52                'domain' => $this->getDomain(),
53                'uri' => $this->getCanonicalPageURL( $page )
54            ],
55            'reason' => $reason,
56            'dt' => $dt ?? wfTimestamp( TS_ISO_8601 ),
57            'wiki_id' => $this->searchConfig->getWikiId(),
58            'cirrussearch_index_name' => $connection->getIndexName( $this->searchConfig->get( SearchConfig::INDEX_BASE_NAME ),
59                        $connection->getIndexSuffixForNamespace( $page->getNamespace() ) ),
60            'cirrussearch_cluster_group' => $this->searchConfig->getClusterAssignment()->getCrossClusterName() ?? "default",
61            'page_id' => $page->getId(),
62            'page_title' => $this->titleFormatter->getPrefixedDBkey( $page ),
63            'namespace_id' => $page->getNamespace(),
64            'is_redirect' => $page->isRedirect()
65        ];
66        return $attrs;
67    }
68
69    private function getCirrusConnection(): Connection {
70        $this->cirrusConnection ??= new Connection( $this->searchConfig );
71        return $this->cirrusConnection;
72    }
73
74    private function getDomain(): string {
75        return $this->mainConfig->get( MainConfigNames::ServerName );
76    }
77
78    private function getCanonicalPageURL( PageReference $wikiPage ): string {
79        $titleURL = wfUrlencode( $this->titleFormatter->getPrefixedDBkey( $wikiPage ) );
80        // The ArticlePath contains '$1' string where the article title should appear.
81        return $this->mainConfig->get( MainConfigNames::CanonicalServer ) .
82               str_replace( '$1', $titleURL, $this->mainConfig->get( MainConfigNames::ArticlePath ) );
83    }
84}