diff --git a/app/services_controllers.php b/app/services_controllers.php
index cb57780806..b5a6f44e87 100644
--- a/app/services_controllers.php
+++ b/app/services_controllers.php
@@ -8,7 +8,6 @@ use PhpMyAdmin\Controllers\ChangeLogController;
use PhpMyAdmin\Controllers\CheckRelationsController;
use PhpMyAdmin\Controllers\CollationConnectionController;
use PhpMyAdmin\Controllers\ColumnController;
-use PhpMyAdmin\Controllers\Config;
use PhpMyAdmin\Controllers\Console;
use PhpMyAdmin\Controllers\Database;
use PhpMyAdmin\Controllers\DatabaseController;
@@ -22,6 +21,7 @@ use PhpMyAdmin\Controllers\JavaScriptMessagesController;
use PhpMyAdmin\Controllers\LicenseController;
use PhpMyAdmin\Controllers\LintController;
use PhpMyAdmin\Controllers\LogoutController;
+use PhpMyAdmin\Controllers\Navigation\UpdateNavWidthConfigController;
use PhpMyAdmin\Controllers\NavigationController;
use PhpMyAdmin\Controllers\Normalization;
use PhpMyAdmin\Controllers\Operations;
@@ -73,8 +73,8 @@ return [
'class' => ColumnController::class,
'arguments' => ['$response' => '@response', '$template' => '@template', '$dbi' => '@dbi'],
],
- Config\SetConfigController::class => [
- 'class' => Config\SetConfigController::class,
+ UpdateNavWidthConfigController::class => [
+ 'class' => UpdateNavWidthConfigController::class,
'arguments' => ['$response' => '@response', '$template' => '@template', '$config' => '@config'],
],
Console\Bookmark\AddController::class => [
diff --git a/psalm-baseline.xml b/psalm-baseline.xml
index 9b0d47fc6f..fa16cf5303 100644
--- a/psalm-baseline.xml
+++ b/psalm-baseline.xml
@@ -854,11 +854,6 @@
-
-
-
-
-
@@ -12565,6 +12560,12 @@
+
+
+
+
+
+
diff --git a/resources/js/src/modules/functions/config.ts b/resources/js/src/modules/functions/config.ts
index 8422a990e6..a2ea8e20f9 100644
--- a/resources/js/src/modules/functions/config.ts
+++ b/resources/js/src/modules/functions/config.ts
@@ -4,7 +4,7 @@ import { CommonParams } from '../common.ts';
export function setConfigValue (value: number): void {
$.ajax({
- url: 'index.php?route=/config/set',
+ url: 'index.php?route=/navigation/update-width',
type: 'POST',
dataType: 'json',
data: {
diff --git a/src/Controllers/Config/SetConfigController.php b/src/Controllers/Navigation/UpdateNavWidthConfigController.php
similarity index 81%
rename from src/Controllers/Config/SetConfigController.php
rename to src/Controllers/Navigation/UpdateNavWidthConfigController.php
index fd6b26d786..3a1c0c4afe 100644
--- a/src/Controllers/Config/SetConfigController.php
+++ b/src/Controllers/Navigation/UpdateNavWidthConfigController.php
@@ -2,7 +2,7 @@
declare(strict_types=1);
-namespace PhpMyAdmin\Controllers\Config;
+namespace PhpMyAdmin\Controllers\Navigation;
use PhpMyAdmin\Config;
use PhpMyAdmin\Controllers\AbstractController;
@@ -11,11 +11,12 @@ use PhpMyAdmin\Message;
use PhpMyAdmin\ResponseRenderer;
use PhpMyAdmin\Template;
+use function __;
use function is_numeric;
-final class SetConfigController extends AbstractController
+final class UpdateNavWidthConfigController extends AbstractController
{
- public function __construct(ResponseRenderer $response, Template $template, private Config $config)
+ public function __construct(ResponseRenderer $response, Template $template, private readonly Config $config)
{
parent::__construct($response, $template);
}
@@ -25,13 +26,12 @@ final class SetConfigController extends AbstractController
$value = $request->getParsedBodyParam('value');
if (! is_numeric($value) || $value < 0) {
$this->response->setRequestStatus(false);
- $this->response->addJSON(['message' => Message::error()]);
+ $this->response->addJSON(['message' => Message::error(__('Unexpected parameter value.'))]);
return;
}
$result = $this->config->setUserValue(null, 'NavigationWidth', (int) $value);
-
if ($result === true) {
return;
}
diff --git a/src/Routing/Routes.php b/src/Routing/Routes.php
index 919b7a740d..fd664e271b 100644
--- a/src/Routing/Routes.php
+++ b/src/Routing/Routes.php
@@ -10,7 +10,6 @@ use PhpMyAdmin\Controllers\ChangeLogController;
use PhpMyAdmin\Controllers\CheckRelationsController;
use PhpMyAdmin\Controllers\CollationConnectionController;
use PhpMyAdmin\Controllers\ColumnController;
-use PhpMyAdmin\Controllers\Config;
use PhpMyAdmin\Controllers\Console\Bookmark;
use PhpMyAdmin\Controllers\Console\UpdateConfigController;
use PhpMyAdmin\Controllers\Database;
@@ -25,6 +24,7 @@ use PhpMyAdmin\Controllers\JavaScriptMessagesController;
use PhpMyAdmin\Controllers\LicenseController;
use PhpMyAdmin\Controllers\LintController;
use PhpMyAdmin\Controllers\LogoutController;
+use PhpMyAdmin\Controllers\Navigation\UpdateNavWidthConfigController;
use PhpMyAdmin\Controllers\NavigationController;
use PhpMyAdmin\Controllers\Normalization;
use PhpMyAdmin\Controllers\Operations;
@@ -54,9 +54,6 @@ final class Routes
$routes->addRoute(['GET', 'POST'], '/check-relations', CheckRelationsController::class);
$routes->post('/collation-connection', CollationConnectionController::class);
$routes->post('/columns', ColumnController::class);
- $routes->addGroup('/config', static function (RouteCollector $routes): void {
- $routes->post('/set', Config\SetConfigController::class);
- });
$routes->addGroup('/console', static function (RouteCollector $routes): void {
$routes->addGroup('/bookmark', static function (RouteCollector $routes): void {
$routes->post('/add', Bookmark\AddController::class);
@@ -142,7 +139,10 @@ final class Routes
$routes->addRoute(['GET', 'POST'], '/lint', LintController::class);
$routes->addRoute(['GET', 'POST'], '/logout', LogoutController::class);
$routes->get('/messages', JavaScriptMessagesController::class);
- $routes->addRoute(['GET', 'POST'], '/navigation', NavigationController::class);
+ $routes->addGroup('/navigation', static function (RouteCollector $routes): void {
+ $routes->addRoute(['GET', 'POST'], '', NavigationController::class);
+ $routes->post('/update-width', UpdateNavWidthConfigController::class);
+ });
$routes->addGroup('/normalization', static function (RouteCollector $routes): void {
$routes->addRoute(['GET', 'POST'], '', Normalization\MainController::class);
$routes->post('/1nf/step1', Normalization\FirstNormalForm\FirstStepController::class);
diff --git a/tests/unit/Controllers/Navigation/UpdateNavWidthConfigControllerTest.php b/tests/unit/Controllers/Navigation/UpdateNavWidthConfigControllerTest.php
new file mode 100644
index 0000000000..00c6eac8c9
--- /dev/null
+++ b/tests/unit/Controllers/Navigation/UpdateNavWidthConfigControllerTest.php
@@ -0,0 +1,89 @@
+createServerRequest('POST', 'https://example.com/')
+ ->withParsedBody(['value' => $value]);
+
+ $config = new Config();
+ $responseRenderer = new ResponseRenderer();
+ $controller = new UpdateNavWidthConfigController($responseRenderer, new Template($config), $config);
+ $controller($request);
+
+ self::assertSame($expected, $config->settings['NavigationWidth']);
+ self::assertSame([], $responseRenderer->getJSONResult());
+ self::assertTrue($responseRenderer->hasSuccessState(), 'Should be a successful response.');
+ }
+
+ /** @return iterable */
+ public static function validParamsProvider(): iterable
+ {
+ yield ['0', 0];
+ yield ['1', 1];
+ yield ['240', 240];
+ }
+
+ /** @param string|string[] $value */
+ #[DataProvider('invalidParamsProvider')]
+ public function testInvalidParams(array|string $value): void
+ {
+ $request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/')
+ ->withParsedBody(['value' => $value]);
+
+ $config = new Config();
+ $responseRenderer = new ResponseRenderer();
+ $controller = new UpdateNavWidthConfigController($responseRenderer, new Template($config), $config);
+ $controller($request);
+
+ self::assertSame(
+ ['message' => Message::error('Unexpected parameter value.')->getDisplay()],
+ $responseRenderer->getJSONResult(),
+ );
+ self::assertFalse($responseRenderer->hasSuccessState(), 'Should be a failed response.');
+ }
+
+ /** @return iterable */
+ public static function invalidParamsProvider(): iterable
+ {
+ yield [''];
+ yield ['invalid'];
+ yield [['invalid']];
+ yield ['-1'];
+ }
+
+ public function testFailedConfigSaving(): void
+ {
+ $request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/')
+ ->withParsedBody(['value' => '240']);
+
+ $config = self::createStub(Config::class);
+ $config->method('setUserValue')->willReturn(Message::error('Could not save configuration'));
+ $responseRenderer = new ResponseRenderer();
+ $controller = new UpdateNavWidthConfigController($responseRenderer, new Template($config), $config);
+ $controller($request);
+
+ self::assertSame(
+ ['message' => Message::error('Could not save configuration')->getDisplay()],
+ $responseRenderer->getJSONResult(),
+ );
+ self::assertFalse($responseRenderer->hasSuccessState(), 'Should be a failed response.');
+ }
+}
diff --git a/tests/unit/Routing/RoutesTest.php b/tests/unit/Routing/RoutesTest.php
index 1c85db204e..fcc7983751 100644
--- a/tests/unit/Routing/RoutesTest.php
+++ b/tests/unit/Routing/RoutesTest.php
@@ -12,7 +12,6 @@ use PhpMyAdmin\Controllers\ChangeLogController;
use PhpMyAdmin\Controllers\CheckRelationsController;
use PhpMyAdmin\Controllers\CollationConnectionController;
use PhpMyAdmin\Controllers\ColumnController;
-use PhpMyAdmin\Controllers\Config;
use PhpMyAdmin\Controllers\Console\Bookmark;
use PhpMyAdmin\Controllers\Console\UpdateConfigController;
use PhpMyAdmin\Controllers\Database;
@@ -28,6 +27,7 @@ use PhpMyAdmin\Controllers\JavaScriptMessagesController;
use PhpMyAdmin\Controllers\LicenseController;
use PhpMyAdmin\Controllers\LintController;
use PhpMyAdmin\Controllers\LogoutController;
+use PhpMyAdmin\Controllers\Navigation\UpdateNavWidthConfigController;
use PhpMyAdmin\Controllers\NavigationController;
use PhpMyAdmin\Controllers\Normalization;
use PhpMyAdmin\Controllers\Operations;
@@ -162,7 +162,6 @@ final class RoutesTest extends TestCase
'/check-relations' => CheckRelationsController::class,
'/collation-connection' => CollationConnectionController::class,
'/columns' => ColumnController::class,
- '/config/set' => Config\SetConfigController::class,
'/console/bookmark/add' => Bookmark\AddController::class,
'/console/update-config' => UpdateConfigController::class,
'/database/central-columns' => Database\CentralColumnsController::class,
@@ -214,6 +213,7 @@ final class RoutesTest extends TestCase
'/lint' => LintController::class,
'/logout' => LogoutController::class,
'/navigation' => NavigationController::class,
+ '/navigation/update-width' => UpdateNavWidthConfigController::class,
'/normalization' => Normalization\MainController::class,
'/normalization/1nf/step1' => Normalization\FirstNormalForm\FirstStepController::class,
'/normalization/1nf/step2' => Normalization\FirstNormalForm\SecondStepController::class,