Skip to content

Commit de3f7bc

Browse files
committed
Create a new controller
Signed-off-by: Kamil Tekiela <[email protected]>
1 parent 26c2985 commit de3f7bc

File tree

10 files changed

+234
-160
lines changed

10 files changed

+234
-160
lines changed

app/services_controllers.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
use PhpMyAdmin\Controllers\Server;
3232
use PhpMyAdmin\Controllers\Setup;
3333
use PhpMyAdmin\Controllers\Sql;
34+
use PhpMyAdmin\Controllers\SyncFavoriteTablesController;
3435
use PhpMyAdmin\Controllers\Table;
3536
use PhpMyAdmin\Controllers\TableController;
3637
use PhpMyAdmin\Controllers\ThemesController;
@@ -308,7 +309,6 @@
308309
'arguments' => [
309310
'$response' => '@response',
310311
'$template' => '@template',
311-
'$relation' => '@relation',
312312
'$dbTableExists' => '@' . DbTableExists::class,
313313
],
314314
],
@@ -1361,5 +1361,12 @@
13611361
'$dbTableExists' => '@' . DbTableExists::class,
13621362
],
13631363
],
1364+
SyncFavoriteTablesController::class => [
1365+
'class' => SyncFavoriteTablesController::class,
1366+
'arguments' => [
1367+
'$response' => '@response',
1368+
'$relation' => '@relation',
1369+
],
1370+
],
13641371
],
13651372
];

phpstan-baseline.neon

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2343,12 +2343,6 @@ parameters:
23432343
count: 1
23442344
path: src/Controllers/Database/Structure/EmptyTableController.php
23452345

2346-
-
2347-
message: '#^Argument of an invalid type mixed supplied for foreach, only iterables are supported\.$#'
2348-
identifier: foreach.nonIterable
2349-
count: 1
2350-
path: src/Controllers/Database/Structure/FavoriteTableController.php
2351-
23522346
-
23532347
message: '''
23542348
#^Call to deprecated method getInstance\(\) of class PhpMyAdmin\\Config\:
@@ -2358,30 +2352,6 @@ parameters:
23582352
count: 1
23592353
path: src/Controllers/Database/Structure/FavoriteTableController.php
23602354

2361-
-
2362-
message: '#^Cannot access offset ''db'' on mixed\.$#'
2363-
identifier: offsetAccess.nonOffsetAccessible
2364-
count: 1
2365-
path: src/Controllers/Database/Structure/FavoriteTableController.php
2366-
2367-
-
2368-
message: '#^Cannot access offset ''favorites_synced'' on mixed\.$#'
2369-
identifier: offsetAccess.nonOffsetAccessible
2370-
count: 1
2371-
path: src/Controllers/Database/Structure/FavoriteTableController.php
2372-
2373-
-
2374-
message: '#^Cannot access offset ''table'' on mixed\.$#'
2375-
identifier: offsetAccess.nonOffsetAccessible
2376-
count: 1
2377-
path: src/Controllers/Database/Structure/FavoriteTableController.php
2378-
2379-
-
2380-
message: '#^Cannot access offset int\<0, max\> on mixed\.$#'
2381-
identifier: offsetAccess.nonOffsetAccessible
2382-
count: 1
2383-
path: src/Controllers/Database/Structure/FavoriteTableController.php
2384-
23852355
-
23862356
message: '#^Loose comparison via "\=\=" is not allowed\.$#'
23872357
identifier: equal.notAllowed
@@ -3657,6 +3627,39 @@ parameters:
36573627
count: 1
36583628
path: src/Controllers/Sql/SqlController.php
36593629

3630+
-
3631+
message: '''
3632+
#^Call to deprecated method getInstance\(\) of class PhpMyAdmin\\Config\:
3633+
Use dependency injection instead\.$#
3634+
'''
3635+
identifier: staticMethod.deprecated
3636+
count: 1
3637+
path: src/Controllers/SyncFavoriteTablesController.php
3638+
3639+
-
3640+
message: '#^Cannot access offset ''db'' on mixed\.$#'
3641+
identifier: offsetAccess.nonOffsetAccessible
3642+
count: 1
3643+
path: src/Controllers/SyncFavoriteTablesController.php
3644+
3645+
-
3646+
message: '#^Cannot access offset ''favorites_synced'' on mixed\.$#'
3647+
identifier: offsetAccess.nonOffsetAccessible
3648+
count: 1
3649+
path: src/Controllers/SyncFavoriteTablesController.php
3650+
3651+
-
3652+
message: '#^Cannot access offset ''table'' on mixed\.$#'
3653+
identifier: offsetAccess.nonOffsetAccessible
3654+
count: 1
3655+
path: src/Controllers/SyncFavoriteTablesController.php
3656+
3657+
-
3658+
message: '#^Cannot access offset int\<0, max\> on mixed\.$#'
3659+
identifier: offsetAccess.nonOffsetAccessible
3660+
count: 1
3661+
path: src/Controllers/SyncFavoriteTablesController.php
3662+
36603663
-
36613664
message: '#^Cannot access offset \(int\|string\) on mixed\.$#'
36623665
identifier: offsetAccess.nonOffsetAccessible
@@ -18819,6 +18822,12 @@ parameters:
1881918822
count: 2
1882018823
path: tests/unit/Controllers/Sql/SetValuesControllerTest.php
1882118824

18825+
-
18826+
message: '#^Parameter \#1 \$str of method PhpMyAdmin\\Dbal\\DatabaseInterface\:\:quoteString\(\) expects string, string\|false given\.$#'
18827+
identifier: argument.type
18828+
count: 1
18829+
path: tests/unit/Controllers/SyncFavoriteTablesControllerTest.php
18830+
1882218831
-
1882318832
message: '''
1882418833
#^Call to deprecated method getInstance\(\) of class PhpMyAdmin\\Config\:

