Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
33.33% covered (danger)
33.33%
10 / 30
44.44% covered (danger)
44.44%
4 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
LinkRecommendationTaskTypeHandler
33.33% covered (danger)
33.33%
10 / 30
44.44% covered (danger)
44.44%
4 / 9
46.85
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 getId
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getRecommendationProvider
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getSubmissionHandler
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 createTaskType
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
2
 getSearchTerm
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 getChangeTags
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getTaskTypeIdByChangeTagName
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 getSubmitDataFormatMessage
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace GrowthExperiments\NewcomerTasks\TaskType;
4
5use GrowthExperiments\NewcomerTasks\AddLink\AddLinkSubmissionHandler;
6use GrowthExperiments\NewcomerTasks\AddLink\LinkRecommendationProvider;
7use GrowthExperiments\NewcomerTasks\ConfigurationLoader\ConfigurationValidator;
8use GrowthExperiments\NewcomerTasks\RecommendationProvider;
9use GrowthExperiments\NewcomerTasks\SubmissionHandler;
10use InvalidArgumentException;
11use LogicException;
12use MediaWiki\Title\TitleParser;
13use MessageLocalizer;
14use MessageSpecifier;
15use Wikimedia\Assert\Assert;
16
17class LinkRecommendationTaskTypeHandler extends StructuredTaskTypeHandler {
18
19    public const ID = 'link-recommendation';
20
21    public const TASK_TYPE_ID = 'link-recommendation';
22
23    public const CHANGE_TAG = 'newcomer task add link';
24
25    /** The tag prefix used for CirrusSearch\Wikimedia\WeightedTags. */
26    public const WEIGHTED_TAG_PREFIX = 'recommendation.link';
27
28    private LinkRecommendationProvider $recommendationProvider;
29    private AddLinkSubmissionHandler $submissionHandler;
30
31    /**
32     * @param ConfigurationValidator $configurationValidator
33     * @param TitleParser $titleParser
34     * @param RecommendationProvider $recommendationProvider
35     * @param AddLinkSubmissionHandler $submissionHandler
36     */
37    public function __construct(
38        ConfigurationValidator $configurationValidator,
39        TitleParser $titleParser,
40        RecommendationProvider $recommendationProvider,
41        AddLinkSubmissionHandler $submissionHandler
42    ) {
43        Assert::parameterType( LinkRecommendationProvider::class, $recommendationProvider,
44            '$recommendationProvider' );
45        parent::__construct( $configurationValidator, $titleParser );
46        $this->recommendationProvider = $recommendationProvider;
47        $this->submissionHandler = $submissionHandler;
48    }
49
50    /** @inheritDoc */
51    public function getId(): string {
52        return self::ID;
53    }
54
55    /**
56     * @inheritDoc
57     * @return LinkRecommendationProvider
58     */
59    public function getRecommendationProvider(): RecommendationProvider {
60        return $this->recommendationProvider;
61    }
62
63    /**
64     * @inheritDoc
65     * @return AddLinkSubmissionHandler
66     */
67    public function getSubmissionHandler(): SubmissionHandler {
68        return $this->submissionHandler;
69    }
70
71    /** @inheritDoc */
72    public function createTaskType( string $taskTypeId, array $config ): TaskType {
73        $extraData = [ 'learnMoreLink' => $config['learnmore'] ?? null ];
74        // FIXME add settings validation
75        $settings = array_intersect_key( $config, LinkRecommendationTaskType::DEFAULT_SETTINGS );
76
77        $taskType = new LinkRecommendationTaskType(
78            $taskTypeId,
79            $config['group'],
80            $settings,
81            $extraData,
82            $this->parseExcludedTemplates( $config ),
83            $this->parseExcludedCategories( $config )
84        );
85        $taskType->setHandlerId( $this->getId() );
86        return $taskType;
87    }
88
89    /** @inheritDoc */
90    public function getSearchTerm( TaskType $taskType ): string {
91        if ( $taskType->getHandlerId() !== self::ID ) {
92            throw new InvalidArgumentException( '$taskType must be a link recommendation task type' );
93        }
94        return parent::getSearchTerm( $taskType ) . 'hasrecommendation:link';
95    }
96
97    /** @inheritDoc */
98    public function getChangeTags( ?string $taskType = null ): array {
99        return [ TaskTypeHandler::NEWCOMER_TASK_TAG, self::CHANGE_TAG ];
100    }
101
102    /** @inheritDoc */
103    public function getTaskTypeIdByChangeTagName( string $changeTagName ): ?string {
104        if ( $changeTagName !== self::CHANGE_TAG ) {
105            throw new LogicException( "\"$changeTagName\" is not a valid change tag name for " . self::class );
106        }
107        return self::TASK_TYPE_ID;
108    }
109
110    /** @inheritDoc */
111    public function getSubmitDataFormatMessage(
112        TaskType $taskType,
113        MessageLocalizer $localizer
114    ): MessageSpecifier {
115        return $localizer->msg(
116            'apihelp-growthexperiments-structured-task-submit-data-format-link-recommendation'
117        );
118    }
119
120}