From 9b25d12e01963b190ec16645cd44de5f252c40cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Meneghini=20Fauth?= Date: Sun, 14 Apr 2024 17:19:26 -0300 Subject: [PATCH] Extract recent table handling from Header into a middleware MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This removes the recent visited table handling from the Header class and moves it to a new middleware. This also removes a duplicated update via front-end. Signed-off-by: MaurĂ­cio Meneghini Fauth --- app/services_controllers.php | 5 -- phpstan-baseline.neon | 2 +- psalm-baseline.xml | 6 -- resources/js/src/modules/functions.ts | 14 ----- resources/templates/header.twig | 1 - src/Application.php | 2 + .../RecentTablesListController.php | 29 --------- src/Favorites/RecentFavoriteTables.php | 10 ---- src/Header.php | 38 +----------- src/Http/Middleware/RecentTableHandling.php | 49 +++++++++++++++ src/Routing/Routes.php | 2 - .../Middleware/RecentTableHandlingTest.php | 59 +++++++++++++++++++ tests/unit/Routing/RoutesTest.php | 3 - 13 files changed, 112 insertions(+), 108 deletions(-) delete mode 100644 src/Controllers/RecentTablesListController.php create mode 100644 src/Http/Middleware/RecentTableHandling.php create mode 100644 tests/unit/Http/Middleware/RecentTableHandlingTest.php diff --git a/app/services_controllers.php b/app/services_controllers.php index be43d90aee1c..d87d3bd2ac86 100644 --- a/app/services_controllers.php +++ b/app/services_controllers.php @@ -27,7 +27,6 @@ use PhpMyAdmin\Controllers\Operations; use PhpMyAdmin\Controllers\PhpInfoController; use PhpMyAdmin\Controllers\Preferences; -use PhpMyAdmin\Controllers\RecentTablesListController; use PhpMyAdmin\Controllers\SchemaExportController; use PhpMyAdmin\Controllers\Server; use PhpMyAdmin\Controllers\Sql; @@ -544,10 +543,6 @@ 'class' => PhpInfoController::class, 'arguments' => ['$response' => '@response'], ], - RecentTablesListController::class => [ - 'class' => RecentTablesListController::class, - 'arguments' => ['$response' => '@response'], - ], Preferences\ExportController::class => [ 'class' => Preferences\ExportController::class, 'arguments' => [ diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 08bbde4493ae..304263341610 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -8217,7 +8217,7 @@ parameters: - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" - count: 8 + count: 7 path: src/Header.php - diff --git a/psalm-baseline.xml b/psalm-baseline.xml index e62dc975c418..a5e2e9e40570 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -2554,11 +2554,6 @@ - - - - - @@ -6533,7 +6528,6 @@ config->get('DisableShortcutKeys')]]> - diff --git a/resources/js/src/modules/functions.ts b/resources/js/src/modules/functions.ts index e615942bf59f..2dfab197a161 100644 --- a/resources/js/src/modules/functions.ts +++ b/resources/js/src/modules/functions.ts @@ -3121,24 +3121,10 @@ function getPageSelectorEventHandler () { } function teardownRecentFavoriteTables (): void { - $('#update_recent_tables').off('ready'); $('#sync_favorite_tables').off('ready'); } function onloadRecentFavoriteTables (): void { - var $updateRecentTables = $('#update_recent_tables'); - if ($updateRecentTables.length) { - $.get( - $updateRecentTables.attr('href'), - { 'no_debug': true }, - function (data) { - if (typeof data !== 'undefined' && data.success === true) { - $('#recentTableList').html(data.list); - } - } - ); - } - // Sync favorite tables from localStorage to pmadb. if (! $('#sync_favorite_tables').length) { return; diff --git a/resources/templates/header.twig b/resources/templates/header.twig index 8fe5c808950f..a1eca769b1b4 100644 --- a/resources/templates/header.twig +++ b/resources/templates/header.twig @@ -117,7 +117,6 @@
{{ messages|raw }} - {{ recent_table|raw }} {%- if is_logged_in -%} {{ include('modals/preview_sql_modal.twig') }} {{ include('modals/enum_set_editor.twig') }} diff --git a/src/Application.php b/src/Application.php index 271749c97980..d76589b6b372 100644 --- a/src/Application.php +++ b/src/Application.php @@ -29,6 +29,7 @@ use PhpMyAdmin\Http\Middleware\PhpExtensionsChecking; use PhpMyAdmin\Http\Middleware\PhpSettingsConfiguration; use PhpMyAdmin\Http\Middleware\ProfilingChecking; +use PhpMyAdmin\Http\Middleware\RecentTableHandling; use PhpMyAdmin\Http\Middleware\RequestProblemChecking; use PhpMyAdmin\Http\Middleware\ResponseRendererLoading; use PhpMyAdmin\Http\Middleware\RouteParsing; @@ -114,6 +115,7 @@ public function run(bool $isSetupPage = false): void $requestHandler->add(new TokenMismatchChecking()); $requestHandler->add(new ProfilingChecking()); $requestHandler->add(new UserPreferencesLoading($this->config)); + $requestHandler->add(new RecentTableHandling($this->config)); $runner = new RequestHandlerRunner( $requestHandler, diff --git a/src/Controllers/RecentTablesListController.php b/src/Controllers/RecentTablesListController.php deleted file mode 100644 index b0538284c03c..000000000000 --- a/src/Controllers/RecentTablesListController.php +++ /dev/null @@ -1,29 +0,0 @@ -isAjax()) { - return null; - } - - $this->response->addJSON(['list' => RecentFavoriteTables::getInstance(TableType::Recent)->getHtmlList()]); - - return null; - } -} diff --git a/src/Favorites/RecentFavoriteTables.php b/src/Favorites/RecentFavoriteTables.php index 89f69d490c7b..7cf76c875e55 100644 --- a/src/Favorites/RecentFavoriteTables.php +++ b/src/Favorites/RecentFavoriteTables.php @@ -329,16 +329,6 @@ public function getHtmlSyncFavoriteTables(): string return $retval; } - /** - * Generate Html to update recent tables. - */ - public static function getHtmlUpdateRecentTables(): string - { - return ''; - } - /** * Return the name of the configuration storage table * diff --git a/src/Header.php b/src/Header.php index e0c28a42ea4a..409571c2ca4a 100644 --- a/src/Header.php +++ b/src/Header.php @@ -9,12 +9,7 @@ use PhpMyAdmin\ConfigStorage\Relation; use PhpMyAdmin\Container\ContainerBuilder; -use PhpMyAdmin\Favorites\RecentFavoriteTable; -use PhpMyAdmin\Favorites\RecentFavoriteTables; -use PhpMyAdmin\Favorites\TableType; use PhpMyAdmin\Html\Generator; -use PhpMyAdmin\Identifiers\DatabaseName; -use PhpMyAdmin\Identifiers\TableName; use PhpMyAdmin\Navigation\Navigation; use PhpMyAdmin\Theme\ThemeManager; @@ -252,22 +247,10 @@ public function disableWarnings(): void */ public function getDisplay(): string { - if ($this->headerIsSent || ! $this->isEnabled) { + if ($this->headerIsSent || ! $this->isEnabled || $this->isAjax) { return ''; } - $recentTable = ''; - if (empty($_REQUEST['recent_table']) && Current::$table !== '') { - $recentTable = $this->addRecentTable( - DatabaseName::from(Current::$database), - TableName::from(Current::$table), - ); - } - - if ($this->isAjax) { - return $recentTable; - } - $this->sendHttpHeaders(); $baseDir = defined('PMA_PATH_TO_BASEDIR') ? PMA_PATH_TO_BASEDIR : ''; @@ -359,7 +342,6 @@ public function getDisplay(): string 'menu' => $menu ?? '', 'console' => $console, 'messages' => $messages, - 'recent_table' => $recentTable, 'theme_color_mode' => $theme->getColorMode(), 'theme_color_modes' => $theme->getColorModes(), 'theme_id' => $theme->getId(), @@ -580,24 +562,6 @@ private function getCspHeaders(): array return $headers; } - /** - * Add recently used table and reload the navigation. - */ - private function addRecentTable(DatabaseName $db, TableName $table): string - { - if ($this->menuEnabled && $this->config->settings['NumRecentTables'] > 0) { - $favoriteTable = new RecentFavoriteTable($db, $table); - $error = RecentFavoriteTables::getInstance(TableType::Recent)->add($favoriteTable); - if ($error === true) { - return RecentFavoriteTables::getHtmlUpdateRecentTables(); - } - - return $error->getDisplay(); - } - - return ''; - } - /** * Returns the phpMyAdmin version to be appended to the url to avoid caching * between versions diff --git a/src/Http/Middleware/RecentTableHandling.php b/src/Http/Middleware/RecentTableHandling.php new file mode 100644 index 000000000000..ebcb21df267a --- /dev/null +++ b/src/Http/Middleware/RecentTableHandling.php @@ -0,0 +1,49 @@ +config->settings['NumRecentTables'] === 0) { + return $handler->handle($request); + } + + $response = $handler->handle($request); + + $db = DatabaseName::tryFrom($request->getParam('db')); + $table = TableName::tryFrom($request->getParam('table')); + if ($db !== null && $table !== null) { + $recentTable = new RecentFavoriteTable($db, $table); + $isAddedOrError = RecentFavoriteTables::getInstance(TableType::Recent)->add($recentTable); + if ($isAddedOrError instanceof Message) { + $response->getBody()->write($isAddedOrError->getMessage()); + } + } + + return $response; + } +} diff --git a/src/Routing/Routes.php b/src/Routing/Routes.php index fd664e271b9f..0e4f2eae96bd 100644 --- a/src/Routing/Routes.php +++ b/src/Routing/Routes.php @@ -30,7 +30,6 @@ use PhpMyAdmin\Controllers\Operations; use PhpMyAdmin\Controllers\PhpInfoController; use PhpMyAdmin\Controllers\Preferences; -use PhpMyAdmin\Controllers\RecentTablesListController; use PhpMyAdmin\Controllers\SchemaExportController; use PhpMyAdmin\Controllers\Server; use PhpMyAdmin\Controllers\Sql; @@ -172,7 +171,6 @@ public static function collect(RouteCollector $routes): void $routes->addRoute(['GET', 'POST'], '/sql', Preferences\SqlController::class); $routes->addRoute(['GET', 'POST'], '/two-factor', Preferences\TwoFactorController::class); }); - $routes->addRoute(['GET', 'POST'], '/recent-table', RecentTablesListController::class); $routes->addRoute(['GET', 'POST'], '/schema-export', SchemaExportController::class); $routes->addGroup('/server', static function (RouteCollector $routes): void { $routes->addRoute(['GET', 'POST'], '/binlog', Server\BinlogController::class); diff --git a/tests/unit/Http/Middleware/RecentTableHandlingTest.php b/tests/unit/Http/Middleware/RecentTableHandlingTest.php new file mode 100644 index 000000000000..c7a2d49aadbd --- /dev/null +++ b/tests/unit/Http/Middleware/RecentTableHandlingTest.php @@ -0,0 +1,59 @@ +createDbiDummy(); + DatabaseInterface::$instance = $this->createDatabaseInterface($dbiDummy); + + $dbiDummy->addResult('SELECT 1 FROM `test_db`.`test_table` LIMIT 1;', [['1']]); + + $config = new Config(); + $config->settings['NumRecentTables'] = 10; + + $request = ServerRequestFactory::create()->createServerRequest('GET', 'https://example.com/') + ->withQueryParams(['db' => 'test_db', 'table' => 'test_table']); + + $response = ResponseFactory::create()->createResponse(); + $handler = self::createMock(RequestHandlerInterface::class); + $handler->method('handle')->with($request)->willReturn($response); + + $reflectionProperty = new ReflectionProperty(RecentFavoriteTables::class, 'instances'); + $reflectionProperty->setValue(null, []); + $recentTables = RecentFavoriteTables::getInstance(TableType::Recent); + self::assertSame([], $recentTables->getTables()); + + $actualResponse = (new RecentTableHandling($config))->process($request, $handler); + + self::assertSame($response, $actualResponse); + self::assertSame('', (string) $actualResponse->getBody()); + self::assertEquals( + [new RecentFavoriteTable(DatabaseName::from('test_db'), TableName::from('test_table'))], + $recentTables->getTables(), + ); + + $dbiDummy->assertAllQueriesConsumed(); + $reflectionProperty->setValue(null, []); + } +} diff --git a/tests/unit/Routing/RoutesTest.php b/tests/unit/Routing/RoutesTest.php index fcc798375182..88aec2b605cb 100644 --- a/tests/unit/Routing/RoutesTest.php +++ b/tests/unit/Routing/RoutesTest.php @@ -33,7 +33,6 @@ use PhpMyAdmin\Controllers\Operations; use PhpMyAdmin\Controllers\PhpInfoController; use PhpMyAdmin\Controllers\Preferences; -use PhpMyAdmin\Controllers\RecentTablesListController; use PhpMyAdmin\Controllers\SchemaExportController; use PhpMyAdmin\Controllers\Server; use PhpMyAdmin\Controllers\Sql; @@ -100,7 +99,6 @@ public function testCollect(): void '/preferences/navigation' => Preferences\NavigationController::class, '/preferences/sql' => Preferences\SqlController::class, '/preferences/two-factor' => Preferences\TwoFactorController::class, - '/recent-table' => RecentTablesListController::class, '/schema-export' => SchemaExportController::class, '/server/binlog' => Server\BinlogController::class, '/server/collations' => Server\CollationsController::class, @@ -238,7 +236,6 @@ public function testCollect(): void '/preferences/navigation' => Preferences\NavigationController::class, '/preferences/sql' => Preferences\SqlController::class, '/preferences/two-factor' => Preferences\TwoFactorController::class, - '/recent-table' => RecentTablesListController::class, '/schema-export' => SchemaExportController::class, '/server/binlog' => Server\BinlogController::class, '/server/databases' => Server\DatabasesController::class,