Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 48
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
ApiQueryTranslatorStats
0.00% covered (danger)
0.00%
0 / 48
0.00% covered (danger)
0.00%
0 / 5
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
 execute
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 1
20
 addMissingMonths
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
20
 getAllowedParams
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 getExamplesMessages
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * Api module for querying translation statistics for a translator.
4 *
5 * @copyright See AUTHORS.txt
6 * @license GPL-2.0-or-later
7 */
8
9namespace ContentTranslation\ActionApi;
10
11use ApiQueryBase;
12use ContentTranslation\DateManipulator;
13use ContentTranslation\Service\UserService;
14use ContentTranslation\Translation;
15use Exception;
16use Wikimedia\ParamValidator\ParamValidator;
17
18class ApiQueryTranslatorStats extends ApiQueryBase {
19
20    private UserService $userService;
21
22    public function __construct( $query, $moduleName, UserService $userService ) {
23        parent::__construct( $query, $moduleName );
24        $this->userService = $userService;
25    }
26
27    public function execute() {
28        $params = $this->extractRequestParams();
29        $user = $this->getUser();
30
31        if ( isset( $params['translator'] ) ) {
32            $user = \User::newFromName( $params['translator'] );
33        }
34
35        if ( !$user ) {
36            $this->dieWithError( 'apierror-cx-invalidtranslator', 'invalidtranslator' );
37        }
38
39        try {
40            $translatorId = $this->userService->getGlobalUserId( $user );
41        } catch ( Exception $e ) {
42            $this->dieWithError( 'apierror-cx-invalidtranslator', 'invalidtranslator' );
43        }
44
45        $publishedStats = Translation::getTrendByStatus(
46            null, null, 'published', 'month', $translatorId
47        );
48
49        $trend = $this->addMissingMonths( $publishedStats );
50
51        $result = [
52            'translator' => $user->getName(),
53            'translatorId' => $translatorId,
54            'publishTrend' => $trend,
55        ];
56        $this->getResult()->addValue( null, $this->getModuleName(), $result );
57    }
58
59    private function addMissingMonths( $data ) {
60        $dates = array_keys( $data );
61
62        $dm = new DateManipulator( 'month' );
63        // If there is no data, just use zero (represents now)
64        // to avoid passing empty array into min method
65        $min = $dm->getIntervalIdentifier( !$dates ? 0 : min( $dates ) );
66        $max = $dm->getIntervalIdentifier( 0 ); // Now
67
68        $steps = $dm->getSteps( $min, $max );
69
70        $out = [];
71        $count = 0;
72
73        foreach ( $steps as $datetime ) {
74            $id = $datetime->format( 'U' );
75            $date = $datetime->format( 'Y-m-d' );
76
77            if ( isset( $data[ $id ] ) ) {
78                $out[ $date ] = $data[ $id ];
79                $count = $data[ $id ][ 'count' ];
80            } else {
81                $out[ $date ] = [
82                    'count' => $count,
83                    'delta' => 0
84                ];
85            }
86        }
87
88        return $out;
89    }
90
91    public function getAllowedParams() {
92        return [
93            'translator' => [
94                ParamValidator::PARAM_TYPE => 'string',
95            ]
96        ];
97    }
98
99    protected function getExamplesMessages() {
100        return [
101            'action=query&list=cxtranslatorstats&translator=TranslatorName' =>
102                'apihelp-query+cxtranslatorstats-example-1',
103        ];
104    }
105}