From 5a6f0537ec88364075315e067643b28dd9271c12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Romey?= Date: Tue, 28 Apr 2020 17:21:29 +0200 Subject: [PATCH] Add Notifier SentMessage --- .../Bridge/Firebase/FirebaseTransport.php | 10 ++- .../Notifier/Bridge/Firebase/composer.json | 2 +- .../Bridge/FreeMobile/FreeMobileTransport.php | 5 +- .../Notifier/Bridge/FreeMobile/composer.json | 2 +- .../Bridge/Mattermost/MattermostTransport.php | 10 ++- .../Notifier/Bridge/Mattermost/composer.json | 2 +- .../Notifier/Bridge/Nexmo/NexmoTransport.php | 10 ++- .../Notifier/Bridge/Nexmo/composer.json | 2 +- .../Bridge/OvhCloud/OvhCloudTransport.php | 10 ++- .../Notifier/Bridge/OvhCloud/composer.json | 2 +- .../Bridge/RocketChat/RocketChatTransport.php | 10 ++- .../Notifier/Bridge/RocketChat/composer.json | 2 +- .../Notifier/Bridge/Sinch/SinchTransport.php | 10 ++- .../Notifier/Bridge/Sinch/composer.json | 2 +- .../Notifier/Bridge/Slack/SlackTransport.php | 5 +- .../Notifier/Bridge/Slack/composer.json | 2 +- .../Bridge/Telegram/TelegramTransport.php | 10 ++- .../Telegram/Tests/TelegramTransportTest.php | 63 +++++++++++++++++-- .../Notifier/Bridge/Telegram/composer.json | 2 +- .../Bridge/Twilio/TwilioTransport.php | 10 ++- .../Notifier/Bridge/Twilio/composer.json | 2 +- src/Symfony/Component/Notifier/CHANGELOG.md | 5 ++ src/Symfony/Component/Notifier/Chatter.php | 7 +-- .../Notifier/Message/SentMessage.php | 50 +++++++++++++++ .../Tests/Transport/TransportsTest.php | 18 ++++-- src/Symfony/Component/Notifier/Texter.php | 7 +-- .../Notifier/Transport/AbstractTransport.php | 7 ++- .../Notifier/Transport/NullTransport.php | 5 +- .../Transport/RoundRobinTransport.php | 7 +-- .../Notifier/Transport/TransportInterface.php | 3 +- .../Notifier/Transport/Transports.php | 10 ++- 31 files changed, 241 insertions(+), 51 deletions(-) create mode 100644 src/Symfony/Component/Notifier/Message/SentMessage.php diff --git a/src/Symfony/Component/Notifier/Bridge/Firebase/FirebaseTransport.php b/src/Symfony/Component/Notifier/Bridge/Firebase/FirebaseTransport.php index 5a3509c63eeee..d13c0b6995f80 100644 --- a/src/Symfony/Component/Notifier/Bridge/Firebase/FirebaseTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/Firebase/FirebaseTransport.php @@ -16,6 +16,7 @@ use Symfony\Component\Notifier\Exception\TransportException; use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; use Symfony\Component\Notifier\Transport\AbstractTransport; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; @@ -50,7 +51,7 @@ public function supports(MessageInterface $message): bool return $message instanceof ChatMessage; } - protected function doSend(MessageInterface $message): void + protected function doSend(MessageInterface $message): SentMessage { if (!$message instanceof ChatMessage) { throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, ChatMessage::class, get_debug_type($message))); @@ -84,5 +85,12 @@ protected function doSend(MessageInterface $message): void if ($jsonContents && isset($jsonContents['results']['error'])) { throw new TransportException(sprintf('Unable to post the Firebase message: %s.', $jsonContents['error']), $response); } + + $success = $response->toArray(false); + + $message = new SentMessage($message, (string) $this); + $message->setMessageId($success['results'][0]['message_id']); + + return $message; } } diff --git a/src/Symfony/Component/Notifier/Bridge/Firebase/composer.json b/src/Symfony/Component/Notifier/Bridge/Firebase/composer.json index 15230eaf8da6b..4ca7e694b7782 100644 --- a/src/Symfony/Component/Notifier/Bridge/Firebase/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Firebase/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "^5.0" + "symfony/notifier": "^5.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Firebase\\": "" }, diff --git a/src/Symfony/Component/Notifier/Bridge/FreeMobile/FreeMobileTransport.php b/src/Symfony/Component/Notifier/Bridge/FreeMobile/FreeMobileTransport.php index 936e6b3a16ca3..674aea299a971 100644 --- a/src/Symfony/Component/Notifier/Bridge/FreeMobile/FreeMobileTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/FreeMobile/FreeMobileTransport.php @@ -14,6 +14,7 @@ use Symfony\Component\Notifier\Exception\LogicException; use Symfony\Component\Notifier\Exception\TransportException; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; use Symfony\Component\Notifier\Message\SmsMessage; use Symfony\Component\Notifier\Transport\AbstractTransport; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; @@ -51,7 +52,7 @@ public function supports(MessageInterface $message): bool return $message instanceof SmsMessage && $this->phone === $message->getPhone(); } - protected function doSend(MessageInterface $message): void + protected function doSend(MessageInterface $message): SentMessage { if (!$this->supports($message)) { throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given) and configured with your phone number.', __CLASS__, SmsMessage::class, \get_class($message))); @@ -75,5 +76,7 @@ protected function doSend(MessageInterface $message): void throw new TransportException(sprintf('Unable to send the SMS: error %d: ', $response->getStatusCode()).($errors[$response->getStatusCode()] ?? ''), $response); } + + return new SentMessage($message, (string) $this); } } diff --git a/src/Symfony/Component/Notifier/Bridge/FreeMobile/composer.json b/src/Symfony/Component/Notifier/Bridge/FreeMobile/composer.json index dff5b417abefb..88a2e8c15a50f 100644 --- a/src/Symfony/Component/Notifier/Bridge/FreeMobile/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/FreeMobile/composer.json @@ -19,7 +19,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.3|^5.1", - "symfony/notifier": "^5.1" + "symfony/notifier": "^5.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\FreeMobile\\": "" }, diff --git a/src/Symfony/Component/Notifier/Bridge/Mattermost/MattermostTransport.php b/src/Symfony/Component/Notifier/Bridge/Mattermost/MattermostTransport.php index 23afec66bb7df..701c9a9d04b01 100644 --- a/src/Symfony/Component/Notifier/Bridge/Mattermost/MattermostTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/Mattermost/MattermostTransport.php @@ -15,6 +15,7 @@ use Symfony\Component\Notifier\Exception\TransportException; use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; use Symfony\Component\Notifier\Transport\AbstractTransport; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; @@ -50,7 +51,7 @@ public function supports(MessageInterface $message): bool /** * @see https://api.mattermost.com */ - protected function doSend(MessageInterface $message): void + protected function doSend(MessageInterface $message): SentMessage { if (!$message instanceof ChatMessage) { throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, ChatMessage::class, get_debug_type($message))); @@ -74,5 +75,12 @@ protected function doSend(MessageInterface $message): void throw new TransportException(sprintf('Unable to post the Mattermost message: %s (%s).', $result['message'], $result['id']), $response); } + + $success = $response->toArray(false); + + $message = new SentMessage($message, (string) $this); + $message->setMessageId($success['id']); + + return $message; } } diff --git a/src/Symfony/Component/Notifier/Bridge/Mattermost/composer.json b/src/Symfony/Component/Notifier/Bridge/Mattermost/composer.json index 28863f05917e6..d514eed4843c3 100644 --- a/src/Symfony/Component/Notifier/Bridge/Mattermost/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Mattermost/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "^5.0" + "symfony/notifier": "^5.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Mattermost\\": "" }, diff --git a/src/Symfony/Component/Notifier/Bridge/Nexmo/NexmoTransport.php b/src/Symfony/Component/Notifier/Bridge/Nexmo/NexmoTransport.php index 56b72ee012204..604ebc2799c6e 100644 --- a/src/Symfony/Component/Notifier/Bridge/Nexmo/NexmoTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/Nexmo/NexmoTransport.php @@ -14,6 +14,7 @@ use Symfony\Component\Notifier\Exception\LogicException; use Symfony\Component\Notifier\Exception\TransportException; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; use Symfony\Component\Notifier\Message\SmsMessage; use Symfony\Component\Notifier\Transport\AbstractTransport; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; @@ -51,7 +52,7 @@ public function supports(MessageInterface $message): bool return $message instanceof SmsMessage; } - protected function doSend(MessageInterface $message): void + protected function doSend(MessageInterface $message): SentMessage { if (!$message instanceof SmsMessage) { throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, SmsMessage::class, get_debug_type($message))); @@ -73,5 +74,12 @@ protected function doSend(MessageInterface $message): void throw new TransportException('Unable to send the SMS: '.$msg['error-text'].sprintf(' (code %s).', $msg['status']), $response); } } + + $success = $response->toArray(false); + + $message = new SentMessage($message, (string) $this); + $message->setMessageId($success['messages'][0]['message-id']); + + return $message; } } diff --git a/src/Symfony/Component/Notifier/Bridge/Nexmo/composer.json b/src/Symfony/Component/Notifier/Bridge/Nexmo/composer.json index 53fc2c8f3bd82..861dd4b91a119 100644 --- a/src/Symfony/Component/Notifier/Bridge/Nexmo/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Nexmo/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "^5.0" + "symfony/notifier": "^5.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Nexmo\\": "" }, diff --git a/src/Symfony/Component/Notifier/Bridge/OvhCloud/OvhCloudTransport.php b/src/Symfony/Component/Notifier/Bridge/OvhCloud/OvhCloudTransport.php index 357fa59a32728..7231a61310fe5 100644 --- a/src/Symfony/Component/Notifier/Bridge/OvhCloud/OvhCloudTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/OvhCloud/OvhCloudTransport.php @@ -14,6 +14,7 @@ use Symfony\Component\Notifier\Exception\LogicException; use Symfony\Component\Notifier\Exception\TransportException; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; use Symfony\Component\Notifier\Message\SmsMessage; use Symfony\Component\Notifier\Transport\AbstractTransport; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; @@ -53,7 +54,7 @@ public function supports(MessageInterface $message): bool return $message instanceof SmsMessage; } - protected function doSend(MessageInterface $message): void + protected function doSend(MessageInterface $message): SentMessage { if (!$message instanceof SmsMessage) { throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, SmsMessage::class, get_debug_type($message))); @@ -90,6 +91,13 @@ protected function doSend(MessageInterface $message): void throw new TransportException(sprintf('Unable to send the SMS: %s.', $error['message']), $response); } + + $success = $response->toArray(false); + + $message = new SentMessage($message, (string) $this); + $message->setMessageId($success['ids'][0]); + + return $message; } /** diff --git a/src/Symfony/Component/Notifier/Bridge/OvhCloud/composer.json b/src/Symfony/Component/Notifier/Bridge/OvhCloud/composer.json index d75e6ee638b7d..aa8124d1f1460 100644 --- a/src/Symfony/Component/Notifier/Bridge/OvhCloud/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/OvhCloud/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "^5.0" + "symfony/notifier": "^5.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\OvhCloud\\": "" }, diff --git a/src/Symfony/Component/Notifier/Bridge/RocketChat/RocketChatTransport.php b/src/Symfony/Component/Notifier/Bridge/RocketChat/RocketChatTransport.php index 151912b24bd70..429e5ff48bd59 100644 --- a/src/Symfony/Component/Notifier/Bridge/RocketChat/RocketChatTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/RocketChat/RocketChatTransport.php @@ -15,6 +15,7 @@ use Symfony\Component\Notifier\Exception\TransportException; use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; use Symfony\Component\Notifier\Transport\AbstractTransport; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; @@ -55,7 +56,7 @@ public function supports(MessageInterface $message): bool /** * @see https://rocket.chat/docs/administrator-guides/integrations/ */ - protected function doSend(MessageInterface $message): void + protected function doSend(MessageInterface $message): SentMessage { if (!$message instanceof ChatMessage) { throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, ChatMessage::class, get_debug_type($message))); @@ -86,5 +87,12 @@ protected function doSend(MessageInterface $message): void if (!$result['success']) { throw new TransportException(sprintf('Unable to post the RocketChat message: %s.', $result['error']), $response); } + + $success = $response->toArray(false); + + $message = new SentMessage($message, (string) $this); + $message->setMessageId($success['message']['_id']); + + return $message; } } diff --git a/src/Symfony/Component/Notifier/Bridge/RocketChat/composer.json b/src/Symfony/Component/Notifier/Bridge/RocketChat/composer.json index 405a032553603..c1a0a2248bd1e 100644 --- a/src/Symfony/Component/Notifier/Bridge/RocketChat/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/RocketChat/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "^5.0" + "symfony/notifier": "^5.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\RocketChat\\": "" }, diff --git a/src/Symfony/Component/Notifier/Bridge/Sinch/SinchTransport.php b/src/Symfony/Component/Notifier/Bridge/Sinch/SinchTransport.php index 51e94a5df25e8..e993f8d77c35e 100644 --- a/src/Symfony/Component/Notifier/Bridge/Sinch/SinchTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/Sinch/SinchTransport.php @@ -14,6 +14,7 @@ use Symfony\Component\Notifier\Exception\LogicException; use Symfony\Component\Notifier\Exception\TransportException; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; use Symfony\Component\Notifier\Message\SmsMessage; use Symfony\Component\Notifier\Transport\AbstractTransport; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; @@ -51,7 +52,7 @@ public function supports(MessageInterface $message): bool return $message instanceof SmsMessage; } - protected function doSend(MessageInterface $message): void + protected function doSend(MessageInterface $message): SentMessage { if (!$message instanceof SmsMessage) { throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, SmsMessage::class, get_debug_type($message))); @@ -72,5 +73,12 @@ protected function doSend(MessageInterface $message): void throw new TransportException(sprintf('Unable to send the SMS: %s (%s).', $error['text'], $error['code']), $response); } + + $success = $response->toArray(false); + + $message = new SentMessage($message, (string) $this); + $message->setMessageId($success['id']); + + return $message; } } diff --git a/src/Symfony/Component/Notifier/Bridge/Sinch/composer.json b/src/Symfony/Component/Notifier/Bridge/Sinch/composer.json index 34d3696684a2f..29ab31c21c15f 100644 --- a/src/Symfony/Component/Notifier/Bridge/Sinch/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Sinch/composer.json @@ -19,7 +19,7 @@ "php": ">=7.2.5", "ext-json": "*", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "^5.0" + "symfony/notifier": "^5.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Sinch\\": "" }, diff --git a/src/Symfony/Component/Notifier/Bridge/Slack/SlackTransport.php b/src/Symfony/Component/Notifier/Bridge/Slack/SlackTransport.php index 41c9485f9673e..8a04c4e4859e7 100644 --- a/src/Symfony/Component/Notifier/Bridge/Slack/SlackTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/Slack/SlackTransport.php @@ -15,6 +15,7 @@ use Symfony\Component\Notifier\Exception\TransportException; use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; use Symfony\Component\Notifier\Transport\AbstractTransport; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; @@ -58,7 +59,7 @@ public function supports(MessageInterface $message): bool return $message instanceof ChatMessage && (null === $message->getOptions() || $message->getOptions() instanceof SlackOptions); } - protected function doSend(MessageInterface $message): void + protected function doSend(MessageInterface $message): SentMessage { if (!$message instanceof ChatMessage) { throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, ChatMessage::class, get_debug_type($message))); @@ -86,5 +87,7 @@ protected function doSend(MessageInterface $message): void if ('ok' !== $result) { throw new TransportException('Unable to post the Slack message: '.$result, $response); } + + return new SentMessage($message, (string) $this); } } diff --git a/src/Symfony/Component/Notifier/Bridge/Slack/composer.json b/src/Symfony/Component/Notifier/Bridge/Slack/composer.json index 9b22233c03c59..2d61d21fbb91c 100644 --- a/src/Symfony/Component/Notifier/Bridge/Slack/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Slack/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "^5.1" + "symfony/notifier": "^5.2" }, "require-dev": { "symfony/event-dispatcher": "^4.3|^5.0" diff --git a/src/Symfony/Component/Notifier/Bridge/Telegram/TelegramTransport.php b/src/Symfony/Component/Notifier/Bridge/Telegram/TelegramTransport.php index 5e2710ac7a5d1..7951e1ad87eca 100644 --- a/src/Symfony/Component/Notifier/Bridge/Telegram/TelegramTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/Telegram/TelegramTransport.php @@ -15,6 +15,7 @@ use Symfony\Component\Notifier\Exception\TransportException; use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; use Symfony\Component\Notifier\Transport\AbstractTransport; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; @@ -60,7 +61,7 @@ public function supports(MessageInterface $message): bool /** * @see https://core.telegram.org/bots/api */ - protected function doSend(MessageInterface $message): void + protected function doSend(MessageInterface $message): SentMessage { if (!$message instanceof ChatMessage) { throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, ChatMessage::class, get_debug_type($message))); @@ -82,5 +83,12 @@ protected function doSend(MessageInterface $message): void throw new TransportException('Unable to post the Telegram message: '.$result['description'].sprintf(' (code %s).', $result['error_code']), $response); } + + $success = $response->toArray(false); + + $message = new SentMessage($message, (string) $this); + $message->setMessageId($success['result']['message_id']); + + return $message; } } diff --git a/src/Symfony/Component/Notifier/Bridge/Telegram/Tests/TelegramTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Telegram/Tests/TelegramTransportTest.php index ec5f3453565ba..963f3884870f2 100644 --- a/src/Symfony/Component/Notifier/Bridge/Telegram/Tests/TelegramTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Telegram/Tests/TelegramTransportTest.php @@ -80,9 +80,34 @@ public function testSendWithOptions(): void $response->expects($this->exactly(2)) ->method('getStatusCode') ->willReturn(200); + + $content = <<expects($this->once()) ->method('getContent') - ->willReturn(''); + ->willReturn($content) + ; $expectedBody = [ 'chat_id' => $channel, @@ -98,7 +123,10 @@ public function testSendWithOptions(): void $transport = new TelegramTransport('testToken', $channel, $client); - $transport->send(new ChatMessage('testMessage')); + $sentMessage = $transport->send(new ChatMessage('testMessage')); + + $this->assertEquals(1, $sentMessage->getMessageId()); + $this->assertEquals('telegram://api.telegram.org?channel=testChannel', $sentMessage->getTransport()); } public function testSendWithChannelOverride(): void @@ -109,9 +137,33 @@ public function testSendWithChannelOverride(): void $response->expects($this->exactly(2)) ->method('getStatusCode') ->willReturn(200); + $content = <<expects($this->once()) ->method('getContent') - ->willReturn(''); + ->willReturn($content) + ; $expectedBody = [ 'chat_id' => $channelOverride, @@ -133,6 +185,9 @@ public function testSendWithChannelOverride(): void ->method('getRecipientId') ->willReturn($channelOverride); - $transport->send(new ChatMessage('testMessage', $messageOptions)); + $sentMessage = $transport->send(new ChatMessage('testMessage', $messageOptions)); + + $this->assertEquals(1, $sentMessage->getMessageId()); + $this->assertEquals('telegram://api.telegram.org?channel=defaultChannel', $sentMessage->getTransport()); } } diff --git a/src/Symfony/Component/Notifier/Bridge/Telegram/composer.json b/src/Symfony/Component/Notifier/Bridge/Telegram/composer.json index 80a550ac20970..f97b97c3fefe7 100644 --- a/src/Symfony/Component/Notifier/Bridge/Telegram/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Telegram/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "^5.1" + "symfony/notifier": "^5.2" }, "require-dev": { "symfony/event-dispatcher": "^4.3|^5.0" diff --git a/src/Symfony/Component/Notifier/Bridge/Twilio/TwilioTransport.php b/src/Symfony/Component/Notifier/Bridge/Twilio/TwilioTransport.php index 92a31fbc0a140..9b50c7d1d6e9b 100644 --- a/src/Symfony/Component/Notifier/Bridge/Twilio/TwilioTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/Twilio/TwilioTransport.php @@ -14,6 +14,7 @@ use Symfony\Component\Notifier\Exception\LogicException; use Symfony\Component\Notifier\Exception\TransportException; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; use Symfony\Component\Notifier\Message\SmsMessage; use Symfony\Component\Notifier\Transport\AbstractTransport; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; @@ -51,7 +52,7 @@ public function supports(MessageInterface $message): bool return $message instanceof SmsMessage; } - protected function doSend(MessageInterface $message): void + protected function doSend(MessageInterface $message): SentMessage { if (!$message instanceof SmsMessage) { throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, SmsMessage::class, get_debug_type($message))); @@ -72,5 +73,12 @@ protected function doSend(MessageInterface $message): void throw new TransportException('Unable to send the SMS: '.$error['message'].sprintf(' (see %s).', $error['more_info']), $response); } + + $success = $response->toArray(false); + + $message = new SentMessage($message, (string) $this); + $message->setMessageId($success['sid']); + + return $message; } } diff --git a/src/Symfony/Component/Notifier/Bridge/Twilio/composer.json b/src/Symfony/Component/Notifier/Bridge/Twilio/composer.json index ff13327382e79..0e730e7acba12 100644 --- a/src/Symfony/Component/Notifier/Bridge/Twilio/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Twilio/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "^5.0" + "symfony/notifier": "^5.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Twilio\\": "" }, diff --git a/src/Symfony/Component/Notifier/CHANGELOG.md b/src/Symfony/Component/Notifier/CHANGELOG.md index 1501819392785..1878aa5f9783b 100644 --- a/src/Symfony/Component/Notifier/CHANGELOG.md +++ b/src/Symfony/Component/Notifier/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +5.2.0 +----- + + * [BC BREAK] The `TransportInterface::send()` and `AbstractTransport::doSend()` methods changed to return a `SentMessage` instance instead of `void`. + 5.1.0 ----- diff --git a/src/Symfony/Component/Notifier/Chatter.php b/src/Symfony/Component/Notifier/Chatter.php index 47252c5003cc7..74cd8844e2273 100644 --- a/src/Symfony/Component/Notifier/Chatter.php +++ b/src/Symfony/Component/Notifier/Chatter.php @@ -16,6 +16,7 @@ use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Notifier\Event\MessageEvent; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; use Symfony\Component\Notifier\Transport\TransportInterface; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; @@ -47,12 +48,10 @@ public function supports(MessageInterface $message): bool return $this->transport->supports($message); } - public function send(MessageInterface $message): void + public function send(MessageInterface $message): SentMessage { if (null === $this->bus) { - $this->transport->send($message); - - return; + return $this->transport->send($message); } if (null !== $this->dispatcher) { diff --git a/src/Symfony/Component/Notifier/Message/SentMessage.php b/src/Symfony/Component/Notifier/Message/SentMessage.php new file mode 100644 index 0000000000000..d3eb75bba445e --- /dev/null +++ b/src/Symfony/Component/Notifier/Message/SentMessage.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Notifier\Message; + +/** + * @author Jérémy Romey + * + * @experimental in 5.2 + */ +final class SentMessage +{ + private $original; + private $transport; + private $messageId; + + public function __construct(MessageInterface $original, string $transport) + { + $this->original = $original; + $this->transport = $transport; + } + + public function getOriginalMessage(): MessageInterface + { + return $this->original; + } + + public function getTransport(): string + { + return $this->transport; + } + + public function setMessageId(string $id): void + { + $this->messageId = $id; + } + + public function getMessageId(): ?string + { + return $this->messageId; + } +} diff --git a/src/Symfony/Component/Notifier/Tests/Transport/TransportsTest.php b/src/Symfony/Component/Notifier/Tests/Transport/TransportsTest.php index 3f2d55b190055..de3cc3fab8083 100644 --- a/src/Symfony/Component/Notifier/Tests/Transport/TransportsTest.php +++ b/src/Symfony/Component/Notifier/Tests/Transport/TransportsTest.php @@ -15,6 +15,7 @@ use Symfony\Component\Notifier\Exception\InvalidArgumentException; use Symfony\Component\Notifier\Exception\LogicException; use Symfony\Component\Notifier\Message\ChatMessage; +use Symfony\Component\Notifier\Message\SentMessage; use Symfony\Component\Notifier\Transport\TransportInterface; use Symfony\Component\Notifier\Transport\Transports; @@ -30,9 +31,12 @@ public function testSendToTransportDefinedByMessage(): void $one->method('supports')->with($message)->willReturn(true); - $one->expects($this->once())->method('send'); + $one->expects($this->once())->method('send')->willReturn(new SentMessage($message, 'one')); - $transports->send($message); + $sentMessage = $transports->send($message); + + $this->assertSame($message, $sentMessage->getOriginalMessage()); + $this->assertSame('one', $sentMessage->getTransport()); } public function testSendToFirstSupportedTransportIfMessageDoesNotDefineATransport(): void @@ -47,10 +51,16 @@ public function testSendToFirstSupportedTransportIfMessageDoesNotDefineATranspor $one->method('supports')->with($message)->willReturn(false); $two->method('supports')->with($message)->willReturn(true); + $one->method('send')->with($message)->willReturn(new SentMessage($message, 'one')); + $two->method('send')->with($message)->willReturn(new SentMessage($message, 'two')); + $one->expects($this->never())->method('send'); - $two->expects($this->once())->method('send'); + $two->expects($this->once())->method('send')->willReturn(new SentMessage($message, 'two')); - $transports->send($message); + $sentMessage = $transports->send($message); + + $this->assertSame($message, $sentMessage->getOriginalMessage()); + $this->assertSame('two', $sentMessage->getTransport()); } public function testThrowExceptionIfNoSupportedTransportWasFound(): void diff --git a/src/Symfony/Component/Notifier/Texter.php b/src/Symfony/Component/Notifier/Texter.php index 812dffc4b8528..29dbb8f8ea0b2 100644 --- a/src/Symfony/Component/Notifier/Texter.php +++ b/src/Symfony/Component/Notifier/Texter.php @@ -16,6 +16,7 @@ use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Notifier\Event\MessageEvent; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; use Symfony\Component\Notifier\Transport\TransportInterface; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; @@ -47,12 +48,10 @@ public function supports(MessageInterface $message): bool return $this->transport->supports($message); } - public function send(MessageInterface $message): void + public function send(MessageInterface $message): SentMessage { if (null === $this->bus) { - $this->transport->send($message); - - return; + return $this->transport->send($message); } if (null !== $this->dispatcher) { diff --git a/src/Symfony/Component/Notifier/Transport/AbstractTransport.php b/src/Symfony/Component/Notifier/Transport/AbstractTransport.php index 34c59e17d26b3..f51d67ad4eb1b 100644 --- a/src/Symfony/Component/Notifier/Transport/AbstractTransport.php +++ b/src/Symfony/Component/Notifier/Transport/AbstractTransport.php @@ -17,6 +17,7 @@ use Symfony\Component\Notifier\Event\MessageEvent; use Symfony\Component\Notifier\Exception\LogicException; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; @@ -69,16 +70,16 @@ public function setPort(?int $port): self return $this; } - public function send(MessageInterface $message): void + public function send(MessageInterface $message): SentMessage { if (null !== $this->dispatcher) { $this->dispatcher->dispatch(new MessageEvent($message)); } - $this->doSend($message); + return $this->doSend($message); } - abstract protected function doSend(MessageInterface $message): void; + abstract protected function doSend(MessageInterface $message): SentMessage; protected function getEndpoint(): ?string { diff --git a/src/Symfony/Component/Notifier/Transport/NullTransport.php b/src/Symfony/Component/Notifier/Transport/NullTransport.php index a8060f23cce4b..59638ca19285d 100644 --- a/src/Symfony/Component/Notifier/Transport/NullTransport.php +++ b/src/Symfony/Component/Notifier/Transport/NullTransport.php @@ -15,6 +15,7 @@ use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy; use Symfony\Component\Notifier\Event\MessageEvent; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; /** @@ -31,11 +32,13 @@ public function __construct(EventDispatcherInterface $dispatcher = null) $this->dispatcher = class_exists(Event::class) ? LegacyEventDispatcherProxy::decorate($dispatcher) : $dispatcher; } - public function send(MessageInterface $message): void + public function send(MessageInterface $message): SentMessage { if (null !== $this->dispatcher) { $this->dispatcher->dispatch(new MessageEvent($message)); } + + return new SentMessage($message, (string) $this); } public function __toString(): string diff --git a/src/Symfony/Component/Notifier/Transport/RoundRobinTransport.php b/src/Symfony/Component/Notifier/Transport/RoundRobinTransport.php index d852dd08dac55..a127cfd32bb11 100644 --- a/src/Symfony/Component/Notifier/Transport/RoundRobinTransport.php +++ b/src/Symfony/Component/Notifier/Transport/RoundRobinTransport.php @@ -15,6 +15,7 @@ use Symfony\Component\Notifier\Exception\RuntimeException; use Symfony\Component\Notifier\Exception\TransportExceptionInterface; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; /** * Uses several Transports using a round robin algorithm. @@ -63,13 +64,11 @@ public function supports(MessageInterface $message): bool return false; } - public function send(MessageInterface $message): void + public function send(MessageInterface $message): SentMessage { while ($transport = $this->getNextTransport($message)) { try { - $transport->send($message); - - return; + return $transport->send($message); } catch (TransportExceptionInterface $e) { $this->deadTransports[$transport] = microtime(true); } diff --git a/src/Symfony/Component/Notifier/Transport/TransportInterface.php b/src/Symfony/Component/Notifier/Transport/TransportInterface.php index f0d73ad8b46ac..38feefde2622f 100644 --- a/src/Symfony/Component/Notifier/Transport/TransportInterface.php +++ b/src/Symfony/Component/Notifier/Transport/TransportInterface.php @@ -13,6 +13,7 @@ use Symfony\Component\Notifier\Exception\TransportExceptionInterface; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; /** * @author Fabien Potencier @@ -24,7 +25,7 @@ interface TransportInterface /** * @throws TransportExceptionInterface */ - public function send(MessageInterface $message): void; + public function send(MessageInterface $message): SentMessage; public function supports(MessageInterface $message): bool; diff --git a/src/Symfony/Component/Notifier/Transport/Transports.php b/src/Symfony/Component/Notifier/Transport/Transports.php index f408eb2fd6aac..3932db0dcff1e 100644 --- a/src/Symfony/Component/Notifier/Transport/Transports.php +++ b/src/Symfony/Component/Notifier/Transport/Transports.php @@ -14,6 +14,7 @@ use Symfony\Component\Notifier\Exception\InvalidArgumentException; use Symfony\Component\Notifier\Exception\LogicException; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; /** * @author Fabien Potencier @@ -51,17 +52,14 @@ public function supports(MessageInterface $message): bool return false; } - public function send(MessageInterface $message): void + public function send(MessageInterface $message): SentMessage { if (!$transport = $message->getTransport()) { foreach ($this->transports as $transport) { if ($transport->supports($message)) { - $transport->send($message); - - return; + return $transport->send($message); } } - throw new LogicException(sprintf('None of the available transports support the given message (available transports: "%s").', implode('", "', array_keys($this->transports)))); } @@ -73,6 +71,6 @@ public function send(MessageInterface $message): void throw new LogicException(sprintf('The "%s" transport does not support the given message.', $transport)); } - $this->transports[$transport]->send($message); + return $this->transports[$transport]->send($message); } }