Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 73
0.00% covered (danger)
0.00%
0 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
CargoRecreateDataAPI
0.00% covered (danger)
0.00%
0 / 73
0.00% covered (danger)
0.00%
0 / 8
420
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 / 44
0.00% covered (danger)
0.00%
0 / 1
182
 getAllowedParams
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
2
 getParamDescription
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 getDescription
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 getExamples
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 mustBePosted
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 needsToken
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * Adds and handles the 'cargorecreatedata' action to the MediaWiki API.
4 *
5 * @ingroup Cargo
6 * @author Yaron Koren
7 */
8
9use MediaWiki\MediaWikiServices;
10
11class CargoRecreateDataAPI extends ApiBase {
12
13    public function __construct( $query, $moduleName ) {
14        parent::__construct( $query, $moduleName );
15    }
16
17    public function execute() {
18        $user = $this->getUser();
19
20        if ( !$user->isAllowed( 'recreatecargodata' ) || $user->getBlock() !== null ) {
21            $this->dieWithError( [ 'badaccess-groups' ] );
22        }
23
24        $params = $this->extractRequestParams();
25        $templateStr = $params['template'];
26        $tableStr = $params['table'];
27
28        if ( $templateStr == '' ) {
29            $specialTableNames = CargoUtils::specialTableNames();
30            if ( !in_array( $tableStr, $specialTableNames ) ) {
31                $this->dieWithError( 'The template must be specified', 'param_substr' );
32            }
33        }
34
35        if ( $tableStr == '' ) {
36            $this->dieWithError( 'The table must be specified', 'param_substr' );
37        }
38
39        // Create the jobs.
40        $jobParams = [
41            'dbTableName' => $tableStr,
42            'replaceOldRows' => $params['replaceOldRows']
43        ];
44        $jobs = [];
45        if ( $templateStr != '' ) {
46            $templateTitle = Title::makeTitleSafe( NS_TEMPLATE, $templateStr );
47            $titlesToStore = CargoUtils::getTemplateLinksTo( $templateTitle, [
48                'LIMIT' => 500, 'OFFSET' => $params['offset'] ] );
49        } else {
50            if ( $tableStr == '_pageData' ) {
51                $conds = null;
52            } elseif ( $tableStr == '_fileData' ) {
53                $conds = 'page_namespace = ' . NS_FILE;
54            } elseif ( $tableStr == '_bpmnData' ) {
55                $conds = 'page_namespace = ' . FD_NS_BPMN;
56            } else { // if ( $tableStr == '_ganttData' ) {
57                $conds = 'page_namespace = ' . FD_NS_GANTT;
58            }
59            $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
60            $dbr = $lb->getConnectionRef( DB_REPLICA );
61            $pages = $dbr->select(
62                'page', [ 'page_id' ], $conds, __METHOD__,
63                [ 'LIMIT' => 500, 'OFFSET' => $params['offset'] ]
64            );
65            foreach ( $pages as $page ) {
66                $title = Title::newFromID( $page->page_id );
67                if ( $title == null ) {
68                    continue;
69                }
70                $titlesToStore[] = $title;
71            }
72        }
73
74        foreach ( $titlesToStore as $titleToStore ) {
75            $jobs[] = new CargoPopulateTableJob( $titleToStore, $jobParams );
76        }
77        MediaWikiServices::getInstance()->getJobQueueGroup()->push( $jobs );
78
79        // Set top-level elements.
80        $result = $this->getResult();
81        $result->addValue( null, 'success', true );
82    }
83
84    protected function getAllowedParams() {
85        return [
86            'template' => [
87                ApiBase::PARAM_TYPE => 'string',
88            ],
89            'table' => [
90                ApiBase::PARAM_TYPE => 'string',
91            ],
92            'offset' => [
93                ApiBase::PARAM_TYPE => 'integer',
94                ApiBase::PARAM_DFLT => 0,
95            ],
96            'replaceOldRows' => [
97                ApiBase::PARAM_TYPE => 'boolean',
98            ],
99        ];
100    }
101
102    protected function getParamDescription() {
103        return [
104            'template' => 'The template whose data to use',
105            'table' => 'The Cargo database table to repopulate',
106            'offset' => 'Of the pages that call this template, the number at which to start querying',
107            'replaceOldRows' => 'Whether to replace old rows for each page while repopulating the table',
108        ];
109    }
110
111    protected function getDescription() {
112        return 'An API module to recreate data for the Cargo extension '
113            . '(https://www.mediawiki.org/Extension:Cargo)';
114    }
115
116    protected function getExamples() {
117        return [
118            'api.php?action=cargorecreatedata&template=City&table=Cities'
119        ];
120    }
121
122    public function mustBePosted() {
123        return true;
124    }
125
126    public function needsToken() {
127        return 'csrf';
128    }
129
130}