Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
71.43% covered (warning)
71.43%
15 / 21
33.33% covered (danger)
33.33%
2 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
EventBusWeightedTagSerializer
71.43% covered (warning)
71.43%
15 / 21
33.33% covered (danger)
33.33%
2 / 6
9.49
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
 getStream
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 toArray
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
2
 toSetEvent
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 toClearEvent
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getWikiId
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace CirrusSearch;
4
5use MediaWiki\Extension\EventBus\Serializers\EventSerializer;
6use MediaWiki\Extension\EventBus\Serializers\MediaWiki\PageEntitySerializer;
7use MediaWiki\Page\ProperPageIdentity;
8use MediaWiki\Page\WikiPage;
9use MediaWiki\WikiMap\WikiMap;
10
11class EventBusWeightedTagSerializer {
12    public const SCHEMA = '/mediawiki/cirrussearch/page_weighted_tags_change/1.0.0';
13    public const STREAM = 'mediawiki.cirrussearch.page_weighted_tags_change.v1';
14
15    private EventSerializer $eventSerializer;
16    private PageEntitySerializer $pageEntitySerializer;
17    private string $stream;
18
19    /**
20     * @param EventSerializer $eventSerializer
21     * @param PageEntitySerializer $pageEntitySerializer
22     * @param string $stream
23     */
24    public function __construct(
25        EventSerializer $eventSerializer,
26        PageEntitySerializer $pageEntitySerializer,
27        string $stream = self::STREAM
28    ) {
29        $this->eventSerializer = $eventSerializer;
30        $this->pageEntitySerializer = $pageEntitySerializer;
31        $this->stream = $stream;
32    }
33
34    /**
35     * @return string
36     */
37    public function getStream(): string {
38        return $this->stream;
39    }
40
41    /**
42     * @param WikiPage $wikiPage page to tag
43     * @param array $weightedTags `weighted_tags` payload, see schema
44     * @param bool|null $revBased `rev_based` flag
45     * @param string|null $dt event timestamp
46     *
47     * @return array encoded event
48     * @see self::SCHEMA
49     */
50    public function toArray( WikiPage $wikiPage, array $weightedTags, ?bool $revBased = null, ?string $dt = null ): array {
51        $uri = $this->pageEntitySerializer->canonicalPageURL( $wikiPage );
52        $page = $this->pageEntitySerializer->toArray( $wikiPage );
53        return $this->eventSerializer->createEvent(
54            self::SCHEMA,
55            $this->stream,
56            $uri,
57            array_merge( $revBased === null ? [] : [ 'rev_based' => $revBased ], [
58                'dt' => EventSerializer::timestampToDt( $dt ),
59                'wiki_id' => self::getWikiId( $wikiPage ),
60                'page' => $page,
61                'weighted_tags' => $weightedTags
62            ] ),
63            self::getWikiId( $wikiPage )
64        );
65    }
66
67    /**
68     * @param WikiPage $wikiPage
69     * @param array[] $set prefix => [ [ 'tag' => string ] | [ 'tag' => string, 'score' => int ] ] map
70     * @param bool|null $revBased `rev_based` flag
71     * @param string|null $dt event timestamp
72     * @return array
73     */
74    public function toSetEvent( WikiPage $wikiPage, array $set, ?bool $revBased = null, ?string $dt = null ): array {
75        return $this->toArray( $wikiPage, [ 'set' => $set ], $revBased, $dt );
76    }
77
78    /**
79     * @param WikiPage $wikiPage
80     * @param string[] $clear prefixes to be cleared
81     * @param bool|null $revBased `rev_based` flag
82     * @param string|null $dt event timestamp
83     * @return array
84     */
85    public function toClearEvent( WikiPage $wikiPage, array $clear, ?bool $revBased = null, ?string $dt = null ): array {
86        return $this->toArray( $wikiPage, [ 'clear' => $clear ], $revBased, $dt );
87    }
88
89    /**
90     * Return the page's wikiId, or if that returns false,
91     * return WikiMap::getCurrentWikiId.
92     *
93     * @param ProperPageIdentity $page
94     * @return string
95     */
96    private static function getWikiId( ProperPageIdentity $page ): string {
97        // Get the wikiId.  page's getWikiId can return false.
98        // Fallback to global WikiMap.
99        return $page->getWikiId() ?: WikiMap::getCurrentWikiId();
100    }
101
102}