Skip to content

Commit

Permalink
Merge pull request phpmyadmin#18953 from kamil-tekiela/Types-in-Datab…
Browse files Browse the repository at this point in the history
…aseController

Small refactoring of  database controller in Server
  • Loading branch information
MauricioFauth authored Feb 1, 2024
2 parents c7fd4df + bc8cd6b commit 9b7a7a3
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 103 deletions.
19 changes: 2 additions & 17 deletions phpstan-baseline.neon
Original file line number Diff line number Diff line change
Expand Up @@ -3446,12 +3446,7 @@ parameters:
path: src/Controllers/Server/DatabasesController.php

-
message: "#^Cannot access offset 'raw' on mixed\\.$#"
count: 2
path: src/Controllers/Server/DatabasesController.php

-
message: "#^Cannot access offset \\(int\\|string\\) on mixed\\.$#"
message: "#^Cannot access offset string on mixed\\.$#"
count: 2
path: src/Controllers/Server/DatabasesController.php

Expand All @@ -3467,7 +3462,7 @@ parameters:

-
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
count: 2
count: 1
path: src/Controllers/Server/DatabasesController.php

-
Expand All @@ -3485,11 +3480,6 @@ parameters:
count: 1
path: src/Controllers/Server/DatabasesController.php

-
message: "#^Parameter \\#1 \\$sortBy of method PhpMyAdmin\\\\Controllers\\\\Server\\\\DatabasesController\\:\\:setSortDetails\\(\\) expects string\\|null, mixed given\\.$#"
count: 1
path: src/Controllers/Server/DatabasesController.php

-
message: "#^Parameter \\#1 \\$value of function count expects array\\|Countable, mixed given\\.$#"
count: 2
Expand All @@ -3500,11 +3490,6 @@ parameters:
count: 4
path: src/Controllers/Server/DatabasesController.php

-
message: "#^Parameter \\#2 \\$sortOrder of method PhpMyAdmin\\\\Controllers\\\\Server\\\\DatabasesController\\:\\:setSortDetails\\(\\) expects string\\|null, mixed given\\.$#"
count: 1
path: src/Controllers/Server/DatabasesController.php

-
message: "#^Parameter \\#3 \\$name of static method PhpMyAdmin\\\\Charsets\\:\\:findCollationByName\\(\\) expects string, mixed given\\.$#"
count: 1
Expand Down
20 changes: 0 additions & 20 deletions psalm-baseline.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2700,12 +2700,7 @@
<code><![CDATA[$database['SCHEMA_NAME']]]></code>
<code><![CDATA[$database['SCHEMA_NAME']]]></code>
<code><![CDATA[$database['SCHEMA_NAME']]]></code>
<code><![CDATA[$totalStatistics[$key]['raw']]]></code>
</MixedArrayAccess>
<MixedArrayAssignment>
<code><![CDATA[$statistics[$key]['raw']]]></code>
<code><![CDATA[$totalStatistics[$key]['raw']]]></code>
</MixedArrayAssignment>
<MixedArrayOffset>
<code><![CDATA[$databases[$database['SCHEMA_NAME']]]]></code>
<code><![CDATA[$databases[$database['SCHEMA_NAME']]]]></code>
Expand All @@ -2717,22 +2712,7 @@
<code>$key</code>
<code>$key</code>
<code>$key</code>
<code><![CDATA[$totalStatistics[$key]['raw']]]></code>
</MixedAssignment>
<MixedOperand>
<code><![CDATA[$totalStatistics[$key]['raw']]]></code>
</MixedOperand>
<PossiblyInvalidArgument>
<code><![CDATA[$params['sort_by']]]></code>
<code><![CDATA[$params['sort_order']]]></code>
</PossiblyInvalidArgument>
<RiskyCast>
<code><![CDATA[$params['pos']]]></code>
</RiskyCast>
<RiskyTruthyFalsyComparison>
<code><![CDATA[empty($params['pos'])]]></code>
<code><![CDATA[empty($params['statistics'])]]></code>
</RiskyTruthyFalsyComparison>
</file>
<file src="src/Controllers/Server/EnginesController.php">
<PossiblyUnusedParam>
Expand Down
74 changes: 25 additions & 49 deletions src/Controllers/Server/DatabasesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,14 @@
use PhpMyAdmin\Url;
use PhpMyAdmin\UserPrivileges;
use PhpMyAdmin\Util;
use Webmozart\Assert\Assert;

use function __;
use function array_keys;
use function array_search;
use function count;
use function in_array;
use function mb_strtolower;
use function str_contains;
use function strtolower;

/**
* Handles viewing and creating and deleting databases
Expand All @@ -49,6 +49,17 @@ class DatabasesController extends AbstractController
/** @var bool whether to show database statistics */
private bool $hasStatistics = false;

