Skip to content

Commit a56b425

Browse files
committed
Extract /console/bookmark/add action from ImportController
Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
1 parent c2018c4 commit a56b425

6 files changed

Lines changed: 165 additions & 31 deletions

File tree

js/src/modules/console.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,10 +1086,9 @@ var ConsoleBookmarks = {
10861086
return;
10871087
}
10881088
$(this).prop('disabled', true);
1089-
$.post('index.php?route=/import',
1089+
$.post('index.php?route=/console/bookmark/add',
10901090
{
10911091
'ajax_request': true,
1092-
'console_bookmark_add': 'true',
10931092
'label': $('#pma_bookmarks').find('.card.add [name=label]').val(),
10941093
'server': window.CommonParams.get('server'),
10951094
'db': $('#pma_bookmarks').find('.card.add [name=targetdb]').val(),
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpMyAdmin\Controllers\Console\Bookmark;
6+
7+
use PhpMyAdmin\Bookmark;
8+
use PhpMyAdmin\Controllers\AbstractController;
9+
use PhpMyAdmin\DatabaseInterface;
10+
use PhpMyAdmin\Http\ServerRequest;
11+
use PhpMyAdmin\ResponseRenderer;
12+
use PhpMyAdmin\Template;
13+
14+
use function __;
15+
use function is_string;
16+
17+
final class AddController extends AbstractController
18+
{
19+
/** @var DatabaseInterface */
20+
private $dbi;
21+
22+
public function __construct(ResponseRenderer $response, Template $template, DatabaseInterface $dbi)
23+
{
24+
parent::__construct($response, $template);
25+
$this->dbi = $dbi;
26+
}
27+
28+
public function __invoke(ServerRequest $request): void
29+
{
30+
$db = $request->getParsedBodyParam('db');
31+
$label = $request->getParsedBodyParam('label');
32+
$bookmarkQuery = $request->getParsedBodyParam('bookmark_query');
33+
$shared = $request->getParsedBodyParam('shared');
34+
35+
if (! is_string($label) || ! is_string($db) || ! is_string($bookmarkQuery) || ! is_string($shared)) {
36+
$this->response->addJSON('message', __('Incomplete params'));
37+
38+
return;
39+
}
40+
41+
$bookmarkFields = [
42+
'bkm_database' => $db,
43+
'bkm_user' => $GLOBALS['cfg']['Server']['user'],
44+
'bkm_sql_query' => $bookmarkQuery,
45+
'bkm_label' => $label,
46+
];
47+
$bookmark = Bookmark::createBookmark($this->dbi, $bookmarkFields, $shared === 'true');
48+
if ($bookmark === false || ! $bookmark->save()) {
49+
$this->response->addJSON('message', __('Failed'));
50+
51+
return;
52+
}
53+
54+
$this->response->addJSON('message', __('Succeeded'));
55+
$this->response->addJSON('data', $bookmarkFields);
56+
$this->response->addJSON('isShared', $shared === 'true');
57+
}
58+
}

libraries/classes/Controllers/Import/ImportController.php

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -118,33 +118,6 @@ public function __invoke(ServerRequest $request): void
118118
$GLOBALS['local_import_file'] = $_POST['local_import_file'] ?? null;
119119
$GLOBALS['show_as_php'] = $_POST['show_as_php'] ?? null;
120120

121-
// If it's a console bookmark add request
122-
if (isset($_POST['console_bookmark_add'])) {
123-
if (! isset($_POST['label'], $_POST['db'], $_POST['bookmark_query'], $_POST['shared'])) {
124-
$this->response->addJSON('message', __('Incomplete params'));
125-
126-
return;
127-
}
128-
129-
$bookmarkFields = [
130-
'bkm_database' => $_POST['db'],
131-
'bkm_user' => $GLOBALS['cfg']['Server']['user'],
132-
'bkm_sql_query' => $_POST['bookmark_query'],
133-
'bkm_label' => $_POST['label'],
134-
];
135-
$isShared = ($_POST['shared'] === 'true');
136-
$bookmark = Bookmark::createBookmark($this->dbi, $bookmarkFields, $isShared);
137-
if ($bookmark !== false && $bookmark->save()) {
138-
$this->response->addJSON('message', __('Succeeded'));
139-
$this->response->addJSON('data', $bookmarkFields);
140-
$this->response->addJSON('isShared', $isShared);
141-
} else {
142-
$this->response->addJSON('message', __('Failed'));
143-
}
144-
145-
return;
146-
}
147-
148121
// reset import messages for ajax request
149122
$_SESSION['Import_message']['message'] = null;
150123
$_SESSION['Import_message']['go_back_url'] = null;

libraries/routes.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
use PhpMyAdmin\Controllers\CollationConnectionController;
1010
use PhpMyAdmin\Controllers\ColumnController;
1111
use PhpMyAdmin\Controllers\Config;
12-
use PhpMyAdmin\Controllers\Console\Bookmark\RefreshController;
12+
use PhpMyAdmin\Controllers\Console\Bookmark;
1313
use PhpMyAdmin\Controllers\Database;
1414
use PhpMyAdmin\Controllers\DatabaseController;
1515
use PhpMyAdmin\Controllers\ErrorReportController;
@@ -54,7 +54,10 @@
5454
$routes->post('/get', Config\GetConfigController::class);
5555
$routes->post('/set', Config\SetConfigController::class);
5656
});
57-
$routes->get('/console/bookmark/refresh', RefreshController::class);
57+
$routes->addGroup('/console/bookmark', static function (RouteCollector $routes): void {
58+
$routes->post('/add', Bookmark\AddController::class);
59+
$routes->get('/refresh', Bookmark\RefreshController::class);
60+
});
5861
$routes->addGroup('/database', static function (RouteCollector $routes): void {
5962
$routes->addGroup('/central-columns', static function (RouteCollector $routes): void {
6063
$routes->addRoute(['GET', 'POST'], '', Database\CentralColumnsController::class);

libraries/services_controllers.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@
9696
'$config' => '@config',
9797
],
9898
],
99+
Console\Bookmark\AddController::class => [
100+
'class' => Console\Bookmark\AddController::class,
101+
'arguments' => ['$response' => '@response', '$template' => '@template', '$dbi' => '@dbi'],
102+
],
99103
Console\Bookmark\RefreshController::class => [
100104
'class' => Console\Bookmark\RefreshController::class,
101105
'arguments' => ['$response' => '@response', '$template' => '@template'],
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpMyAdmin\Tests\Controllers\Console\Bookmark;
6+
7+
use PhpMyAdmin\ConfigStorage\RelationParameters;
8+
use PhpMyAdmin\Controllers\Console\Bookmark\AddController;
9+
use PhpMyAdmin\Http\ServerRequest;
10+
use PhpMyAdmin\Template;
11+
use PhpMyAdmin\Tests\AbstractTestCase;
12+
use PhpMyAdmin\Tests\Stubs\ResponseRenderer;
13+
14+
/**
15+
* @covers \PhpMyAdmin\Controllers\Console\Bookmark\AddController
16+
*/
17+
class AddControllerTest extends AbstractTestCase
18+
{
19+
public function testWithInvalidParams(): void
20+
{
21+
$dbi = $this->createDatabaseInterface();
22+
$GLOBALS['dbi'] = $dbi;
23+
$response = new ResponseRenderer();
24+
$request = $this->createStub(ServerRequest::class);
25+
$request->method('getParsedBodyParam')->willReturnMap([
26+
['db', null, null],
27+
['label', null, null],
28+
['bookmark_query', null, null],
29+
['shared', null, null],
30+
]);
31+
$controller = new AddController($response, new Template(), $dbi);
32+
$controller($request);
33+
$this->assertSame(['message' => 'Incomplete params'], $response->getJSONResult());
34+
}
35+
36+
public function testWithoutRelationParameters(): void
37+
{
38+
$GLOBALS['cfg']['Server']['user'] = 'user';
39+
$_SESSION['relation'] = [];
40+
$dbi = $this->createDatabaseInterface();
41+
$GLOBALS['dbi'] = $dbi;
42+
$response = new ResponseRenderer();
43+
$request = $this->createStub(ServerRequest::class);
44+
$request->method('getParsedBodyParam')->willReturnMap([
45+
['db', null, 'test'],
46+
['label', null, 'test'],
47+
['bookmark_query', null, 'test'],
48+
['shared', null, 'test'],
49+
]);
50+
$controller = new AddController($response, new Template(), $dbi);
51+
$controller($request);
52+
$this->assertSame(['message' => 'Failed'], $response->getJSONResult());
53+
}
54+
55+
public function testWithValidParameters(): void
56+
{
57+
$GLOBALS['cfg']['Server']['user'] = 'test_user';
58+
$GLOBALS['server'] = 1;
59+
$_SESSION['relation'] = [];
60+
$_SESSION['relation'][$GLOBALS['server']] = RelationParameters::fromArray([
61+
'user' => 'test_user',
62+
'db' => 'pmadb',
63+
'bookmarkwork' => true,
64+
'bookmark' => 'bookmark',
65+
])->toArray();
66+
67+
$dbiDummy = $this->createDbiDummy();
68+
// phpcs:ignore Generic.Files.LineLength.TooLong
69+
$dbiDummy->addResult('INSERT INTO `pmadb`.`bookmark` (id, dbase, user, query, label) VALUES (NULL, \'test_db\', \'\', \'test_query\', \'test_label\')', []);
70+
$dbi = $this->createDatabaseInterface($dbiDummy);
71+
$GLOBALS['dbi'] = $dbi;
72+
$response = new ResponseRenderer();
73+
$request = $this->createStub(ServerRequest::class);
74+
$request->method('getParsedBodyParam')->willReturnMap([
75+
['db', null, 'test_db'],
76+
['label', null, 'test_label'],
77+
['bookmark_query', null, 'test_query'],
78+
['shared', null, 'true'],
79+
]);
80+
$controller = new AddController($response, new Template(), $dbi);
81+
$controller($request);
82+
$this->assertSame(
83+
[
84+
'message' => 'Succeeded',
85+
'data' => [
86+
'bkm_database' => 'test_db',
87+
'bkm_user' => 'test_user',
88+
'bkm_sql_query' => 'test_query',
89+
'bkm_label' => 'test_label',
90+
],
91+
'isShared' => true,
92+
],
93+
$response->getJSONResult()
94+
);
95+
$dbiDummy->assertAllQueriesConsumed();
96+
}
97+
}

0 commit comments

Comments
 (0)