Skip to content

Commit 560fb6f

Browse files
committed
Refactor Table\Maintenance controllers to use ServerRequest
Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
1 parent 1d17093 commit 560fb6f

File tree

8 files changed

+255
-151
lines changed

8 files changed

+255
-151
lines changed

libraries/classes/Controllers/Table/Maintenance/AnalyzeController.php

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,54 +4,82 @@
44

55
namespace PhpMyAdmin\Controllers\Table\Maintenance;
66

7+
use InvalidArgumentException;
8+
use PhpMyAdmin\Config;
79
use PhpMyAdmin\Controllers\Table\AbstractController;
10+
use PhpMyAdmin\Dbal\DatabaseName;
11+
use PhpMyAdmin\Dbal\TableName;
812
use PhpMyAdmin\Html\Generator;
13+
use PhpMyAdmin\Http\ServerRequest;
14+
use PhpMyAdmin\Message;
915
use PhpMyAdmin\ResponseRenderer;
1016
use PhpMyAdmin\Table\Maintenance;
1117
use PhpMyAdmin\Template;
18+
use Webmozart\Assert\Assert;
1219

1320
use function __;
1421
use function count;
15-
use function is_array;
1622

1723
final class AnalyzeController extends AbstractController
1824
{
1925
/** @var Maintenance */
2026
private $model;
2127

28+
/** @var Config */
29+
private $config;
30+
2231
public function __construct(
2332
ResponseRenderer $response,
2433
Template $template,
2534
string $db,
2635
string $table,
27-
Maintenance $model
36+
Maintenance $model,
37+
Config $config
2838
) {
2939
parent::__construct($response, $template, $db, $table);
3040
$this->model = $model;
41+
$this->config = $config;
3142
}
3243

33-
public function __invoke(): void
44+
public function __invoke(ServerRequest $request): void
3445
{
35-
global $cfg;
36-
37-
/** @var string[] $selected */
38-
$selected = $_POST['selected_tbl'] ?? [];
46+
$dbParam = $request->getParam('db');
47+
$selectedTablesParam = $request->getParsedBodyParam('selected_tbl');
3948

40-
if (empty($selected) || ! is_array($selected)) {
49+
try {
50+
Assert::isArray($selectedTablesParam);
51+
Assert::notEmpty($selectedTablesParam);
52+
Assert::allStringNotEmpty($selectedTablesParam);
53+
} catch (InvalidArgumentException $exception) {
4154
$this->response->setRequestStatus(false);
4255
$this->response->addJSON('message', __('No table selected.'));
4356

4457
return;
4558
}
4659

47-
if ($cfg['DisableMultiTableMaintenance'] && count($selected) > 1) {
60+
try {
61+
Assert::string($dbParam);
62+
$database = DatabaseName::fromString($dbParam);
63+
$selectedTables = [];
64+
foreach ($selectedTablesParam as $table) {
65+
$selectedTables[] = TableName::fromString($table);
66+
}
67+
} catch (InvalidArgumentException $exception) {
68+
$message = Message::error($exception->getMessage());
69+
$this->response->setRequestStatus(false);
70+
$this->response->addJSON('message', $message->getDisplay());
71+
72+
return;
73+
}
74+
75+
if ($this->config->get('DisableMultiTableMaintenance') && count($selectedTables) > 1) {
4876
$this->response->setRequestStatus(false);
4977
$this->response->addJSON('message', __('Maintenance operations on multiple tables are disabled.'));
5078

5179
return;
5280
}
5381

54-
[$rows, $query] = $this->model->getAnalyzeTableRows($this->db, $selected);
82+
[$rows, $query] = $this->model->getAnalyzeTableRows($database, $selectedTables);
5583

5684
$message = Generator::getMessage(
5785
__('Your SQL query has been executed successfully.'),

libraries/classes/Controllers/Table/Maintenance/CheckController.php

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,62 +4,90 @@
44

55
namespace PhpMyAdmin\Controllers\Table\Maintenance;
66

7+
use InvalidArgumentException;
8+
use PhpMyAdmin\Config;
79
use PhpMyAdmin\Controllers\Table\AbstractController;
10+
use PhpMyAdmin\Dbal\DatabaseName;
11+
use PhpMyAdmin\Dbal\TableName;
812
use PhpMyAdmin\Html\Generator;
13+
use PhpMyAdmin\Http\ServerRequest;
14+
use PhpMyAdmin\Message;
915
use PhpMyAdmin\ResponseRenderer;
1016
use PhpMyAdmin\Table\Maintenance;
1117
use PhpMyAdmin\Template;
18+
use Webmozart\Assert\Assert;
1219

1320
use function __;
1421
use function count;
15-
use function is_array;
1622

1723
final class CheckController extends AbstractController
1824
{
1925
/** @var Maintenance */
2026
private $model;
2127

28+
/** @var Config */
29+
private $config;
30+
2231
public function __construct(
2332
ResponseRenderer $response,
2433
Template $template,
2534
string $db,
2635
string $table,
27-
Maintenance $model
36+
Maintenance $model,
37+
Config $config
2838
) {
2939
parent::__construct($response, $template, $db, $table);
3040
$this->model = $model;
41+
$this->config = $config;
3142
}
3243

33-
public function __invoke(): void
44+
public function __invoke(ServerRequest $request): void
3445
{
35-
global $cfg;
46+
$dbParam = $request->getParam('db');
47+
$selectedTablesParam = $request->getParsedBodyParam('selected_tbl');
48+
49+
try {
50+
Assert::isArray($selectedTablesParam);
51+
Assert::notEmpty($selectedTablesParam);
52+
Assert::allStringNotEmpty($selectedTablesParam);
53+
} catch (InvalidArgumentException $exception) {
54+
$this->response->setRequestStatus(false);
55+
$this->response->addJSON('message', __('No table selected.'));
3656

37-
/** @var string[] $selected */
38-
$selected = $_POST['selected_tbl'] ?? [];
57+
return;
58+
}
3959

40-
if (empty($selected) || ! is_array($selected)) {
60+
try {
61+
Assert::string($dbParam);
62+
$database = DatabaseName::fromString($dbParam);
63+
$selectedTables = [];
64+
foreach ($selectedTablesParam as $table) {
65+
$selectedTables[] = TableName::fromString($table);
66+
}
67+
} catch (InvalidArgumentException $exception) {
68+
$message = Message::error($exception->getMessage());
4169
$this->response->setRequestStatus(false);
42-
$this->response->addJSON('message', __('No table selected.'));
70+
$this->response->addJSON('message', $message->getDisplay());
4371

4472
return;
4573
}
4674

47-
if ($cfg['DisableMultiTableMaintenance'] && count($selected) > 1) {
75+
if ($this->config->get('DisableMultiTableMaintenance') && count($selectedTables) > 1) {
4876
$this->response->setRequestStatus(false);
4977
$this->response->addJSON('message', __('Maintenance operations on multiple tables are disabled.'));
5078

5179
return;
5280
}
5381

54-
[$rows, $query] = $this->model->getCheckTableRows($this->db, $selected);
82+
[$rows, $query] = $this->model->getCheckTableRows($database, $selectedTables);
5583

5684
$message = Generator::getMessage(
5785
__('Your SQL query has been executed successfully.'),
5886
$query,
5987
'success'
6088
);
6189

62-
$indexesProblems = $this->model->getIndexesProblems($this->db, $selected);
90+
$indexesProblems = $this->model->getIndexesProblems($database, $selectedTables);
6391

6492
$this->render('table/maintenance/check', [
6593
'message' => $message,

libraries/classes/Controllers/Table/Maintenance/ChecksumController.php

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,54 +4,82 @@
44

55
namespace PhpMyAdmin\Controllers\Table\Maintenance;
66

7+
use InvalidArgumentException;
8+
use PhpMyAdmin\Config;
79
use PhpMyAdmin\Controllers\Table\AbstractController;
10+
use PhpMyAdmin\Dbal\DatabaseName;
11+
use PhpMyAdmin\Dbal\TableName;
812
use PhpMyAdmin\Html\Generator;
13+
use PhpMyAdmin\Http\ServerRequest;
14+
use PhpMyAdmin\Message;
915
use PhpMyAdmin\ResponseRenderer;
1016
use PhpMyAdmin\Table\Maintenance;
1117
use PhpMyAdmin\Template;
18+
use Webmozart\Assert\Assert;
1219

1320
use function __;
1421
use function count;
15-
use function is_array;
1622

1723
final class ChecksumController extends AbstractController
1824
{
1925
/** @var Maintenance */
2026
private $model;
2127

28+
/** @var Config */
29+
private $config;
30+
2231
public function __construct(
2332
ResponseRenderer $response,
2433
Template $template,
2534
string $db,
2635
string $table,
27-
Maintenance $model
36+
Maintenance $model,
37+
Config $config
2838
) {
2939
parent::__construct($response, $template, $db, $table);
3040
$this->model = $model;
41+
$this->config = $config;
3142
}
3243

33-
public function __invoke(): void
44+
public function __invoke(ServerRequest $request): void
3445
{
35-
global $cfg;
36-
37-
/** @var string[] $selected */
38-
$selected = $_POST['selected_tbl'] ?? [];
46+
$dbParam = $request->getParam('db');
47+
$selectedTablesParam = $request->getParsedBodyParam('selected_tbl');
3948

40-
if (empty($selected) || ! is_array($selected)) {
49+
try {
50+
Assert::isArray($selectedTablesParam);
51+
Assert::notEmpty($selectedTablesParam);
52+
Assert::allStringNotEmpty($selectedTablesParam);
53+
} catch (InvalidArgumentException $exception) {
4154
$this->response->setRequestStatus(false);
4255
$this->response->addJSON('message', __('No table selected.'));
4356

4457
return;
4558
}
4659

47-
if ($cfg['DisableMultiTableMaintenance'] && count($selected) > 1) {
60+
try {
61+
Assert::string($dbParam);
62+
$database = DatabaseName::fromString($dbParam);
63+
$selectedTables = [];
64+
foreach ($selectedTablesParam as $table) {
65+
$selectedTables[] = TableName::fromString($table);
66+
}
67+
} catch (InvalidArgumentException $exception) {
68+
$message = Message::error($exception->getMessage());
69+
$this->response->setRequestStatus(false);
70+
$this->response->addJSON('message', $message->getDisplay());
71+
72+
return;
73+
}
74+
75+
if ($this->config->get('DisableMultiTableMaintenance') && count($selectedTables) > 1) {
4876
$this->response->setRequestStatus(false);
4977
$this->response->addJSON('message', __('Maintenance operations on multiple tables are disabled.'));
5078

5179
return;
5280
}
5381

54-
[$rows, $query, $warnings] = $this->model->getChecksumTableRows($this->db, $selected);
82+
[$rows, $query, $warnings] = $this->model->getChecksumTableRows($database, $selectedTables);
5583

5684
$message = Generator::getMessage(
5785
__('Your SQL query has been executed successfully.'),

libraries/classes/Controllers/Table/Maintenance/OptimizeController.php

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,54 +4,82 @@
44

55
namespace PhpMyAdmin\Controllers\Table\Maintenance;
66

7+
use InvalidArgumentException;
8+
use PhpMyAdmin\Config;
79
use PhpMyAdmin\Controllers\Table\AbstractController;
10+
use PhpMyAdmin\Dbal\DatabaseName;
11+
use PhpMyAdmin\Dbal\TableName;
812
use PhpMyAdmin\Html\Generator;
13+
use PhpMyAdmin\Http\ServerRequest;
14+
use PhpMyAdmin\Message;
915
use PhpMyAdmin\ResponseRenderer;
1016
use PhpMyAdmin\Table\Maintenance;
1117
use PhpMyAdmin\Template;
18+
use Webmozart\Assert\Assert;
1219

1320
use function __;
1421
use function count;
15-
use function is_array;
1622

1723
final class OptimizeController extends AbstractController
1824
{
1925
/** @var Maintenance */
2026
private $model;
2127

28+
/** @var Config */
29+
private $config;
30+
2231
public function __construct(
2332
ResponseRenderer $response,
2433
Template $template,
2534
string $db,
2635
string $table,
27-
Maintenance $model
36+
Maintenance $model,
37+
Config $config
2838
) {
2939
parent::__construct($response, $template, $db, $table);
3040
$this->model = $model;
41+
$this->config = $config;
3142
}
3243

33-
public function __invoke(): void
44+
public function __invoke(ServerRequest $request): void
3445
{
35-
global $cfg;
36-
37-
/** @var string[] $selected */
38-
$selected = $_POST['selected_tbl'] ?? [];
46+
$dbParam = $request->getParam('db');
47+
$selectedTablesParam = $request->getParsedBodyParam('selected_tbl');
3948

40-
if (empty($selected) || ! is_array($selected)) {
49+
try {
50+
Assert::isArray($selectedTablesParam);
51+
Assert::notEmpty($selectedTablesParam);
52+
Assert::allStringNotEmpty($selectedTablesParam);
53+
} catch (InvalidArgumentException $exception) {
4154
$this->response->setRequestStatus(false);
4255
$this->response->addJSON('message', __('No table selected.'));
4356

4457
return;
4558
}
4659

47-
if ($cfg['DisableMultiTableMaintenance'] && count($selected) > 1) {
60+
try {
61+
Assert::string($dbParam);
62+
$database = DatabaseName::fromString($dbParam);
63+
$selectedTables = [];
64+
foreach ($selectedTablesParam as $table) {
65+
$selectedTables[] = TableName::fromString($table);
66+
}
67+
} catch (InvalidArgumentException $exception) {
68+
$message = Message::error($exception->getMessage());
69+
$this->response->setRequestStatus(false);
70+
$this->response->addJSON('message', $message->getDisplay());
71+
72+
return;
73+
}
74+
75+
if ($this->config->get('DisableMultiTableMaintenance') && count($selectedTables) > 1) {
4876
$this->response->setRequestStatus(false);
4977
$this->response->addJSON('message', __('Maintenance operations on multiple tables are disabled.'));
5078

5179
return;
5280
}
5381

54-
[$rows, $query] = $this->model->getOptimizeTableRows($this->db, $selected);
82+
[$rows, $query] = $this->model->getOptimizeTableRows($database, $selectedTables);
5583

5684
$message = Generator::getMessage(
5785
__('Your SQL query has been executed successfully.'),

0 commit comments

Comments
 (0)