psalm-baseline.xml

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,21 +1206,15 @@
12061206
<DeprecatedMethod>
12071207
<code><![CDATA[Config::getInstance()]]></code>
12081208
</DeprecatedMethod>
1209-
<MixedArrayAccess>
1210-
<code><![CDATA[$value['db']]]></code>
1211-
<code><![CDATA[$value['table']]]></code>
1212-
</MixedArrayAccess>
1213-
<MixedArrayAssignment>
1214-
<code><![CDATA[$_SESSION['tmpval']['favorites_synced']]]></code>
1215-
<code><![CDATA[$_SESSION['tmpval']['favorites_synced'][Current::$server]]]></code>
1216-
</MixedArrayAssignment>
12171209
<MixedAssignment>
12181210
<code><![CDATA[$favoriteTables]]></code>
1219-
<code><![CDATA[$value]]></code>
12201211
</MixedAssignment>
12211212
<MixedOperand>
12221213
<code><![CDATA[Current::$database]]></code>
12231214
</MixedOperand>
1215+
<PossiblyUnusedMethod>
1216+
<code><![CDATA[__construct]]></code>
1217+
</PossiblyUnusedMethod>
12241218
</file>
12251219
<file src="src/Controllers/Database/Structure/RealRowCountController.php">
12261220
<MixedArgument>
@@ -2260,6 +2254,23 @@
22602254
<code><![CDATA[$sqlQuery]]></code>
22612255
</MixedAssignment>
22622256
</file>
2257+
<file src="src/Controllers/SyncFavoriteTablesController.php">
2258+
<DeprecatedMethod>
2259+
<code><![CDATA[Config::getInstance()]]></code>
2260+
</DeprecatedMethod>
2261+
<MixedArrayAccess>
2262+
<code><![CDATA[$value['db']]]></code>
2263+
<code><![CDATA[$value['table']]]></code>
2264+
</MixedArrayAccess>
2265+
<MixedArrayAssignment>
2266+
<code><![CDATA[$_SESSION['tmpval']['favorites_synced']]]></code>
2267+
<code><![CDATA[$_SESSION['tmpval']['favorites_synced'][Current::$server]]]></code>
2268+
</MixedArrayAssignment>
2269+
<MixedAssignment>
2270+
<code><![CDATA[$favoriteTables]]></code>
2271+
<code><![CDATA[$value]]></code>
2272+
</MixedAssignment>
2273+
</file>
22632274
<file src="src/Controllers/Table/AddFieldController.php">
22642275
<MixedArgument>
22652276
<code><![CDATA[$_POST['field_input_transformation'][$fieldindex]]]></code>

