diff options
author | Maurício Meneghini Fauth <mauricio@fauth.dev> | 2022-09-21 06:06:14 +0300 |
---|---|---|
committer | Maurício Meneghini Fauth <mauricio@fauth.dev> | 2022-09-21 06:06:14 +0300 |
commit | a56b425a2a5c3cc16d170d3c3f503bd899949326 (patch) | |
tree | 7f36a5e66c51d9b9e38ed49914c8cb68d5ea6e2c | |
parent | c2018c4c2195fc26f188e15ae56a0a30e385174f (diff) |
Extract /console/bookmark/add action from ImportController
Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
-rw-r--r-- | js/src/modules/console.js | 3 | ||||
-rw-r--r-- | libraries/classes/Controllers/Console/Bookmark/AddController.php | 58 | ||||
-rw-r--r-- | libraries/classes/Controllers/Import/ImportController.php | 27 | ||||
-rw-r--r-- | libraries/routes.php | 7 | ||||
-rw-r--r-- | libraries/services_controllers.php | 4 | ||||
-rw-r--r-- | test/classes/Controllers/Console/Bookmark/AddControllerTest.php | 97 |
6 files changed, 165 insertions, 31 deletions
diff --git a/js/src/modules/console.js b/js/src/modules/console.js index 24cc89036a..d1f47b6d50 100644 --- a/js/src/modules/console.js +++ b/js/src/modules/console.js @@ -1086,10 +1086,9 @@ var ConsoleBookmarks = { return; } $(this).prop('disabled', true); - $.post('index.php?route=/import', + $.post('index.php?route=/console/bookmark/add', { 'ajax_request': true, - 'console_bookmark_add': 'true', 'label': $('#pma_bookmarks').find('.card.add [name=label]').val(), 'server': window.CommonParams.get('server'), 'db': $('#pma_bookmarks').find('.card.add [name=targetdb]').val(), diff --git a/libraries/classes/Controllers/Console/Bookmark/AddController.php b/libraries/classes/Controllers/Console/Bookmark/AddController.php new file mode 100644 index 0000000000..42b7ee6c09 --- /dev/null +++ b/libraries/classes/Controllers/Console/Bookmark/AddController.php @@ -0,0 +1,58 @@ +<?php + +declare(strict_types=1); + +namespace PhpMyAdmin\Controllers\Console\Bookmark; + +use PhpMyAdmin\Bookmark; +use PhpMyAdmin\Controllers\AbstractController; +use PhpMyAdmin\DatabaseInterface; +use PhpMyAdmin\Http\ServerRequest; +use PhpMyAdmin\ResponseRenderer; +use PhpMyAdmin\Template; + +use function __; +use function is_string; + +final class AddController extends AbstractController +{ + /** @var DatabaseInterface */ + private $dbi; + + public function __construct(ResponseRenderer $response, Template $template, DatabaseInterface $dbi) + { + parent::__construct($response, $template); + $this->dbi = $dbi; + } + + public function __invoke(ServerRequest $request): void + { + $db = $request->getParsedBodyParam('db'); + $label = $request->getParsedBodyParam('label'); + $bookmarkQuery = $request->getParsedBodyParam('bookmark_query'); + $shared = $request->getParsedBodyParam('shared'); + + if (! is_string($label) || ! is_string($db) || ! is_string($bookmarkQuery) || ! is_string($shared)) { + $this->response->addJSON('message', __('Incomplete params')); + + return; + } + + $bookmarkFields = [ + 'bkm_database' => $db, + 'bkm_user' => $GLOBALS['cfg']['Server']['user'], + 'bkm_sql_query' => $bookmarkQuery, + 'bkm_label' => $label, + ]; + $bookmark = Bookmark::createBookmark($this->dbi, $bookmarkFields, $shared === 'true'); + if ($bookmark === false || ! $bookmark->save()) { + $this->response->addJSON('message', __('Failed')); + + return; + } + + $this->response->addJSON('message', __('Succeeded')); + $this->response->addJSON('data', $bookmarkFields); + $this->response->addJSON('isShared', $shared === 'true'); + } +} diff --git a/libraries/classes/Controllers/Import/ImportController.php b/libraries/classes/Controllers/Import/ImportController.php index f4b1deaf03..a317f15e55 100644 --- a/libraries/classes/Controllers/Import/ImportController.php +++ b/libraries/classes/Controllers/Import/ImportController.php @@ -118,33 +118,6 @@ final class ImportController extends AbstractController $GLOBALS['local_import_file'] = $_POST['local_import_file'] ?? null; $GLOBALS['show_as_php'] = $_POST['show_as_php'] ?? null; - // If it's a console bookmark add request - if (isset($_POST['console_bookmark_add'])) { - if (! isset($_POST['label'], $_POST['db'], $_POST['bookmark_query'], $_POST['shared'])) { - $this->response->addJSON('message', __('Incomplete params')); - - return; - } - - $bookmarkFields = [ - 'bkm_database' => $_POST['db'], - 'bkm_user' => $GLOBALS['cfg']['Server']['user'], - 'bkm_sql_query' => $_POST['bookmark_query'], - 'bkm_label' => $_POST['label'], - ]; - $isShared = ($_POST['shared'] === 'true'); - $bookmark = Bookmark::createBookmark($this->dbi, $bookmarkFields, $isShared); - if ($bookmark !== false && $bookmark->save()) { - $this->response->addJSON('message', __('Succeeded')); - $this->response->addJSON('data', $bookmarkFields); - $this->response->addJSON('isShared', $isShared); - } else { - $this->response->addJSON('message', __('Failed')); - } - - return; - } - // reset import messages for ajax request $_SESSION['Import_message']['message'] = null; $_SESSION['Import_message']['go_back_url'] = null; diff --git a/libraries/routes.php b/libraries/routes.php index 05d18944d4..9eadbe66bd 100644 --- a/libraries/routes.php +++ b/libraries/routes.php @@ -9,7 +9,7 @@ use PhpMyAdmin\Controllers\CheckRelationsController; use PhpMyAdmin\Controllers\CollationConnectionController; use PhpMyAdmin\Controllers\ColumnController; use PhpMyAdmin\Controllers\Config; -use PhpMyAdmin\Controllers\Console\Bookmark\RefreshController; +use PhpMyAdmin\Controllers\Console\Bookmark; use PhpMyAdmin\Controllers\Database; use PhpMyAdmin\Controllers\DatabaseController; use PhpMyAdmin\Controllers\ErrorReportController; @@ -54,7 +54,10 @@ return static function (RouteCollector $routes): void { $routes->post('/get', Config\GetConfigController::class); $routes->post('/set', Config\SetConfigController::class); }); - $routes->get('/console/bookmark/refresh', RefreshController::class); + $routes->addGroup('/console/bookmark', static function (RouteCollector $routes): void { + $routes->post('/add', Bookmark\AddController::class); + $routes->get('/refresh', Bookmark\RefreshController::class); + }); $routes->addGroup('/database', static function (RouteCollector $routes): void { $routes->addGroup('/central-columns', static function (RouteCollector $routes): void { $routes->addRoute(['GET', 'POST'], '', Database\CentralColumnsController::class); diff --git a/libraries/services_controllers.php b/libraries/services_controllers.php index ffbb1f6772..75ea182533 100644 --- a/libraries/services_controllers.php +++ b/libraries/services_controllers.php @@ -96,6 +96,10 @@ return [ '$config' => '@config', ], ], + Console\Bookmark\AddController::class => [ + 'class' => Console\Bookmark\AddController::class, + 'arguments' => ['$response' => '@response', '$template' => '@template', '$dbi' => '@dbi'], + ], Console\Bookmark\RefreshController::class => [ 'class' => Console\Bookmark\RefreshController::class, 'arguments' => ['$response' => '@response', '$template' => '@template'], diff --git a/test/classes/Controllers/Console/Bookmark/AddControllerTest.php b/test/classes/Controllers/Console/Bookmark/AddControllerTest.php new file mode 100644 index 0000000000..29b2cf29de --- /dev/null +++ b/test/classes/Controllers/Console/Bookmark/AddControllerTest.php @@ -0,0 +1,97 @@ +<?php + +declare(strict_types=1); + +namespace PhpMyAdmin\Tests\Controllers\Console\Bookmark; + +use PhpMyAdmin\ConfigStorage\RelationParameters; +use PhpMyAdmin\Controllers\Console\Bookmark\AddController; +use PhpMyAdmin\Http\ServerRequest; +use PhpMyAdmin\Template; +use PhpMyAdmin\Tests\AbstractTestCase; +use PhpMyAdmin\Tests\Stubs\ResponseRenderer; + +/** + * @covers \PhpMyAdmin\Controllers\Console\Bookmark\AddController + */ +class AddControllerTest extends AbstractTestCase +{ + public function testWithInvalidParams(): void + { + $dbi = $this->createDatabaseInterface(); + $GLOBALS['dbi'] = $dbi; + $response = new ResponseRenderer(); + $request = $this->createStub(ServerRequest::class); + $request->method('getParsedBodyParam')->willReturnMap([ + ['db', null, null], + ['label', null, null], + ['bookmark_query', null, null], + ['shared', null, null], + ]); + $controller = new AddController($response, new Template(), $dbi); + $controller($request); + $this->assertSame(['message' => 'Incomplete params'], $response->getJSONResult()); + } + + public function testWithoutRelationParameters(): void + { + $GLOBALS['cfg']['Server']['user'] = 'user'; + $_SESSION['relation'] = []; + $dbi = $this->createDatabaseInterface(); + $GLOBALS['dbi'] = $dbi; + $response = new ResponseRenderer(); + $request = $this->createStub(ServerRequest::class); + $request->method('getParsedBodyParam')->willReturnMap([ + ['db', null, 'test'], + ['label', null, 'test'], + ['bookmark_query', null, 'test'], + ['shared', null, 'test'], + ]); + $controller = new AddController($response, new Template(), $dbi); + $controller($request); + $this->assertSame(['message' => 'Failed'], $response->getJSONResult()); + } + + public function testWithValidParameters(): void + { + $GLOBALS['cfg']['Server']['user'] = 'test_user'; + $GLOBALS['server'] = 1; + $_SESSION['relation'] = []; + $_SESSION['relation'][$GLOBALS['server']] = RelationParameters::fromArray([ + 'user' => 'test_user', + 'db' => 'pmadb', + 'bookmarkwork' => true, + 'bookmark' => 'bookmark', + ])->toArray(); + + $dbiDummy = $this->createDbiDummy(); + // phpcs:ignore Generic.Files.LineLength.TooLong + $dbiDummy->addResult('INSERT INTO `pmadb`.`bookmark` (id, dbase, user, query, label) VALUES (NULL, \'test_db\', \'\', \'test_query\', \'test_label\')', []); + $dbi = $this->createDatabaseInterface($dbiDummy); + $GLOBALS['dbi'] = $dbi; + $response = new ResponseRenderer(); + $request = $this->createStub(ServerRequest::class); + $request->method('getParsedBodyParam')->willReturnMap([ + ['db', null, 'test_db'], + ['label', null, 'test_label'], + ['bookmark_query', null, 'test_query'], + ['shared', null, 'true'], + ]); + $controller = new AddController($response, new Template(), $dbi); + $controller($request); + $this->assertSame( + [ + 'message' => 'Succeeded', + 'data' => [ + 'bkm_database' => 'test_db', + 'bkm_user' => 'test_user', + 'bkm_sql_query' => 'test_query', + 'bkm_label' => 'test_label', + ], + 'isShared' => true, + ], + $response->getJSONResult() + ); + $dbiDummy->assertAllQueriesConsumed(); + } +} |