private const SORT_BY_ALLOWED_LIST = [
'SCHEMA_NAME',
'DEFAULT_COLLATION_NAME',
'SCHEMA_TABLES',
'SCHEMA_TABLE_ROWS',
'SCHEMA_DATA_LENGTH',
'SCHEMA_INDEX_LENGTH',
'SCHEMA_LENGTH',
'SCHEMA_DATA_FREE',
];

public function __construct(
ResponseRenderer $response,
Template $template,
Expand All @@ -64,12 +75,16 @@ public function __invoke(ServerRequest $request): void
{
$GLOBALS['errorUrl'] ??= null;

$params = [
'statistics' => $_REQUEST['statistics'] ?? null,
'pos' => $_REQUEST['pos'] ?? null,
'sort_by' => $_REQUEST['sort_by'] ?? null,
'sort_order' => $_REQUEST['sort_order'] ?? null,
];
$this->hasStatistics = ! empty($request->getParam('statistics'));
$position = (int) $request->getParam('pos');

$sortBy = $request->getParam('sort_by', '');
Assert::string($sortBy);

Check warning on line 82 in src/Controllers/Server/DatabasesController.php

View workflow job for this annotation

GitHub Actions / Infection (8.2, ubuntu-latest)

Escaped Mutant for Mutator "MethodCallRemoval": --- Original +++ New @@ @@ $this->hasStatistics = !empty($request->getParam('statistics')); $position = (int) $request->getParam('pos'); $sortBy = $request->getParam('sort_by', ''); - Assert::string($sortBy); + $this->sortBy = self::SORT_BY_ALLOWED_LIST[array_search($sortBy, self::SORT_BY_ALLOWED_LIST, true)]; $sortOrder = $request->getParam('sort_order', ''); Assert::string($sortOrder);
$this->sortBy = self::SORT_BY_ALLOWED_LIST[array_search($sortBy, self::SORT_BY_ALLOWED_LIST, true)];

$sortOrder = $request->getParam('sort_order', '');
Assert::string($sortOrder);

Check warning on line 86 in src/Controllers/Server/DatabasesController.php

View workflow job for this annotation

GitHub Actions / Infection (8.2, ubuntu-latest)

Escaped Mutant for Mutator "MethodCallRemoval": --- Original +++ New @@ @@ Assert::string($sortBy); $this->sortBy = self::SORT_BY_ALLOWED_LIST[array_search($sortBy, self::SORT_BY_ALLOWED_LIST, true)]; $sortOrder = $request->getParam('sort_order', ''); - Assert::string($sortOrder); + $this->sortOrder = strtolower($sortOrder) !== 'desc' ? 'asc' : 'desc'; $this->addScriptFiles(['server/databases.js']); $GLOBALS['errorUrl'] = Url::getFromRoute('/');
$this->sortOrder = strtolower($sortOrder) !== 'desc' ? 'asc' : 'desc';

Check warning on line 87 in src/Controllers/Server/DatabasesController.php

View workflow job for this annotation

GitHub Actions / Infection (8.2, ubuntu-latest)

Escaped Mutant for Mutator "UnwrapStrToLower": --- Original +++ New @@ @@ $this->sortBy = self::SORT_BY_ALLOWED_LIST[array_search($sortBy, self::SORT_BY_ALLOWED_LIST, true)]; $sortOrder = $request->getParam('sort_order', ''); Assert::string($sortOrder); - $this->sortOrder = strtolower($sortOrder) !== 'desc' ? 'asc' : 'desc'; + $this->sortOrder = $sortOrder !== 'desc' ? 'asc' : 'desc'; $this->addScriptFiles(['server/databases.js']); $GLOBALS['errorUrl'] = Url::getFromRoute('/'); if ($this->dbi->isSuperUser()) {

$this->addScriptFiles(['server/databases.js']);
$GLOBALS['errorUrl'] = Url::getFromRoute('/');
Expand All @@ -84,10 +99,6 @@ public function __invoke(ServerRequest $request): void
$primaryInfo = $replicationInfo->getPrimaryInfo();
$replicaInfo = $replicationInfo->getReplicaInfo();

$this->setSortDetails($params['sort_by'], $params['sort_order']);
$this->hasStatistics = ! empty($params['statistics']);
$position = ! empty($params['pos']) ? (int) $params['pos'] : 0;

/**
* Gets the databases list
*/
Expand Down Expand Up @@ -159,46 +170,11 @@ public function __invoke(ServerRequest $request): void
]);
}

