Skip to content

Commit

Permalink
Add support for statement messages in FlashMessages class
Browse files Browse the repository at this point in the history
Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
  • Loading branch information
MauricioFauth committed May 15, 2024
1 parent 256a847 commit 24fcf25
Show file tree
Hide file tree
Showing 14 changed files with 125 additions and 38 deletions.
2 changes: 1 addition & 1 deletion app/services_controllers.php
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@
],
Database\Structure\ReplacePrefixController::class => [
'class' => Database\Structure\ReplacePrefixController::class,
'arguments' => ['$dbi' => '@dbi', '$structureController' => '@' . Database\StructureController::class],
'arguments' => ['@dbi', '@' . ResponseFactory::class, '@flash'],
],
Database\Structure\ShowCreateController::class => [
'class' => Database\Structure\ShowCreateController::class,
Expand Down
11 changes: 8 additions & 3 deletions phpstan-baseline.neon
Original file line number Diff line number Diff line change
Expand Up @@ -1995,6 +1995,11 @@ parameters:
count: 1
path: src/Controllers/Database/Structure/ReplacePrefixController.php

-
message: "#^Parameter \\#3 \\$statement of method PhpMyAdmin\\\\FlashMessages\\:\\:addMessage\\(\\) expects string, mixed given\\.$#"
count: 1
path: src/Controllers/Database/Structure/ReplacePrefixController.php

-
message: "#^Call to function array_search\\(\\) requires parameter \\#3 to be set\\.$#"
count: 4
Expand Down Expand Up @@ -7471,7 +7476,7 @@ parameters:
path: src/FlashMessages.php

-
message: "#^Property PhpMyAdmin\\\\FlashMessages\\:\\:\\$previousMessages \\(array\\<string, array\\<string\\>\\>\\) does not accept mixed\\.$#"
message: "#^Property PhpMyAdmin\\\\FlashMessages\\:\\:\\$previousMessages \\(array\\<string, array\\<array\\<string\\>\\>\\>\\) does not accept mixed\\.$#"
count: 1
path: src/FlashMessages.php

Expand Down Expand Up @@ -15542,12 +15547,12 @@ parameters:

-
message: "#^Parameter \\#2 \\$array of static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertArrayHasKey\\(\\) expects array\\|ArrayAccess, mixed given\\.$#"
count: 1
count: 2
path: tests/unit/FlashMessagesTest.php

-
message: "#^Parameter \\#2 \\$array of static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertArrayNotHasKey\\(\\) expects array\\|ArrayAccess, mixed given\\.$#"
count: 1
count: 2
path: tests/unit/FlashMessagesTest.php

-
Expand Down
4 changes: 4 additions & 0 deletions psalm-baseline.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13646,10 +13646,14 @@
<MixedArgument>
<code><![CDATA[$_SESSION[self::STORAGE_KEY]]]></code>
<code><![CDATA[$_SESSION[self::STORAGE_KEY]]]></code>
<code><![CDATA[$_SESSION[self::STORAGE_KEY]]]></code>
<code><![CDATA[$_SESSION[self::STORAGE_KEY]]]></code>
</MixedArgument>
<MixedArrayAccess>
<code><![CDATA[$_SESSION[self::STORAGE_KEY]['error']]]></code>
<code><![CDATA[$_SESSION[self::STORAGE_KEY]['error']]]></code>
<code><![CDATA[$_SESSION[self::STORAGE_KEY]['success']]]></code>
<code><![CDATA[$_SESSION[self::STORAGE_KEY]['success']]]></code>
</MixedArrayAccess>
</file>
<file src="tests/unit/FooterTest.php">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<form id="ajax_form" action="{{ url(route) }}" method="post">
<form class="disableAjax" id="ajax_form" action="{{ url(route) }}" method="post">
{{ get_hidden_inputs(url_params) }}
<div class="mb-3">
<label for="initialPrefixInput" class="form-label">{{ t('From') }}</label>
Expand Down
10 changes: 7 additions & 3 deletions resources/templates/database/structure/index.twig
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
{% for flash_key, flash_messages in flash() %}
{% for flash_message in flash_messages %}
<div class="alert alert-{{ flash_key }}" role="alert">
{{ flash_message }}
</div>
{% if flash_message.statement is empty %}
<div class="alert alert-{{ flash_key }}" role="alert">
{{ flash_message.message }}
</div>
{% else %}
{{ statement_message(flash_message.message, flash_message.statement, flash_key) }}
{% endif %}
{% endfor %}
{% endfor %}

Expand Down
10 changes: 7 additions & 3 deletions resources/templates/export.twig
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,13 @@

{% for flash_key, flash_messages in flash() %}
{% for flash_message in flash_messages %}
<div class="alert alert-{{ flash_key }}" role="alert">
{{ flash_message }}
</div>
{% if flash_message.statement is empty %}
<div class="alert alert-{{ flash_key }}" role="alert">
{{ flash_message.message }}
</div>
{% else %}
{{ statement_message(flash_message.message, flash_message.statement, flash_key) }}
{% endif %}
{% endfor %}
{% endfor %}

Expand Down
10 changes: 7 additions & 3 deletions resources/templates/table/page_with_secondary_tabs.twig
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,13 @@

{% for flash_key, flash_messages in flash() %}
{% for flash_message in flash_messages %}
<div class="alert alert-{{ flash_key }}" role="alert">
{{ flash_message }}
</div>
{% if flash_message.statement is empty %}
<div class="alert alert-{{ flash_key }}" role="alert">
{{ flash_message.message }}
</div>
{% else %}
{{ statement_message(flash_message.message, flash_message.statement, flash_key) }}
{% endif %}
{% endfor %}
{% endfor %}

Expand Down
15 changes: 10 additions & 5 deletions src/Controllers/Database/Structure/ReplacePrefixController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@

namespace PhpMyAdmin\Controllers\Database\Structure;

use PhpMyAdmin\Controllers\Database\StructureController;
use Fig\Http\Message\StatusCodeInterface;
use PhpMyAdmin\Controllers\InvocableController;
use PhpMyAdmin\Current;
use PhpMyAdmin\DatabaseInterface;
use PhpMyAdmin\FlashMessages;
use PhpMyAdmin\Http\Factory\ResponseFactory;
use PhpMyAdmin\Http\Response;
use PhpMyAdmin\Http\ServerRequest;
use PhpMyAdmin\Message;
use PhpMyAdmin\Url;
use PhpMyAdmin\Util;

use function mb_strlen;
Expand All @@ -20,11 +23,12 @@ final class ReplacePrefixController implements InvocableController
{
public function __construct(
private readonly DatabaseInterface $dbi,
private readonly StructureController $structureController,
private readonly ResponseFactory $responseFactory,
private readonly FlashMessages $flashMessages,
) {
}

public function __invoke(ServerRequest $request): Response|null
public function __invoke(ServerRequest $request): Response
{
/** @var string[] $selected */
$selected = $request->getParsedBodyParam('selected', []);
Expand Down Expand Up @@ -53,8 +57,9 @@ public function __invoke(ServerRequest $request): Response|null

$GLOBALS['message'] = Message::success();

($this->structureController)($request);
$this->flashMessages->addMessage('success', $GLOBALS['message']->getMessage(), $GLOBALS['sql_query']);

return null;
return $this->responseFactory->createResponse(StatusCodeInterface::STATUS_FOUND)
->withHeader('Location', Url::getFromRoute('/database/structure', ['db' => Current::$database]));
}
}
10 changes: 5 additions & 5 deletions src/FlashMessages.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ final class FlashMessages
/** @var mixed[] */
private array $storage;

/** @var array<string, string[]> */
/** @var array<string, string[][]> */
private array $previousMessages = [];

public function __construct()
Expand All @@ -33,22 +33,22 @@ public function __construct()
$this->storage[self::STORAGE_KEY] = [];
}