src/Controllers/Database/Structure/FavoriteTableController.php

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
namespace PhpMyAdmin\Controllers\Database\Structure;
66

77
use PhpMyAdmin\Config;
8-
use PhpMyAdmin\ConfigStorage\Relation;
98
use PhpMyAdmin\Controllers\InvocableController;
109
use PhpMyAdmin\Current;
1110
use PhpMyAdmin\DbTableExists;
@@ -33,7 +32,6 @@ final class FavoriteTableController implements InvocableController
3332
public function __construct(
3433
private readonly ResponseRenderer $response,
3534
private readonly Template $template,
36-
private readonly Relation $relation,
3735
private readonly DbTableExists $dbTableExists,
3836
) {
3937
}
@@ -60,20 +58,6 @@ public function __invoke(ServerRequest $request): Response
6058
// Required to keep each user's preferences separate.
6159
$user = sha1($config->selectedServer['user']);
6260

63-
// Request for Synchronization of favorite tables.
64-
if ($request->getParam('sync_favorite_tables') !== null) {
65-
$relationParameters = $this->relation->getRelationParameters();
66-
if ($relationParameters->favoriteTablesFeature !== null) {
67-
$this->response->addJSON($this->synchronizeFavoriteTables(
68-
$favoriteInstance,
69-
$user,
70-
$favoriteTables,
71-
));
72-
}
73-
74-
return $this->response->response();
75-
}
76-
7761
$databaseName = DatabaseName::tryFrom($request->getParam('db'));
7862
if ($databaseName === null || ! $this->dbTableExists->selectDatabase($databaseName)) {
7963
$this->response->setRequestStatus(false);
@@ -142,35 +126,4 @@ public function __invoke(ServerRequest $request): Response
142126

143127
return $this->response->response();
144128
}
145-
146-
/**
147-
* Synchronize favorite tables
148-
*
149-
* @param RecentFavoriteTables $favoriteInstance Instance of this class
150-
* @param string $user The user hash
151-
* @param mixed[] $favoriteTables Existing favorites
152-
*
153-
* @return mixed[]
154-
*/
155-
private function synchronizeFavoriteTables(
156-
RecentFavoriteTables $favoriteInstance,
157-
string $user,
158-
array $favoriteTables,
159-
): array {
160-
if ($favoriteInstance->getTables() === [] && isset($favoriteTables[$user])) {
161-
foreach ($favoriteTables[$user] as $value) {
162-
$favoriteInstance->add(new RecentFavoriteTable(
163-
DatabaseName::from($value['db']),
164-
TableName::from($value['table']),
165-
));
166-
}
167-
}
168-
169-
$favoriteTables[$user] = $favoriteInstance->getTables();
170-
171-
// Set flag when localStorage and pmadb(if present) are in sync.
172-
$_SESSION['tmpval']['favorites_synced'][Current::$server] = true;
173-
174-
return ['favoriteTables' => json_encode($favoriteTables), 'list' => $favoriteInstance->getHtmlList()];
175-
}
176129
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpMyAdmin\Controllers;
6+
7+
use PhpMyAdmin\Config;
8+
use PhpMyAdmin\ConfigStorage\Relation;
9+
use PhpMyAdmin\Current;
10+
use PhpMyAdmin\Favorites\RecentFavoriteTable;
11+
use PhpMyAdmin\Favorites\RecentFavoriteTables;
12+
use PhpMyAdmin\Favorites\TableType;
13+
use PhpMyAdmin\Http\Response;
14+
use PhpMyAdmin\Http\ServerRequest;
15+
use PhpMyAdmin\Identifiers\DatabaseName;
16+
use PhpMyAdmin\Identifiers\TableName;
17+
use PhpMyAdmin\ResponseRenderer;
18+
19+
use function is_array;
20+
use function json_decode;
21+
use function json_encode;
22+
use function sha1;
23+
24+
final class SyncFavoriteTablesController implements InvocableController
25+
{
26+
public function __construct(
27+
private readonly ResponseRenderer $response,
28+
private readonly Relation $relation,
29+
) {
30+
}
31+
32+
public function __invoke(ServerRequest $request): Response
33+
{
34+
if (! $request->isAjax()) {
35+
return $this->response->response();
36+
}
37+
38+
$favoriteInstance = RecentFavoriteTables::getInstance(TableType::Favorite);
39+
40+
$favoriteTables = json_decode($request->getParsedBodyParamAsString('favoriteTables'), true);
41+
if (! is_array($favoriteTables)) {
42+
$favoriteTables = [];
43+
}
44+
45+
// Required to keep each user's preferences separate.
46+
$user = sha1(Config::getInstance()->selectedServer['user']);
47+
48+
$relationParameters = $this->relation->getRelationParameters();
49+
if ($relationParameters->favoriteTablesFeature !== null) {
50+
if (
51+
$favoriteInstance->getTables() === []
52+
&& isset($favoriteTables[$user])
53+
&& is_array($favoriteTables[$user])
54+
) {
55+
foreach ($favoriteTables[$user] as $value) {
56+
$favoriteInstance->add(new RecentFavoriteTable(
57+
DatabaseName::from($value['db']),
58+
TableName::from($value['table']),
59+
));
60+
}
61+
}
62+
63+
$favoriteTables[$user] = $favoriteInstance->getTables();
64+
65+
// Set flag when localStorage and pmadb(if present) are in sync.
66+
$_SESSION['tmpval']['favorites_synced'][Current::$server] = true;
67+
68+
$this->response->addJSON([
69+
'favoriteTables' => json_encode($favoriteTables),
70+
'list' => $favoriteInstance->getHtmlList(),
71+
]);
72+
}
73+
74+
return $this->response->response();
75+
}
76+
}

