Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 48 |
|
0.00% |
0 / 5 |
CRAP | |
0.00% |
0 / 1 |
ApiQueryTranslatorStats | |
0.00% |
0 / 48 |
|
0.00% |
0 / 5 |
132 | |
0.00% |
0 / 1 |
__construct | |
0.00% |
0 / 2 |
|
0.00% |
0 / 1 |
2 | |||
execute | |
0.00% |
0 / 19 |
|
0.00% |
0 / 1 |
20 | |||
addMissingMonths | |
0.00% |
0 / 18 |
|
0.00% |
0 / 1 |
20 | |||
getAllowedParams | |
0.00% |
0 / 5 |
|
0.00% |
0 / 1 |
2 | |||
getExamplesMessages | |
0.00% |
0 / 4 |
|
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 | |
9 | namespace ContentTranslation\ActionApi; |
10 | |
11 | use ApiQueryBase; |
12 | use ContentTranslation\DateManipulator; |
13 | use ContentTranslation\Service\UserService; |
14 | use ContentTranslation\Translation; |
15 | use Exception; |
16 | use Wikimedia\ParamValidator\ParamValidator; |
17 | |
18 | class 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 | } |