public function addMessage(string $key, string $message): void
public function addMessage(string $key, string $message, string $statement = ''): void
{
if (! isset($this->storage[self::STORAGE_KEY][$key])) {
$this->storage[self::STORAGE_KEY][$key] = [];
}

$this->storage[self::STORAGE_KEY][$key][] = $message;
$this->storage[self::STORAGE_KEY][$key][] = ['message' => $message, 'statement' => $statement];
}

/** @return string[]|null */
/** @return string[][]|null */
public function getMessage(string $key): array|null
{
return $this->previousMessages[$key] ?? null;
}

/** @return array<string, string[]> */
/** @return array<string, string[][]> */
public function getMessages(): array
{
return $this->previousMessages;
Expand Down
11 changes: 9 additions & 2 deletions src/Html/Generator.php
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,6 @@ public static function getStartAndNumberOfRowsFieldsetData(string $sqlQuery): ar
*
* @param Message|string $message the message to display
* @param string|null $sqlQuery the query to display
* @param MessageType $type the type (level) of the message
*
* @throws Throwable
* @throws LoaderError
Expand All @@ -400,7 +399,7 @@ public static function getStartAndNumberOfRowsFieldsetData(string $sqlQuery): ar
public static function getMessage(
Message|string $message,
string|null $sqlQuery = null,
MessageType $type = MessageType::Notice,
MessageType|string $type = MessageType::Notice,
): string {
$retval = '';

Expand All @@ -423,6 +422,14 @@ public static function getMessage(
}

if (is_string($message)) {
if (is_string($type)) {
$type = match ($type) {
'success' => MessageType::Success,
'error' => MessageType::Error,
default => MessageType::Notice,
};
}

$message = new Message($message, $type);
}

Expand Down
8 changes: 8 additions & 0 deletions src/Twig/MessageExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@

namespace PhpMyAdmin\Twig;

use PhpMyAdmin\Html\Generator;
use PhpMyAdmin\Message;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
use Twig\TwigFunction;

class MessageExtension extends AbstractExtension
{
Expand Down Expand Up @@ -35,4 +37,10 @@ public function getFilters(): array
),
];
}

