Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 56
0.00% covered (danger)
0.00%
0 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
ApiQueryTrackingCategories
0.00% covered (danger)
0.00%
0 / 56
0.00% covered (danger)
0.00%
0 / 9
210
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 execute
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getCacheMode
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 executeGenerator
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 run
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
42
 createQuery
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 getAllowedParams
0.00% covered (danger)
0.00%
0 / 27
0.00% covered (danger)
0.00%
0 / 1
2
 getExamplesMessages
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 getHelpUrls
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * Copyright © 2007 Roan Kattouw <roan.kattouw@gmail.com>
4 *
5 * @license GPL-2.0-or-later
6 * @file
7 */
8
9namespace MediaWiki\Api;
10
11use MediaWiki\Category\TrackingCategories;
12use Wikimedia\ParamValidator\ParamValidator;
13use Wikimedia\ParamValidator\TypeDef\IntegerDef;
14use Wikimedia\Rdbms\IReadableDatabase;
15
16/**
17 * Query module to enumerate existing tracking categories. A tracking category exists if it contains pages
18 * or if its category page exists.
19 *
20 * @ingroup API
21 */
22class ApiQueryTrackingCategories extends ApiQueryCategoryList {
23
24    public function __construct(
25        ApiQuery $query,
26        string $moduleName,
27        private readonly TrackingCategories $trackingCategoriesService,
28    ) {
29        parent::__construct( $query, $moduleName, 'tc' );
30    }
31
32    public function execute() {
33        $this->run();
34    }
35
36    /**
37     * @param array $params
38     * @return string
39     */
40    public function getCacheMode( $params ): string {
41        return 'public';
42    }
43
44    /**
45     * @param ApiPageSet $resultPageSet
46     * @return void
47     */
48    public function executeGenerator( $resultPageSet ): void {
49        $this->run( $resultPageSet );
50    }
51
52    /**
53     * @param ApiPageSet|null $resultPageSet
54     */
55    private function run( $resultPageSet = null ) {
56        $db = $this->getDB();
57        $params = $this->extractRequestParams();
58
59        $this->createQuery( $db, $params );
60
61        $cats = $this->trackingCategoriesService->getTrackingCategories();
62        $catNameList = [];
63        foreach ( $cats as $id => $cat ) {
64            if ( empty( $params['trackingcatname'] ) || in_array( $id, $params['trackingcatname'] ) ) {
65                foreach ( $cat['cats'] ?? [] as $link ) {
66                    $catNameList[ $link->getDBkey() ] = $id;
67                }
68            }
69        }
70        if ( $catNameList === [] ) {
71            return;
72        }
73        $this->addWhereFld( 'cat_title', array_keys( $catNameList ) );
74        $this->executeQuery( $params, $resultPageSet, [ 'catNames' => $catNameList ] );
75    }
76
77    protected function createQuery( IReadableDatabase $db, array $params ): void {
78        $params['from'] = null;
79        $params['to'] = null;
80        $params['prefix'] = null;
81        $params['dir'] = 'ascending';
82        parent::createQuery( $db, $params );
83    }
84
85    public function getAllowedParams(): array {
86        return [
87            'continue' => [
88                ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
89            ],
90            'trackingcatname' => [
91                ParamValidator::PARAM_ISMULTI => true,
92            ],
93            'min' => [
94                ParamValidator::PARAM_TYPE => 'integer'
95            ],
96            'max' => [
97                ParamValidator::PARAM_TYPE => 'integer'
98            ],
99            'limit' => [
100                ParamValidator::PARAM_DEFAULT => 10,
101                ParamValidator::PARAM_TYPE => 'limit',
102                IntegerDef::PARAM_MIN => 1,
103                IntegerDef::PARAM_MAX => ApiBase::LIMIT_BIG1,
104                IntegerDef::PARAM_MAX2 => ApiBase::LIMIT_BIG2
105            ],
106            'prop' => [
107                ParamValidator::PARAM_TYPE => [ 'size', 'hidden' ],
108                ParamValidator::PARAM_DEFAULT => '',
109                ParamValidator::PARAM_ISMULTI => true,
110                ApiBase::PARAM_HELP_MSG_PER_VALUE => [],
111            ],
112        ];
113    }
114
115    protected function getExamplesMessages(): array {
116        return [
117            'action=query&list=trackingcategories&tcprop=size'
118                => 'apihelp-query+trackingcategories-example-size',
119            'action=query&generator=trackingcategories&gtctrackingcatname=broken-file-category&prop=info'
120                => 'apihelp-query+trackingcategories-example-generator',
121        ];
122    }
123
124    public function getHelpUrls(): string {
125        return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Trackingcategories';
126    }
127}