/**
* Extracts parameters sort order and sort by
*
* @param string|null $sortBy sort by
* @param string|null $sortOrder sort order
*/
private function setSortDetails(string|null $sortBy, string|null $sortOrder): void
{
if ($sortBy === null || $sortBy === '') {
$this->sortBy = 'SCHEMA_NAME';
} else {
$sortByAllowList = [
'SCHEMA_NAME',
'DEFAULT_COLLATION_NAME',
'SCHEMA_TABLES',
'SCHEMA_TABLE_ROWS',
'SCHEMA_DATA_LENGTH',
'SCHEMA_INDEX_LENGTH',
'SCHEMA_LENGTH',
'SCHEMA_DATA_FREE',
];
$this->sortBy = 'SCHEMA_NAME';
if (in_array($sortBy, $sortByAllowList, true)) {
$this->sortBy = $sortBy;
}
}

$this->sortOrder = 'asc';
if (! isset($sortOrder) || mb_strtolower($sortOrder) !== 'desc') {
return;
}

$this->sortOrder = 'desc';
}

/**
* @param mixed[] $primaryInfo
* @param mixed[] $replicaInfo
*
* @return mixed[]
* @return array{databases:mixed[], total_statistics:mixed[]}
*/
private function getDatabases(array $primaryInfo, array $replicaInfo): array
{
Expand Down Expand Up @@ -280,7 +256,7 @@ private function getDatabases(array $primaryInfo, array $replicaInfo): array
/**
* Prepares the statistics columns
*
* @return mixed[]
* @return array<string, array{title: string, format: 'number'|'byte', raw: int}>
*/
private function getStatisticsColumns(): array
{
Expand Down
14 changes: 3 additions & 11 deletions src/Replication/ReplicationInfo.php
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ private function setDefaultPrimaryConnection(string $connection): void
/**
* @param mixed[] $status
*
* @return mixed[]
* @return string[]
*/
private function fill(array $status, string $key): array
{
Expand All @@ -138,11 +138,7 @@ private function fill(array $status, string $key): array

private function setPrimaryInfo(): void
{
$this->primaryInfo = ['status' => false];

if ($this->primaryStatus !== []) {
$this->primaryInfo['status'] = true;
}
$this->primaryInfo = ['status' => $this->primaryStatus !== []];

if (! $this->primaryInfo['status']) {
return;
Expand All @@ -160,11 +156,7 @@ public function getPrimaryInfo(): array

private function setReplicaInfo(): void
{
$this->replicaInfo = ['status' => false];

if ($this->replicaStatus !== []) {
$this->replicaInfo['status'] = true;
}
$this->replicaInfo = ['status' => $this->replicaStatus !== []];

if (! $this->replicaInfo['status']) {
return;
Expand Down
23 changes: 17 additions & 6 deletions tests/classes/Controllers/Server/DatabasesControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
use PhpMyAdmin\Controllers\Server\DatabasesController;
use PhpMyAdmin\Current;
use PhpMyAdmin\DatabaseInterface;
use PhpMyAdmin\Http\ServerRequest;
use PhpMyAdmin\Http\Factory\ServerRequestFactory;
use PhpMyAdmin\Template;
use PhpMyAdmin\Tests\AbstractTestCase;
use PhpMyAdmin\Tests\Stubs\DbiDummy;
Expand Down Expand Up @@ -56,7 +56,14 @@ public function testIndexAction(): void
['SCHEMA_NAME'],
);
$this->dummyDbi->addSelectDb('mysql');
$controller(self::createStub(ServerRequest::class));
$request = ServerRequestFactory::create()->createServerRequest('GET', 'http://example.com/')
->withQueryParams([
'statistics' => '',
'pos' => '',
'sort_by' => '',
'sort_order' => '',
]);
$controller($request);
$this->dummyDbi->assertAllSelectsConsumed();
$actual = $response->getHTMLResult();

Expand All @@ -82,12 +89,16 @@ public function testIndexAction(): void

$config->settings['ShowCreateDb'] = true;
UserPrivileges::$isCreateDatabase = true;
$_REQUEST['statistics'] = '1';
$_REQUEST['sort_by'] = 'SCHEMA_TABLES';
$_REQUEST['sort_order'] = 'desc';

$request = ServerRequestFactory::create()->createServerRequest('GET', 'http://example.com/')
->withQueryParams([
'statistics' => '1',
'pos' => '',
'sort_by' => 'SCHEMA_TABLES',
'sort_order' => 'desc',
]);
$this->dummyDbi->addSelectDb('mysql');
$controller(self::createStub(ServerRequest::class));
$controller($request);
$this->dummyDbi->assertAllSelectsConsumed();
$actual = $response->getHTMLResult();

Expand Down

0 comments on commit 9b7a7a3

Please sign in to comment.