/** @inheritDoc */
public function getFunctions(): array
{
return [new TwigFunction('statement_message', Generator::getMessage(...), ['is_safe' => ['html']])];
}
}
5 changes: 4 additions & 1 deletion tests/unit/Controllers/Table/DropColumnControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ public function testDropColumnController(): void

self::assertArrayHasKey('flashMessages', $_SESSION);
/** @psalm-suppress InvalidArrayOffset */
self::assertSame(['success' => ['2 columns have been dropped successfully.']], $_SESSION['flashMessages']);
self::assertSame(
['success' => [['message' => '2 columns have been dropped successfully.', 'statement' => '']]],
$_SESSION['flashMessages'],
);
}
}
30 changes: 24 additions & 6 deletions tests/unit/Export/ExportTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,10 @@ public function testGetPageLocationAndSaveMessageForServerExportWithError(): voi
$export = new Export($dbi);
$location = $export->getPageLocationAndSaveMessage('server', Message::error('Error message!'));
self::assertSame('index.php?route=/server/export&server=2&lang=en', $location);
self::assertSame(['danger' => ['Error message!']], (new FlashMessages())->getMessages());
self::assertSame(
['danger' => [['message' => 'Error message!', 'statement' => '']]],
(new FlashMessages())->getMessages(),
);
}

public function testGetPageLocationAndSaveMessageForServerExportWithSuccess(): void
Expand All @@ -254,7 +257,10 @@ public function testGetPageLocationAndSaveMessageForServerExportWithSuccess(): v
$export = new Export($dbi);
$location = $export->getPageLocationAndSaveMessage('server', Message::success('Success message!'));
self::assertSame('index.php?route=/server/export&server=2&lang=en', $location);
self::assertSame(['success' => ['Success message!']], (new FlashMessages())->getMessages());
self::assertSame(
['success' => [['message' => 'Success message!', 'statement' => '']]],
(new FlashMessages())->getMessages(),
);
}

public function testGetPageLocationAndSaveMessageForDatabaseExportWithError(): void
Expand All @@ -267,7 +273,10 @@ public function testGetPageLocationAndSaveMessageForDatabaseExportWithError(): v
$export = new Export($dbi);
$location = $export->getPageLocationAndSaveMessage('database', Message::error('Error message!'));
self::assertSame('index.php?route=/database/export&db=test_db&server=2&lang=en', $location);
self::assertSame(['danger' => ['Error message!']], (new FlashMessages())->getMessages());
self::assertSame(
['danger' => [['message' => 'Error message!', 'statement' => '']]],
(new FlashMessages())->getMessages(),
);
}

