From d83147aab0ed4775c48596a697eb3cf09212a054 Mon Sep 17 00:00:00 2001 From: Khoubza Younes Date: Sun, 6 Dec 2020 14:04:54 +0100 Subject: [PATCH] clean up config and add delay stamp --- .../EventListener/PostFilterListener.php | 32 +++- src/Prime/Flasher.php | 2 +- .../Middleware/AddDelayStampMiddleware.php | 18 ++ .../Notification/NotificationBuilder.php | 21 +++ src/Prime/Stamp/DelayStamp.php | 27 +++ src/Symfony/Resources/config/aliases.yaml | 27 --- src/Symfony/Resources/config/config.yaml | 154 ++++++++++++++++-- .../Resources/config/event_subscribers.yaml | 29 ---- src/Symfony/Resources/config/filters.yaml | 14 -- src/Symfony/Resources/config/middlewares.yaml | 18 -- src/Symfony/Resources/config/presenters.yaml | 26 --- src/Symfony/Resources/config/services.yaml | 25 --- src/Symfony/Resources/config/storage.yaml | 11 -- src/Symfony/Resources/config/twig.yaml | 7 - src/Symfony/Storage/Storage.php | 22 +++ 15 files changed, 261 insertions(+), 172 deletions(-) create mode 100644 src/Prime/Middleware/AddDelayStampMiddleware.php create mode 100644 src/Prime/Stamp/DelayStamp.php delete mode 100644 src/Symfony/Resources/config/aliases.yaml delete mode 100644 src/Symfony/Resources/config/event_subscribers.yaml delete mode 100644 src/Symfony/Resources/config/filters.yaml delete mode 100644 src/Symfony/Resources/config/middlewares.yaml delete mode 100644 src/Symfony/Resources/config/presenters.yaml delete mode 100644 src/Symfony/Resources/config/services.yaml delete mode 100644 src/Symfony/Resources/config/storage.yaml delete mode 100644 src/Symfony/Resources/config/twig.yaml diff --git a/src/Prime/EventDispatcher/EventListener/PostFilterListener.php b/src/Prime/EventDispatcher/EventListener/PostFilterListener.php index d91853ab..79335fc9 100644 --- a/src/Prime/EventDispatcher/EventListener/PostFilterListener.php +++ b/src/Prime/EventDispatcher/EventListener/PostFilterListener.php @@ -4,9 +4,24 @@ namespace Flasher\Prime\EventDispatcher\EventListener; use Flasher\Prime\EventDispatcher\Event\PostFilterEvent; use Flasher\Prime\Envelope; +use Flasher\Prime\Stamp\DelayStamp; +use Flasher\Prime\Storage\StorageInterface; final class PostFilterListener implements EventSubscriberInterface { + /** + * @var StorageInterface + */ + private $storage; + + /** + * @param StorageInterface $storage + */ + public function __construct(StorageInterface $storage) + { + $this->storage = $storage; + } + /** * @param PostFilterEvent $event * @@ -15,14 +30,23 @@ final class PostFilterListener implements EventSubscriberInterface public function __invoke(PostFilterEvent $event) { $envelopes = $event->getEnvelopes(); + $filtered = array(); - $envelopes = array_filter($envelopes, static function (Envelope $envelope) { + foreach ($envelopes as $envelope) { $hopsStamp = $envelope->get('Flasher\Prime\Stamp\HopsStamp'); + $delayStamp = $envelope->get('Flasher\Prime\Stamp\DelayStamp'); - return $hopsStamp->getAmount() > 0; - }); + if (0 < $hopsStamp->getAmount() && 0 === $delayStamp->getDelay()) { + $filtered[] = $envelope; - $event->setEnvelopes($envelopes); + continue; + } + + $envelope->withStamp(new DelayStamp($delayStamp->getDelay() - 1)); + $this->storage->update($envelope); + } + + $event->setEnvelopes($filtered); } /** diff --git a/src/Prime/Flasher.php b/src/Prime/Flasher.php index a48e28df..4d4f3bfb 100644 --- a/src/Prime/Flasher.php +++ b/src/Prime/Flasher.php @@ -18,7 +18,7 @@ use Flasher\Prime\Notification\NotificationInterface; * @method NotificationBuilderInterface warning($message = null, array $options = array()) * @method NotificationInterface getNotification() */ -final class Flasher extends AbstractManager +final class Flasher extends AbstractManager implements FlasherInterface { public function getDefaultDriver() { diff --git a/src/Prime/Middleware/AddDelayStampMiddleware.php b/src/Prime/Middleware/AddDelayStampMiddleware.php new file mode 100644 index 00000000..7ad9f206 --- /dev/null +++ b/src/Prime/Middleware/AddDelayStampMiddleware.php @@ -0,0 +1,18 @@ +get('Flasher\Prime\Stamp\DelayStamp')) { + $envelope->withStamp(new DelayStamp(0)); + } + + return $next($envelope); + } +} diff --git a/src/Prime/Notification/NotificationBuilder.php b/src/Prime/Notification/NotificationBuilder.php index 898bb9de..fd1bc589 100644 --- a/src/Prime/Notification/NotificationBuilder.php +++ b/src/Prime/Notification/NotificationBuilder.php @@ -5,6 +5,7 @@ namespace Flasher\Prime\Notification; use Flasher\Prime\Envelope; use Flasher\Prime\EventDispatcher\Event\EnvelopeDispatchedEvent; use Flasher\Prime\EventDispatcher\EventDispatcherInterface; +use Flasher\Prime\Stamp\DelayStamp; use Flasher\Prime\Stamp\HandlerStamp; use Flasher\Prime\Stamp\HopsStamp; use Flasher\Prime\Stamp\PriorityStamp; @@ -184,6 +185,26 @@ class NotificationBuilder implements NotificationBuilderInterface return $this; } + /** + * @param int $delay + * + * @return $this + */ + public function delay($delay) + { + $this->envelope->withStamp(new DelayStamp($delay)); + + return $this; + } + + /** + * @return $this + */ + public function now() + { + return $this->delay(0); + } + /** * @inheritDoc */ diff --git a/src/Prime/Stamp/DelayStamp.php b/src/Prime/Stamp/DelayStamp.php new file mode 100644 index 00000000..6900afd1 --- /dev/null +++ b/src/Prime/Stamp/DelayStamp.php @@ -0,0 +1,27 @@ +delay = $delay; + } + + /** + * @return int + */ + public function getDelay() + { + return $this->delay; + } +} diff --git a/src/Symfony/Resources/config/aliases.yaml b/src/Symfony/Resources/config/aliases.yaml deleted file mode 100644 index 0f601d68..00000000 --- a/src/Symfony/Resources/config/aliases.yaml +++ /dev/null @@ -1,27 +0,0 @@ -services: - Flasher\Prime\Config\Config: '@flasher.config' - Flasher\Prime\Manager\AbstractManager: '@flasher.abstract_manager' - Flasher\Prime\Flasher: '@flasher' - Flasher\Prime\Presenter\PresenterManager: '@flasher.presenter_manager' - Flasher\Prime\Renderer\RendererManager: '@flasher.renderer_manager' - Flasher\Prime\Middleware\FlasherBus: '@flasher.flasher_bus' - Flasher\Prime\EventDispatcher\EventDispatcher: '@flasher.event_dispatcher' - Flasher\Symfony\Storage\Storage: '@flasher.storage' - Flasher\Prime\Storage\StorageManager: '@flasher.storage_manager' - Flasher\Prime\Filter\FilterManager: '@flasher.filter_manager' - Flasher\Prime\Filter\FilterBuilder: '@flasher.filter_builder' - Flasher\Prime\Filter\DefaultFilter: '@flasher.filter.default' - Flasher\Prime\Factory\AbstractFactory: '@flasher.abstract_factory' - Flasher\Prime\Presenter\AbstractPresenter: '@flasher.abstract_presenter' - Flasher\Prime\Presenter\Adapter\JsonPresenter: '@flasher.presenter.json' - Flasher\Prime\Presenter\Adapter\HtmlPresenter: '@flasher.presenter.html' - - flasher.factory_manager: '@flasher' - Flasher\Prime\FlasherInterface: '@flasher' - Flasher\Prime\Storage\StorageManagerInterface: '@flasher.storage_manager' - Flasher\Prime\Renderer\RendererManagerInterface: '@flasher.renderer_manager' - Flasher\Prime\Presenter\PresenterManagerInterface: '@flasher.presenter_manager' - Flasher\Prime\Middleware\FlasherBusInterface: '@flasher.flasher_bus' - Flasher\Prime\Filter\FilterManagerInterface: '@flasher.filter_manager' - Flasher\Prime\EventDispatcher\EventDispatcherInterface: '@flasher.event_dispatcher' - Flasher\Prime\Storage\StorageInterface: '@flasher.storage' diff --git a/src/Symfony/Resources/config/config.yaml b/src/Symfony/Resources/config/config.yaml index 103377f2..876166ae 100644 --- a/src/Symfony/Resources/config/config.yaml +++ b/src/Symfony/Resources/config/config.yaml @@ -1,13 +1,3 @@ -imports: -# - { resource: 'services.yaml' } - - { resource: 'middlewares.yaml' } - - { resource: 'storage.yaml' } - - { resource: 'presenters.yaml' } - - { resource: 'filters.yaml' } - - { resource: 'twig.yaml' } - - { resource: 'event_subscribers.yaml' } - - { resource: 'aliases.yaml' } - services: flasher.config: class: Flasher\Prime\Config\Config @@ -33,3 +23,147 @@ services: flasher.renderer_manager: class: Flasher\Prime\Renderer\RendererManager parent: 'flasher.abstract_manager' + + flasher.flasher_bus: + class: Flasher\Prime\Middleware\FlasherBus + + flasher.middleware.add_created_stamp: + class: Flasher\Prime\Middleware\AddCreatedAtStampMiddleware + public: false + tags: + - { name: 'flasher.middleware' } + + flasher.middleware.add_hops_stamp: + class: Flasher\Prime\Middleware\AddHopsStampMiddleware + public: false + tags: + - { name: 'flasher.middleware' } + + flasher.middleware.add_priority_stamp: + class: Flasher\Prime\Middleware\AddPriorityStampMiddleware + public: false + tags: + - { name: 'flasher.middleware' } + + flasher.middleware.add_delay_stamp: + class: Flasher\Prime\Middleware\AddDelayStampMiddleware + public: false + tags: + - { name: 'flasher.middleware' } + + flasher.storage: + class: Flasher\Symfony\Storage\Storage + arguments: + - '@session' + + flasher.storage_manager: + class: Flasher\Prime\Storage\StorageManager + arguments: + - '@flasher.storage' + - '@flasher.event_dispatcher' + + flasher.event_dispatcher: + class: Flasher\Prime\EventDispatcher\EventDispatcher + + flasher.event_listener.post_filter: + class: Flasher\Prime\EventDispatcher\EventListener\PostFilterListener + public: false + arguments: + - '@flasher.storage' + tags: + - { name: 'flasher.event_subscriber' } + + flasher.event_listener.post_flush: + class: Flasher\Prime\EventDispatcher\EventListener\PostFlushListener + public: false + arguments: + - '@flasher.storage' + tags: + - { name: 'flasher.event_subscriber' } + + flasher.event_listener.middleware: + class: Flasher\Prime\EventDispatcher\EventListener\MiddlewareListener + public: false + arguments: + - '@flasher.flasher_bus' + tags: + - { name: 'flasher.event_subscriber' } + + flasher.event_listener.storage: + class: Flasher\Prime\EventDispatcher\EventListener\StorageListener + public: false + arguments: + - '@flasher.storage' + tags: + - { name: 'flasher.event_subscriber' } + + flasher.filter_manager: + class: Flasher\Prime\Filter\FilterManager + parent: 'flasher.abstract_manager' + + flasher.filter_builder: + class: Flasher\Prime\Filter\FilterBuilder + + flasher.filter.default: + class: Flasher\Prime\Filter\DefaultFilter + arguments: + - '@flasher.filter_builder' + tags: + - { name: 'flasher.filter' } + + flasher.presenter_manager: + class: Flasher\Prime\Presenter\PresenterManager + parent: 'flasher.abstract_manager' + + flasher.abstract_presenter: + class: Flasher\Prime\Presenter\AbstractPresenter + abstract: true + arguments: + - '@flasher.event_dispatcher' + - '@flasher.config' + - '@flasher.storage_manager' + - '@flasher.filter_manager' + - '@flasher.renderer_manager' + + flasher.presenter.html: + class: Flasher\Prime\Presenter\Adapter\HtmlPresenter + parent: 'flasher.abstract_presenter' + tags: + - { name: 'flasher.presenter' } + + flasher.presenter.json: + class: Flasher\Prime\Presenter\Adapter\JsonPresenter + parent: 'flasher.abstract_presenter' + tags: + - { name: 'flasher.presenter' } + + flasher.twig.extension: + class: Flasher\Symfony\Twig\FlasherTwigExtension + arguments: + - '@flasher.presenter.html' + tags: + - { name: 'twig.extension' } + + Flasher\Prime\Config\Config: '@flasher.config' + Flasher\Prime\Flasher: '@flasher' + Flasher\Prime\Presenter\PresenterManager: '@flasher.presenter_manager' + Flasher\Prime\Renderer\RendererManager: '@flasher.renderer_manager' + Flasher\Prime\Middleware\FlasherBus: '@flasher.flasher_bus' + Flasher\Prime\EventDispatcher\EventDispatcher: '@flasher.event_dispatcher' + Flasher\Symfony\Storage\Storage: '@flasher.storage' + Flasher\Prime\Storage\StorageManager: '@flasher.storage_manager' + Flasher\Prime\Filter\FilterManager: '@flasher.filter_manager' + Flasher\Prime\Filter\FilterBuilder: '@flasher.filter_builder' + Flasher\Prime\Filter\DefaultFilter: '@flasher.filter.default' + Flasher\Prime\Presenter\Adapter\JsonPresenter: '@flasher.presenter.json' + Flasher\Prime\Presenter\Adapter\HtmlPresenter: '@flasher.presenter.html' + + flasher.factory_manager: '@flasher' + Flasher\Prime\FlasherInterface: '@flasher' + Flasher\Prime\Storage\StorageManagerInterface: '@flasher.storage_manager' + Flasher\Prime\Renderer\RendererManagerInterface: '@flasher.renderer_manager' + Flasher\Prime\Presenter\PresenterManagerInterface: '@flasher.presenter_manager' + Flasher\Prime\Middleware\FlasherBusInterface: '@flasher.flasher_bus' + Flasher\Prime\Filter\FilterManagerInterface: '@flasher.filter_manager' + Flasher\Prime\EventDispatcher\EventDispatcherInterface: '@flasher.event_dispatcher' + Flasher\Prime\Storage\StorageInterface: '@flasher.storage' diff --git a/src/Symfony/Resources/config/event_subscribers.yaml b/src/Symfony/Resources/config/event_subscribers.yaml deleted file mode 100644 index 32679a92..00000000 --- a/src/Symfony/Resources/config/event_subscribers.yaml +++ /dev/null @@ -1,29 +0,0 @@ -services: - flasher.event_dispatcher: - class: Flasher\Prime\EventDispatcher\EventDispatcher - - Flasher\Prime\EventDispatcher\EventListener\PostFilterListener: - public: false - tags: - - 'flasher.event_subscriber' - - Flasher\Prime\EventDispatcher\EventListener\PostFlushListener: - public: false - arguments: - - '@flasher.storage' - tags: - - 'flasher.event_subscriber' - - Flasher\Prime\EventDispatcher\EventListener\MiddlewareListener: - public: false - arguments: - - '@flasher.flasher_bus' - tags: - - 'flasher.event_subscriber' - - Flasher\Prime\EventDispatcher\EventListener\StorageListener: - public: false - arguments: - - '@flasher.storage' - tags: - - 'flasher.event_subscriber' diff --git a/src/Symfony/Resources/config/filters.yaml b/src/Symfony/Resources/config/filters.yaml deleted file mode 100644 index b3b036e9..00000000 --- a/src/Symfony/Resources/config/filters.yaml +++ /dev/null @@ -1,14 +0,0 @@ -services: - flasher.filter_manager: - class: Flasher\Prime\Filter\FilterManager - parent: 'flasher.abstract_manager' - - flasher.filter_builder: - class: Flasher\Prime\Filter\FilterBuilder - - flasher.filter.default: - class: Flasher\Prime\Filter\DefaultFilter - arguments: - - '@flasher.filter_builder' - tags: - - 'flasher.filter' diff --git a/src/Symfony/Resources/config/middlewares.yaml b/src/Symfony/Resources/config/middlewares.yaml deleted file mode 100644 index 65bb3e6b..00000000 --- a/src/Symfony/Resources/config/middlewares.yaml +++ /dev/null @@ -1,18 +0,0 @@ -services: - flasher.flasher_bus: - class: Flasher\Prime\Middleware\FlasherBus - - Flasher\Prime\Middleware\AddCreatedAtStampMiddleware: - public: false - tags: - - 'flasher.middleware' - - Flasher\Prime\Middleware\AddHopsStampMiddleware: - public: false - tags: - - 'flasher.middleware' - - Flasher\Prime\Middleware\AddPriorityStampMiddleware: - public: false - tags: - - 'flasher.middleware' diff --git a/src/Symfony/Resources/config/presenters.yaml b/src/Symfony/Resources/config/presenters.yaml deleted file mode 100644 index 7af2bff1..00000000 --- a/src/Symfony/Resources/config/presenters.yaml +++ /dev/null @@ -1,26 +0,0 @@ -services: - flasher.presenter_manager: - class: Flasher\Prime\Presenter\PresenterManager - parent: 'flasher.abstract_manager' - - flasher.abstract_presenter: - class: Flasher\Prime\Presenter\AbstractPresenter - abstract: true - arguments: - - '@flasher.event_dispatcher' - - '@flasher.config' - - '@flasher.storage_manager' - - '@flasher.filter_manager' - - '@flasher.renderer_manager' - - flasher.presenter.html: - class: Flasher\Prime\Presenter\Adapter\HtmlPresenter - parent: 'flasher.abstract_presenter' - tags: - - 'flasher.presenter' - - flasher.presenter.json: - class: Flasher\Prime\Presenter\Adapter\JsonPresenter - parent: 'flasher.abstract_presenter' - tags: - - 'flasher.presenter' diff --git a/src/Symfony/Resources/config/services.yaml b/src/Symfony/Resources/config/services.yaml deleted file mode 100644 index e967a885..00000000 --- a/src/Symfony/Resources/config/services.yaml +++ /dev/null @@ -1,25 +0,0 @@ -services: - flasher.config: - class: Flasher\Prime\Config\Config - arguments: - - null - - flasher.abstract_manager: - class: Flasher\Prime\Manager\AbstractManager - abstract: true - arguments: - - '@flasher.config' - - flasher: - class: Flasher\Prime\Flasher - parent: 'flasher.abstract_manager' - - flasher.renderer_manager: - class: Flasher\Prime\Renderer\RendererManager - parent: 'flasher.abstract_manager' - - flasher.abstract_factory: - class: Flasher\Prime\Factory\AbstractFactory - abstract: true - arguments: - - '@flasher.flasher_bus' diff --git a/src/Symfony/Resources/config/storage.yaml b/src/Symfony/Resources/config/storage.yaml deleted file mode 100644 index 6ffa1ced..00000000 --- a/src/Symfony/Resources/config/storage.yaml +++ /dev/null @@ -1,11 +0,0 @@ -services: - flasher.storage: - class: Flasher\Symfony\Storage\Storage - arguments: - - '@session' - - flasher.storage_manager: - class: Flasher\Prime\Storage\StorageManager - arguments: - - '@flasher.storage' - - '@flasher.event_dispatcher' diff --git a/src/Symfony/Resources/config/twig.yaml b/src/Symfony/Resources/config/twig.yaml deleted file mode 100644 index 3fa176ea..00000000 --- a/src/Symfony/Resources/config/twig.yaml +++ /dev/null @@ -1,7 +0,0 @@ -services: - Flasher\Symfony\Twig\FlasherTwigExtension: - class: - arguments: - - '@flasher.presenter.html' - tags: - - 'twig.extension' diff --git a/src/Symfony/Storage/Storage.php b/src/Symfony/Storage/Storage.php index 50189bb4..2c3c59ab 100644 --- a/src/Symfony/Storage/Storage.php +++ b/src/Symfony/Storage/Storage.php @@ -51,6 +51,28 @@ final class Storage implements StorageInterface $this->session->set(self::ENVELOPES_NAMESPACE, $store); } + /** + * @inheritDoc + */ + public function update($envelopes) + { + $envelopes = is_array($envelopes) ? $envelopes : func_get_args(); + $map = UuidStamp::indexWithUuid($envelopes); + + $store = $this->all(); + foreach ($store as $index => $envelope) { + $uuid = $envelope->get('Flasher\Prime\Stamp\UuidStamp')->getUuid(); + + if (!isset($map[$uuid])) { + continue; + } + + $store[$index] = $map[$uuid]; + } + + $this->session->set(self::ENVELOPES_NAMESPACE, $store); + } + /** * @inheritDoc */