diff --git a/.ddev/config.yaml b/.ddev/config.yaml index e0c6fef..7172625 100644 --- a/.ddev/config.yaml +++ b/.ddev/config.yaml @@ -1,7 +1,7 @@ name: t3-messenger type: typo3 docroot: .Build/Web -php_version: "8.1" +php_version: "8.2" webserver_type: nginx-fpm router_http_port: "80" router_https_port: "443" diff --git a/.github/workflows/php_linter.yaml b/.github/workflows/php_linter.yaml index 26079cd..f1e3472 100644 --- a/.github/workflows/php_linter.yaml +++ b/.github/workflows/php_linter.yaml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - php-versions: [ 7.4, 8.0, 8.1 ] + php-versions: [ 7.4, 8.0, 8.1, 8.2 ] steps: - uses: actions/checkout@v4 diff --git a/Classes/Dashboard/Widgets/ListOfFailedMessagesWidget.php b/Classes/Dashboard/Widgets/ListOfFailedMessagesWidget.php deleted file mode 100644 index 1d48ff4..0000000 --- a/Classes/Dashboard/Widgets/ListOfFailedMessagesWidget.php +++ /dev/null @@ -1,57 +0,0 @@ -configuration = $configuration; - $this->dataProvider = $dataProvider; - $this->view = $view; - $this->options = $options; - } - - public function renderWidgetContent(): string - { - $this->view->setTemplate('Widget/ListOfFailedMessagesWidget'); - $this->view->assignMultiple([ - 'configuration' => $this->configuration, - 'failedMessages' => $this->dataProvider->getItems(), - 'options' => $this->options, - ]); - - return $this->view->render(); - } - - public function getOptions(): array - { - return $this->options; - } -} diff --git a/Classes/Dashboard/Widgets/Provider/FailedMessagesDataProvider.php b/Classes/Dashboard/Widgets/Provider/FailedMessagesDataProvider.php deleted file mode 100644 index fc145f4..0000000 --- a/Classes/Dashboard/Widgets/Provider/FailedMessagesDataProvider.php +++ /dev/null @@ -1,30 +0,0 @@ -failedMessageRepository = $failedMessageRepository; - } - - public function getItems(): array - { - return $this->failedMessageRepository->list(); - } -} diff --git a/Classes/DependencyInjection/Compiler/FailureReceiverPass.php b/Classes/DependencyInjection/Compiler/FailureReceiverPass.php deleted file mode 100644 index 4196cbe..0000000 --- a/Classes/DependencyInjection/Compiler/FailureReceiverPass.php +++ /dev/null @@ -1,28 +0,0 @@ -getDefinition(FailedMessageRepository::class); - $failedMessagesShowCommandDefinition = $container->getDefinition( - 'console.command.messenger_failed_messages_show' - ); - $failureMessageRepositoryDefinition->replaceArgument(0, $failedMessagesShowCommandDefinition->getArgument(1)); - } -} diff --git a/Classes/Domain/Dto/FailedMessage.php b/Classes/Domain/Dto/FailedMessage.php deleted file mode 100644 index 617d070..0000000 --- a/Classes/Domain/Dto/FailedMessage.php +++ /dev/null @@ -1,116 +0,0 @@ -message = $message; - $this->errorMessage = $errorMessage; - $this->redelivered = $redelivered; - $this->retryCount = $retryCount; - $this->messageId = $messageId; - } - - /** - * @return mixed - */ - public function getMessageId() - { - return $this->messageId; - } - - /** - * @return class-string - */ - public function getMessage(): string - { - return $this->message; - } - - public function getRedelivered(): DateTimeInterface - { - return $this->redelivered; - } - - public function getErrorMessage(): string - { - return $this->errorMessage; - } - - public function getRetryCount(): int - { - return $this->retryCount; - } - - public static function createFromEnvelope(Envelope $failedMessage): self - { - $errorDetailsStamp = $failedMessage->last(ErrorDetailsStamp::class); - - if (! $errorDetailsStamp instanceof ErrorDetailsStamp) { - throw new \UnexpectedValueException('No error details stamp given'); - } - - $errorMessage = $errorDetailsStamp->getExceptionMessage(); - - $redeliveryStamp = $failedMessage->last(RedeliveryStamp::class); - - if (! $redeliveryStamp instanceof RedeliveryStamp) { - throw new \UnexpectedValueException('No redelivery stamp given'); - } - - $transportMessageIdStamp = $failedMessage->last(TransportMessageIdStamp::class); - if (! $transportMessageIdStamp instanceof TransportMessageIdStamp) { - throw new \UnexpectedValueException('No transport message id stamp given'); - } - - return new self( - get_class($failedMessage->getMessage()), - $errorMessage, - $redeliveryStamp->getRedeliveredAt(), - $redeliveryStamp->getRetryCount(), - $transportMessageIdStamp->getId() - ); - } -} diff --git a/Classes/Repository/FailedMessageRepository.php b/Classes/Repository/FailedMessageRepository.php deleted file mode 100644 index 97d41d1..0000000 --- a/Classes/Repository/FailedMessageRepository.php +++ /dev/null @@ -1,64 +0,0 @@ -failureTransports = $failureTransports; - } - - /** - * @return FailedMessage[] - */ - public function list(): array - { - $allFailedMessages = []; - foreach ($this->failureTransports->getProvidedServices() as $serviceId => $_) { - $failureTransport = $this->failureTransports->get($serviceId); - if (! $failureTransport instanceof ListableReceiverInterface) { - continue; - } - - $failedMessages = $this->inReverseOrder($failureTransport->all()); - - foreach ($failedMessages as $failedMessage) { - $allFailedMessages[] = FailedMessage::createFromEnvelope($failedMessage); - } - } - - return $allFailedMessages; - } - - /** - * @param Envelope[] $failedMessages - * - * @return Envelope[]; - */ - private function inReverseOrder(iterable $failedMessages): array - { - if (! is_array($failedMessages)) { - $failedMessages = iterator_to_array($failedMessages); - } - - return array_reverse($failedMessages); - } -} diff --git a/Configuration/Services.php b/Configuration/Services.php index 83b745c..acf5689 100644 --- a/Configuration/Services.php +++ b/Configuration/Services.php @@ -15,9 +15,6 @@ use Ssch\T3Messenger\Command\ShowConfigurationCommand; use Ssch\T3Messenger\CommandToHandlerMapper; use Ssch\T3Messenger\ConfigurationModuleProvider\MessengerProvider; -use Ssch\T3Messenger\Dashboard\Widgets\ListOfFailedMessagesWidget; -use Ssch\T3Messenger\Dashboard\Widgets\Provider\FailedMessagesDataProvider; -use Ssch\T3Messenger\DependencyInjection\Compiler\FailureReceiverPass; use Ssch\T3Messenger\DependencyInjection\Compiler\MessengerAlterTableListenerPass; use Ssch\T3Messenger\DependencyInjection\Compiler\MessengerCommandToHandlerMapperPass; use Ssch\T3Messenger\DependencyInjection\Compiler\MessengerMailerPass; @@ -31,7 +28,6 @@ use Ssch\T3Messenger\Middleware\ServerRequestContextMiddleware; use Ssch\T3Messenger\Middleware\ValidationMiddleware; use Ssch\T3Messenger\Mime\BodyRenderer; -use Ssch\T3Messenger\Repository\FailedMessageRepository; use Symfony\Component\Console\ConsoleEvents; use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\Compiler\PassConfig; @@ -419,26 +415,6 @@ static function (ChildDefinition $definition, AsMessageHandler $attribute): void 'command' => 't3_messenger:show-configuration', ]); - // Dashboard Integration - $services->set(FailedMessageRepository::class)->args([abstract_arg('failure_transports')]); - $services - ->set('dashboard.widget.failedMessages') - ->class(ListOfFailedMessagesWidget::class) - ->arg('$dataProvider', service(FailedMessagesDataProvider::class)) - ->arg('$view', service('dashboard.views.widget')) - ->tag( - 'dashboard.widget', - [ - 'identifier' => 'failedMessages', - 'groupNames' => 'news', - 'title' => 'LLL:EXT:t3_messenger/Resources/Private/Language/locallang.xlf:widgets.failedMessages.title', - 'description' => 'LLL:EXT:t3_messenger/Resources/Private/Language/locallang.xlf:widgets.failedMessages.description', - 'iconIdentifier' => 'tx-messenger-failed-messages-icon', - 'height' => 'large', - 'width' => 'large', - ] - ); - // must be registered before removing private services as some might be listeners/subscribers // but as late as possible to get resolved parameters $containerBuilder->addCompilerPass($registerListenersPass, PassConfig::TYPE_BEFORE_REMOVING); @@ -448,5 +424,4 @@ static function (ChildDefinition $definition, AsMessageHandler $attribute): void $containerBuilder->addCompilerPass(new ConsoleCommandPass('console.command')); $containerBuilder->addCompilerPass(new MessengerCommandToHandlerMapperPass()); $containerBuilder->addCompilerPass(new MessengerAlterTableListenerPass()); - $containerBuilder->addCompilerPass(new FailureReceiverPass()); }; diff --git a/Configuration/TypoScript/setup.typoscript b/Configuration/TypoScript/setup.typoscript deleted file mode 100644 index c9112f7..0000000 --- a/Configuration/TypoScript/setup.typoscript +++ /dev/null @@ -1,4 +0,0 @@ -module.tx_dashboard.view { - templateRootPaths.110 = EXT:t3_messenger/Resources/Private/Templates - partialRootPaths.110 = EXT:t3_messenger/Resources/Private/Partials -} diff --git a/Resources/Private/Language/locallang.xlf b/Resources/Private/Language/locallang.xlf deleted file mode 100644 index 0dea6c6..0000000 --- a/Resources/Private/Language/locallang.xlf +++ /dev/null @@ -1,30 +0,0 @@ - -> - - - - - Recently failed messages - - - Shows a list of recently failed messages. - - - Message - - - Error Message - - - Redelivered - - - Retries - - - No messages found - - - - diff --git a/Resources/Private/Templates/Widget/ListOfFailedMessagesWidget.html b/Resources/Private/Templates/Widget/ListOfFailedMessagesWidget.html deleted file mode 100644 index ab6d725..0000000 --- a/Resources/Private/Templates/Widget/ListOfFailedMessagesWidget.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - Id - - - - - - - - - - - {failedMessage.messageId} - - - - {failedMessage.message} - - - - {failedMessage.errorMessage} - - - {failedMessage.redelivered -> f:format.date(format: 'd.m.Y - H:i:s')} - - - {failedMessage.retryCount} - - - - - - - - - - - - - - - - - - - diff --git a/Resources/Public/Icons/failed-messages.svg b/Resources/Public/Icons/failed-messages.svg deleted file mode 100644 index 664d042..0000000 --- a/Resources/Public/Icons/failed-messages.svg +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Tests/Functional/Repository/FailedMessageRepositoryTest.php b/Tests/Functional/Repository/FailedMessageRepositoryTest.php deleted file mode 100644 index 0ed7483..0000000 --- a/Tests/Functional/Repository/FailedMessageRepositoryTest.php +++ /dev/null @@ -1,87 +0,0 @@ -testExtensionsToLoad = [ - 'typo3conf/ext/typo3_psr_cache_adapter', - 'typo3conf/ext/t3_messenger', - 'typo3conf/ext/t3_messenger/Tests/Functional/Fixtures/Extensions/t3_messenger_test', - ]; - parent::setUp(); - $this->subject = $this->get(FailedMessageRepository::class); - $this->messageBus = $this->get(MessageBusInterface::class); - } - - public function test(): void - { - // Arrange - $this->messageBus->dispatch(new MyFailingCommand('Add to failed queue')); - $this->runWorker(); - $this->messageBus->dispatch(new MyOtherFailingCommand('Add to failed queue')); - $this->runWorker(); - - // Act - $failedMessages = $this->subject->list(); - - // Assert - $failedMessagesInAssertion = []; - foreach ($failedMessages as $failedMessage) { - $failedMessagesInAssertion[] = [ - 'class' => $failedMessage->getMessage(), - 'error_message' => $failedMessage->getErrorMessage(), - ]; - } - - self::assertCount(2, $failedMessages); - self::assertSame([ - [ - 'class' => MyOtherFailingCommand::class, - 'error_message' => 'Failing by intention', - ], - [ - 'class' => MyFailingCommand::class, - 'error_message' => 'Failing by intention', - ], - ], $failedMessagesInAssertion); - } - - private function runWorker(): void - { - $receivers = [ - 'async' => $this->get('messenger.transport.async'), - ]; - - /** @var EventDispatcher $eventDispatcher */ - $eventDispatcher = $this->get('event_dispatcher'); - $eventDispatcher->addSubscriber(new StopWorkerOnFailureLimitListener(1)); - - $worker = new Worker($receivers, $this->get('command.bus'), $eventDispatcher); - $worker->run(); - } -} diff --git a/composer.json b/composer.json index 9abf4b3..f473e66 100644 --- a/composer.json +++ b/composer.json @@ -17,12 +17,12 @@ "php": "^7.4 || ^8.0", "typo3/cms-core": "^10.4 || ^11.5 || ^12.4", "typo3/cms-extbase": "^10.4 || ^11.5 || ^12.4", - "typo3/cms-dashboard": "^10.4 || ^11.5 || ^12.4", "symfony/messenger": "^5.0 || ^6.2", "symfony/options-resolver": "^5.0 || ^6.2", "symfony/doctrine-messenger": "^5.0 || ^6.2", "psr/cache": "^1.0 || ^2.0", - "ssch/typo3-psr-cache-adapter": "^1.2" + "ssch/typo3-psr-cache-adapter": "^1.2", + "ext-json": "*" }, "require-dev": { "symplify/easy-coding-standard": "^12.0", @@ -90,7 +90,7 @@ }, "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-main": "2.0.x-dev" }, "typo3/cms": { "extension-key": "t3_messenger", diff --git a/ext_localconf.php b/ext_localconf.php index f1706df..a0b7b72 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -13,17 +13,4 @@ 'groups' => ['system'], ]; } - - \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTypoScriptSetup( - "@import 'EXT:t3_messenger/Configuration/TypoScript/setup.typoscript'" - ); - - $iconRegistry = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Imaging\IconRegistry::class); - $iconRegistry->registerIcon( - 'tx-messenger-failed-messages-icon', - \TYPO3\CMS\Core\Imaging\IconProvider\SvgIconProvider::class, - [ - 'source' => 'EXT:t3_messenger/Resources/Public/Icons/failed-messages.svg', - ] - ); }); diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 578c812..3dc866d 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -1,19 +1,19 @@ parameters: ignoreErrors: - - message: "#^Parameter \\#2 \\$packageCache of static method TYPO3\\\\CMS\\\\Core\\\\Core\\\\Bootstrap\\:\\:createPackageManager\\(\\) expects TYPO3\\\\CMS\\\\Core\\\\Package\\\\Cache\\\\PackageCacheInterface, TYPO3\\\\CMS\\\\Core\\\\Cache\\\\Frontend\\\\FrontendInterface given\\.$#" + message: "#^Call to an undefined method ReflectionClass\\:\\:getAttributes\\(\\)\\.$#" count: 1 path: Classes/DependencyInjection/Compiler/T3MessengerPass.php - - message: "#^Parameter \\#1 \\$mailer of class Ssch\\\\T3Messenger\\\\Mailer\\\\Event\\\\AfterMailerSentMessageEvent constructor expects Ssch\\\\T3Messenger\\\\Mailer\\\\Contract\\\\MailerInterface, \\$this\\(Ssch\\\\T3Messenger\\\\Mailer\\\\MessengerMailer\\) given\\.$#" + message: "#^Parameter \\#2 \\$packageCache of static method TYPO3\\\\CMS\\\\Core\\\\Core\\\\Bootstrap\\:\\:createPackageManager\\(\\) expects TYPO3\\\\CMS\\\\Core\\\\Package\\\\Cache\\\\PackageCacheInterface, TYPO3\\\\CMS\\\\Core\\\\Cache\\\\Frontend\\\\FrontendInterface given\\.$#" count: 1 - path: Classes/Mailer/MessengerMailer.php + path: Classes/DependencyInjection/Compiler/T3MessengerPass.php - - message: "#^Parameter \\#1 \\$mailer of class Ssch\\\\T3Messenger\\\\Mailer\\\\Event\\\\BeforeMailerSentMessageEvent constructor expects Ssch\\\\T3Messenger\\\\Mailer\\\\Contract\\\\MailerInterface, \\$this\\(Ssch\\\\T3Messenger\\\\Mailer\\\\MessengerMailer\\) given\\.$#" - count: 1 - path: Classes/Mailer/MessengerMailer.php + message: "#^Class Doctrine\\\\DBAL\\\\Platforms\\\\PostgreSqlPlatform referenced with incorrect case\\: Doctrine\\\\DBAL\\\\Platforms\\\\PostgreSQLPlatform\\.$#" + count: 2 + path: Classes/Transport/DoctrineTransportFactory.php - message: "#^Call to function method_exists\\(\\) with Symfony\\\\Component\\\\EventDispatcher\\\\DependencyInjection\\\\RegisterListenersPass and 'setNoPreloadEvents' will always evaluate to true\\.$#" @@ -25,17 +25,7 @@ parameters: count: 1 path: Configuration/Services.php - - - message: "#^Class Symfony\\\\Component\\\\Messenger\\\\Bridge\\\\Amqp\\\\Transport\\\\AmqpTransportFactory not found\\.$#" - count: 1 - path: Configuration/Services.php - - message: "#^Class Symfony\\\\Component\\\\Messenger\\\\Bridge\\\\Beanstalkd\\\\Transport\\\\BeanstalkdTransportFactory not found\\.$#" count: 1 path: Configuration/Services.php - - - - message: "#^Class Symfony\\\\Component\\\\Messenger\\\\Bridge\\\\Redis\\\\Transport\\\\RedisTransportFactory not found\\.$#" - count: 1 - path: Configuration/Services.php diff --git a/phpstan.neon b/phpstan.neon index 7c3a0b3..d03e35f 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -19,4 +19,6 @@ parameters: ignoreErrors: - "#Used function Symfony\\\\Component\\\\DependencyInjection\\\\Loader\\\\Configurator\\\\abstract_arg not found#" - "#Function Symfony\\\\Component\\\\DependencyInjection\\\\Loader\\\\Configurator\\\\abstract_arg not found#" + - "#Class Symfony\\\\Component\\\\Messenger\\\\Bridge\\\\Amqp\\\\Transport\\\\AmqpTransportFactory not found#" + - "#Class Symfony\\\\Component\\\\Messenger\\\\Bridge\\\\Redis\\\\Transport\\\\RedisTransportFactory not found#"
- -