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