src/Favorites/RecentFavoriteTables.php

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,6 @@ public function contains(RecentFavoriteTable $currentTable): bool
294294
*/
295295
public function getHtmlSyncFavoriteTables(): string
296296
{
297-
$retval = '';
298297
if (Current::$server === 0) {
299298
return '';
300299
}
@@ -305,16 +304,12 @@ public function getHtmlSyncFavoriteTables(): string
305304
$relationParameters->favoriteTablesFeature !== null
306305
&& ! isset($_SESSION['tmpval']['favorites_synced'][Current::$server])
307306
) {
308-
$url = Url::getFromRoute('/database/structure/favorite-table', [
309-
'ajax_request' => true,
310-
'favorite_table' => true,
311-
'sync_favorite_tables' => true,
312-
]);
313-
$retval = '<a class="hide" id="sync_favorite_tables"';
314-
$retval .= ' href="' . $url . '"></a>';
307+
$url = Url::getFromRoute('/sync-favorite-tables', ['ajax_request' => true]);
308+
309+
return '<a class="hide" id="sync_favorite_tables" href="' . $url . '"></a>';
315310
}
316311

317-
return $retval;
312+
return '';
318313
}
319314

320315
/**

src/Routing/Routes.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
use PhpMyAdmin\Controllers\SchemaExportController;
3434
use PhpMyAdmin\Controllers\Server;
3535
use PhpMyAdmin\Controllers\Sql;
36+
use PhpMyAdmin\Controllers\SyncFavoriteTablesController;
3637
use PhpMyAdmin\Controllers\Table;
3738
use PhpMyAdmin\Controllers\TableController;
3839
use PhpMyAdmin\Controllers\ThemesController;
@@ -314,5 +315,6 @@ public static function collect(RouteCollector $routes): void
314315
$routes->addRoute(['GET', 'POST'], '/create', View\CreateController::class);
315316
$routes->addRoute(['GET', 'POST'], '/operations', Operations\ViewController::class);
316317
});
318+
$routes->post('/sync-favorite-tables', SyncFavoriteTablesController::class);
317319
}
318320
}

0 commit comments

Comments
 (0)