Skip to content

Commit

Permalink
Merge pull request #19111 from MauricioFauth/recent-tables-controller…
Browse files Browse the repository at this point in the history
…-removal

Extract recent table handling from Header into a middleware
  • Loading branch information
MauricioFauth committed Apr 15, 2024
2 parents 6c62f2e + 9b25d12 commit a6c1a62
Show file tree
Hide file tree
Showing 13 changed files with 112 additions and 108 deletions.
5 changes: 0 additions & 5 deletions app/services_controllers.php
Expand Up @@ -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;
Expand Down Expand Up @@ -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' => [
Expand Down
2 changes: 1 addition & 1 deletion phpstan-baseline.neon
Expand Up @@ -8217,7 +8217,7 @@ parameters:

-
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
count: 8
count: 7
path: src/Header.php

-
Expand Down
6 changes: 0 additions & 6 deletions psalm-baseline.xml
Expand Up @@ -2554,11 +2554,6 @@
<code><![CDATA[__construct]]></code>
</PossiblyUnusedMethod>
</file>
<file src="src/Controllers/RecentTablesListController.php">
<PossiblyUnusedMethod>
<code><![CDATA[__construct]]></code>
</PossiblyUnusedMethod>
</file>
<file src="src/Controllers/SchemaExportController.php">
<PossiblyUnusedReturnValue>
<code><![CDATA[Response|null]]></code>
Expand Down Expand Up @@ -6533,7 +6528,6 @@
<RiskyTruthyFalsyComparison>
<code><![CDATA[! $this->config->get('DisableShortcutKeys')]]></code>
<code><![CDATA[empty($_REQUEST['message'])]]></code>
<code><![CDATA[empty($_REQUEST['recent_table'])]]></code>
</RiskyTruthyFalsyComparison>
</file>
<file src="src/Html/Generator.php">
Expand Down
14 changes: 0 additions & 14 deletions resources/js/src/modules/functions.ts
Expand Up @@ -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;
Expand Down
1 change: 0 additions & 1 deletion resources/templates/header.twig
Expand Up @@ -117,7 +117,6 @@
<div id="page_content">
{{ messages|raw }}

{{ recent_table|raw }}
{%- if is_logged_in -%}
{{ include('modals/preview_sql_modal.twig') }}
{{ include('modals/enum_set_editor.twig') }}
Expand Down
2 changes: 2 additions & 0 deletions src/Application.php
Expand Up @@ -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;
Expand Down Expand Up @@ -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));

Check warning on line 118 in src/Application.php

View workflow job for this annotation

GitHub Actions / Infection (8.2, ubuntu-latest)