public function testGetPageLocationAndSaveMessageForDatabaseExportWithSuccess(): void
Expand All @@ -280,7 +289,10 @@ public function testGetPageLocationAndSaveMessageForDatabaseExportWithSuccess():
$export = new Export($dbi);
$location = $export->getPageLocationAndSaveMessage('database', Message::success('Success message!'));
self::assertSame('index.php?route=/database/export&db=test_db&server=2&lang=en', $location);
self::assertSame(['success' => ['Success message!']], (new FlashMessages())->getMessages());
self::assertSame(
['success' => [['message' => 'Success message!', 'statement' => '']]],
(new FlashMessages())->getMessages(),
);
}

public function testGetPageLocationAndSaveMessageForTableExportWithError(): void
Expand All @@ -297,7 +309,10 @@ public function testGetPageLocationAndSaveMessageForTableExportWithError(): void
'index.php?route=/table/export&db=test_db&table=test_table&single_table=true&server=2&lang=en',
$location,
);
self::assertSame(['danger' => ['Error message!']], (new FlashMessages())->getMessages());
self::assertSame(
['danger' => [['message' => 'Error message!', 'statement' => '']]],
(new FlashMessages())->getMessages(),
);
}

public function testGetPageLocationAndSaveMessageForTableExportWithSuccess(): void
Expand All @@ -314,6 +329,9 @@ public function testGetPageLocationAndSaveMessageForTableExportWithSuccess(): vo
'index.php?route=/table/export&db=test_db&table=test_table&single_table=true&server=2&lang=en',
$location,
);
self::assertSame(['success' => ['Success message!']], (new FlashMessages())->getMessages());
self::assertSame(
['success' => [['message' => 'Success message!', 'statement' => '']]],
(new FlashMessages())->getMessages(),
);
}
}
35 changes: 30 additions & 5 deletions tests/unit/FlashMessagesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,27 +36,52 @@ public function testAddMessage(): void
$flash->addMessage('error', 'Error');
self::assertArrayHasKey('error', $_SESSION[self::STORAGE_KEY]);
self::assertIsArray($_SESSION[self::STORAGE_KEY]['error']);
self::assertSame(['Error'], $_SESSION[self::STORAGE_KEY]['error']);
self::assertSame([['message' => 'Error', 'statement' => '']], $_SESSION[self::STORAGE_KEY]['error']);
}

public function testAddMessageWithStatement(): void
{
$flash = new FlashMessages();
self::assertArrayNotHasKey('success', $_SESSION[self::STORAGE_KEY]);
$flash->addMessage('success', 'Your SQL query has been executed successfully.', 'SELECT 1;');
self::assertArrayHasKey('success', $_SESSION[self::STORAGE_KEY]);
self::assertIsArray($_SESSION[self::STORAGE_KEY]['success']);
self::assertSame(
[['message' => 'Your SQL query has been executed successfully.', 'statement' => 'SELECT 1;']],
$_SESSION[self::STORAGE_KEY]['success'],
);
}

public function testGetMessage(): void
{
$_SESSION[self::STORAGE_KEY] = ['warning' => ['Warning']];
$_SESSION[self::STORAGE_KEY] = ['warning' => [['message' => 'Warning', 'statement' => '']]];
$flash = new FlashMessages();
$message = $flash->getMessage('error');
self::assertNull($message);
$message = $flash->getMessage('warning');
self::assertSame(['Warning'], $message);
self::assertSame([['message' => 'Warning', 'statement' => '']], $message);
}

public function testGetMessages(): void
{
$_SESSION[self::STORAGE_KEY] = ['error' => ['Error1', 'Error2'], 'warning' => ['Warning']];
$_SESSION[self::STORAGE_KEY] = [
'error' => [
['message' => 'Error1', 'statement' => ''],
['message' => 'Error2', 'statement' => ''],
],
'warning' => [['message' => 'Warning', 'statement' => '']],
];
$flash = new FlashMessages();
$flash->addMessage('notice', 'Notice');
$messages = $flash->getMessages();
self::assertSame(
['error' => ['Error1', 'Error2'], 'warning' => ['Warning']],
[
'error' => [
['message' => 'Error1', 'statement' => ''],
['message' => 'Error2', 'statement' => ''],
],
'warning' => [['message' => 'Warning', 'statement' => '']],
],
$messages,
);
}
Expand Down

0 comments on commit 24fcf25

Please sign in to comment.