Escaped Mutant for Mutator "MethodCallRemoval": --- Original +++ New @@ @@ $requestHandler->add(new TokenMismatchChecking()); $requestHandler->add(new ProfilingChecking()); $requestHandler->add(new UserPreferencesLoading($this->config)); - $requestHandler->add(new RecentTableHandling($this->config)); + $runner = new RequestHandlerRunner($requestHandler, new SapiEmitter(), static fn(): ServerRequestInterface => ServerRequestFactory::create()->fromGlobals()->withAttribute('isSetupPage', $isSetupPage), function (Throwable $throwable): ResponseInterface { $response = $this->responseFactory->createResponse(StatusCodeInterface::STATUS_INTERNAL_SERVER_ERROR); $response->getBody()->write(sprintf('An error occurred: %s', $throwable->getMessage()));

$runner = new RequestHandlerRunner(
$requestHandler,
Expand Down
29 changes: 0 additions & 29 deletions src/Controllers/RecentTablesListController.php

This file was deleted.

10 changes: 0 additions & 10 deletions src/Favorites/RecentFavoriteTables.php
Expand Up @@ -329,16 +329,6 @@ public function getHtmlSyncFavoriteTables(): string
return $retval;
}

/**
* Generate Html to update recent tables.
*/
public static function getHtmlUpdateRecentTables(): string
{
return '<a class="hide" id="update_recent_tables" href="'
. Url::getFromRoute('/recent-table', ['ajax_request' => true, 'recent_table' => true])
. '"></a>';
}

/**
* Return the name of the configuration storage table
*
Expand Down
38 changes: 1 addition & 37 deletions src/Header.php
Expand Up @@ -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;

Expand Down Expand Up @@ -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 : '';
Expand Down Expand Up @@ -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(),
Expand Down Expand Up @@ -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
Expand Down
49 changes: 49 additions & 0 deletions src/Http/Middleware/RecentTableHandling.php
@@ -0,0 +1,49 @@
<?php

declare(strict_types=1);

namespace PhpMyAdmin\Http\Middleware;

use PhpMyAdmin\Config;
use PhpMyAdmin\Favorites\RecentFavoriteTable;
use PhpMyAdmin\Favorites\RecentFavoriteTables;
use PhpMyAdmin\Favorites\TableType;
use PhpMyAdmin\Http\ServerRequest;
use PhpMyAdmin\Identifiers\DatabaseName;
use PhpMyAdmin\Identifiers\TableName;
use PhpMyAdmin\Message;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

use function assert;

final class RecentTableHandling implements MiddlewareInterface
{
public function __construct(private readonly Config $config)
{
}

public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
assert($request instanceof ServerRequest);
if ($this->config->settings['NumRecentTables'] === 0) {

Check warning on line 31 in src/Http/Middleware/RecentTableHandling.php

View workflow job for this annotation

GitHub Actions / Infection (8.2, ubuntu-latest)

Escaped Mutant for Mutator "DecrementInteger": --- Original +++ New @@ @@ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { assert($request instanceof ServerRequest); - if ($this->config->settings['NumRecentTables'] === 0) { + if ($this->config->settings['NumRecentTables'] === -1) { return $handler->handle($request); } $response = $handler->handle($request);
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) {

Check warning on line 39 in src/Http/Middleware/RecentTableHandling.php

View workflow job for this annotation

GitHub Actions / Infection (8.2, ubuntu-latest)

Escaped Mutant for Mutator "LogicalAnd": --- Original +++ New @@ @@ $response = $handler->handle($request); $db = DatabaseName::tryFrom($request->getParam('db')); $table = TableName::tryFrom($request->getParam('table')); - if ($db !== null && $table !== null) { + if ($db !== null || $table !== null) { $recentTable = new RecentFavoriteTable($db, $table); $isAddedOrError = RecentFavoriteTables::getInstance(TableType::Recent)->add($recentTable); if ($isAddedOrError instanceof Message) {
$recentTable = new RecentFavoriteTable($db, $table);
$isAddedOrError = RecentFavoriteTables::getInstance(TableType::Recent)->add($recentTable);
if ($isAddedOrError instanceof Message) {

Check warning on line 42 in src/Http/Middleware/RecentTableHandling.php

View workflow job for this annotation

GitHub Actions / Infection (8.2, ubuntu-latest)

Escaped Mutant for Mutator "InstanceOf_": --- Original +++ New @@ @@ if ($db !== null && $table !== null) { $recentTable = new RecentFavoriteTable($db, $table); $isAddedOrError = RecentFavoriteTables::getInstance(TableType::Recent)->add($recentTable); - if ($isAddedOrError instanceof Message) { + if (false) { $response->getBody()->write($isAddedOrError->getMessage()); } }
$response->getBody()->write($isAddedOrError->getMessage());
}
}

return $response;
}
}
2 changes: 0 additions & 2 deletions src/Routing/Routes.php
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
59 changes: 59 additions & 0 deletions tests/unit/Http/Middleware/RecentTableHandlingTest.php
@@ -0,0 +1,59 @@
<?php

declare(strict_types=1);

namespace PhpMyAdmin\Tests\Http\Middleware;

use PhpMyAdmin\Config;
use PhpMyAdmin\DatabaseInterface;
use PhpMyAdmin\Favorites\RecentFavoriteTable;
use PhpMyAdmin\Favorites\RecentFavoriteTables;
use PhpMyAdmin\Favorites\TableType;
use PhpMyAdmin\Http\Factory\ResponseFactory;
use PhpMyAdmin\Http\Factory\ServerRequestFactory;
use PhpMyAdmin\Http\Middleware\RecentTableHandling;
use PhpMyAdmin\Identifiers\DatabaseName;
use PhpMyAdmin\Identifiers\TableName;
use PhpMyAdmin\Tests\AbstractTestCase;
use PHPUnit\Framework\Attributes\CoversClass;
use Psr\Http\Server\RequestHandlerInterface;
use ReflectionProperty;

#[CoversClass(RecentTableHandling::class)]
final class RecentTableHandlingTest extends AbstractTestCase
{
public function testProcess(): void
{
$dbiDummy = $this->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, []);
}
}
3 changes: 0 additions & 3 deletions tests/unit/Routing/RoutesTest.php
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit a6c1a62

Please sign in to comment.