first commit

This commit is contained in:
Sampanna Rimal
2024-08-27 17:48:06 +05:45
commit 53c0140f58
10839 changed files with 1125847 additions and 0 deletions

View File

@ -0,0 +1,52 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher\Event;
use Flasher\Prime\Filter\Filter;
use Flasher\Prime\Notification\Envelope;
final class FilterEvent
{
/**
* @var Filter
*/
private $filter;
/**
* @param Envelope[] $envelopes
* @param array<string, mixed> $criteria
*/
public function __construct(array $envelopes, array $criteria)
{
$this->filter = new Filter($envelopes, $criteria);
}
/**
* @return Envelope[]
*/
public function getEnvelopes()
{
return $this->filter->getResult();
}
/**
* @return Filter
*/
public function getFilter()
{
return $this->filter;
}
/**
* @return void
*/
public function setFilter(Filter $filter)
{
$this->filter = $filter;
}
}

View File

@ -0,0 +1,44 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher\Event;
use Flasher\Prime\Notification\Envelope;
final class PersistEvent
{
/**
* @var Envelope[]
*/
private $envelopes;
/**
* @param Envelope[] $envelopes
*/
public function __construct(array $envelopes)
{
$this->envelopes = $envelopes;
}
/**
* @return Envelope[]
*/
public function getEnvelopes()
{
return $this->envelopes;
}
/**
* @param Envelope[] $envelopes
*
* @return void
*/
public function setEnvelopes(array $envelopes)
{
$this->envelopes = $envelopes;
}
}

View File

@ -0,0 +1,34 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher\Event;
use Flasher\Prime\Notification\Envelope;
final class PostPersistEvent
{
/**
* @var Envelope[]
*/
private $envelopes;
/**
* @param Envelope[] $envelopes
*/
public function __construct(array $envelopes)
{
$this->envelopes = $envelopes;
}
/**
* @return Envelope[]
*/
public function getEnvelopes()
{
return $this->envelopes;
}
}

View File

@ -0,0 +1,49 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher\Event;
use Flasher\Prime\Notification\Envelope;
final class PostRemoveEvent
{
/**
* @var Envelope[]
*/
private $envelopesToRemove;
/**
* @var Envelope[]
*/
private $envelopesToKeep;
/**
* @param Envelope[] $envelopesToRemove
* @param Envelope[] $envelopesToKeep
*/
public function __construct(array $envelopesToRemove = array(), array $envelopesToKeep = array())
{
$this->envelopesToRemove = $envelopesToRemove;
$this->envelopesToKeep = $envelopesToKeep;
}
/**
* @return Envelope[]
*/
public function getEnvelopesToRemove()
{
return $this->envelopesToRemove;
}
/**
* @return Envelope[]
*/
public function getEnvelopesToKeep()
{
return $this->envelopesToKeep;
}
}

View File

@ -0,0 +1,34 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher\Event;
use Flasher\Prime\Notification\Envelope;
final class PostUpdateEvent
{
/**
* @var Envelope[]
*/
private $envelopes;
/**
* @param Envelope[] $envelopes
*/
public function __construct(array $envelopes)
{
$this->envelopes = $envelopes;
}
/**
* @return Envelope[]
*/
public function getEnvelopes()
{
return $this->envelopes;
}
}

View File

@ -0,0 +1,49 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher\Event;
use Flasher\Prime\Notification\Envelope;
final class PresentationEvent
{
/**
* @var Envelope[]
*/
private $envelopes;
/**
* @var mixed[]
*/
private $context;
/**
* @param Envelope[] $envelopes
* @param mixed[] $context
*/
public function __construct(array $envelopes, array $context)
{
$this->envelopes = $envelopes;
$this->context = $context;
}
/**
* @return Envelope[]
*/
public function getEnvelopes()
{
return $this->envelopes;
}
/**
* @return mixed[]
*/
public function getContext()
{
return $this->context;
}
}

View File

@ -0,0 +1,67 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher\Event;
use Flasher\Prime\Notification\Envelope;
final class RemoveEvent
{
/**
* @var Envelope[]
*/
private $envelopesToRemove = array();
/**
* @var Envelope[]
*/
private $envelopesToKeep = array();
/**
* @param Envelope[] $envelopesToRemove
*/
public function __construct(array $envelopesToRemove)
{
$this->envelopesToRemove = $envelopesToRemove;
}
/**
* @return Envelope[]
*/
public function getEnvelopesToRemove()
{
return $this->envelopesToRemove;
}
/**
* @param Envelope[] $envelopesToRemove
*
* @return void
*/
public function setEnvelopesToRemove($envelopesToRemove)
{
$this->envelopesToRemove = $envelopesToRemove;
}
/**
* @return Envelope[]
*/
public function getEnvelopesToKeep()
{
return $this->envelopesToKeep;
}
/**
* @param Envelope[] $envelopesToKeep
*
* @return void
*/
public function setEnvelopesToKeep($envelopesToKeep)
{
$this->envelopesToKeep = $envelopesToKeep;
}
}

View File

@ -0,0 +1,57 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher\Event;
final class ResponseEvent
{
/**
* @var mixed
*/
private $response;
/**
* @var string
*/
private $presenter;
/**
* @param mixed $response
* @param string $presenter
*/
public function __construct($response, $presenter)
{
$this->response = $response;
$this->presenter = $presenter;
}
/**
* @return mixed
*/
public function getResponse()
{
return $this->response;
}
/**
* @param mixed $response
*
* @return void
*/
public function setResponse($response)
{
$this->response = $response;
}
/**
* @return string
*/
public function getPresenter()
{
return $this->presenter;
}
}

View File

@ -0,0 +1,16 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher\Event;
interface StoppableEventInterface
{
/**
* @return bool
*/
public function isPropagationStopped();
}

View File

@ -0,0 +1,44 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher\Event;
use Flasher\Prime\Notification\Envelope;
final class UpdateEvent
{
/**
* @var Envelope[]
*/
private $envelopes;
/**
* @param Envelope[] $envelopes
*/
public function __construct(array $envelopes)
{
$this->envelopes = $envelopes;
}
/**
* @return Envelope[]
*/
public function getEnvelopes()
{
return $this->envelopes;
}
/**
* @param Envelope[] $envelopes
*
* @return void
*/
public function setEnvelopes(array $envelopes)
{
$this->envelopes = $envelopes;
}
}

View File

@ -0,0 +1,89 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher;
use Flasher\Prime\EventDispatcher\Event\StoppableEventInterface;
use Flasher\Prime\EventDispatcher\EventListener\AddToStorageListener;
use Flasher\Prime\EventDispatcher\EventListener\EventSubscriberInterface;
use Flasher\Prime\EventDispatcher\EventListener\RemoveListener;
use Flasher\Prime\EventDispatcher\EventListener\StampsListener;
final class EventDispatcher implements EventDispatcherInterface
{
/**
* @var array<string, EventSubscriberInterface[]>
*/
private $listeners = array();
public function __construct()
{
$this->addSubscriber(new RemoveListener());
$this->addSubscriber(new StampsListener());
$this->addSubscriber(new AddToStorageListener());
}
/**
* {@inheritdoc}
*/
public function dispatch($event)
{
$listeners = $this->getListeners(\get_class($event));
$this->callListeners($listeners, $event); // @phpstan-ignore-line
return $event;
}
/**
* {@inheritdoc}
*/
public function addListener($eventName, $listener)
{
$this->listeners[$eventName][] = $listener; // @phpstan-ignore-line
}
/**
* {@inheritdoc}
*/
public function addSubscriber(EventSubscriberInterface $subscriber)
{
foreach ((array) $subscriber->getSubscribedEvents() as $eventName) {
$this->addListener($eventName, array($subscriber, '__invoke')); // @phpstan-ignore-line
}
}
/**
* @param string $eventName
*
* @return array<int, EventSubscriberInterface[]>
*/
public function getListeners($eventName)
{
if (\array_key_exists($eventName, $this->listeners)) {
return $this->listeners[$eventName]; // @phpstan-ignore-line
}
return array();
}
/**
* @param callable[] $listeners
* @param object $event
*
* @return void
*/
private function callListeners(array $listeners, $event)
{
foreach ($listeners as $listener) {
if ($event instanceof StoppableEventInterface && $event->isPropagationStopped()) {
break;
}
\call_user_func($listener, $event);
}
}
}

View File

@ -0,0 +1,33 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher;
use Flasher\Prime\EventDispatcher\EventListener\EventSubscriberInterface;
interface EventDispatcherInterface
{
/**
* @param object $event
*
* @return object
*/
public function dispatch($event);
/**
* @param string $eventName
* @param callable $listener
*
* @return void
*/
public function addListener($eventName, $listener);
/**
* @return void
*/
public function addSubscriber(EventSubscriberInterface $subscriber);
}

View File

@ -0,0 +1,58 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher\EventListener;
use Flasher\Prime\EventDispatcher\Event\PersistEvent;
use Flasher\Prime\Notification\Envelope;
use Flasher\Prime\Stamp\UnlessStamp;
use Flasher\Prime\Stamp\WhenStamp;
final class AddToStorageListener implements EventSubscriberInterface
{
/**
* @return void
*/
public function __invoke(PersistEvent $event)
{
$envelopesToKeep = array();
foreach ($event->getEnvelopes() as $envelope) {
if ($this->shouldKeep($envelope)) {
$envelopesToKeep[] = $envelope;
}
}
$event->setEnvelopes($envelopesToKeep);
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return 'Flasher\Prime\EventDispatcher\Event\PersistEvent';
}
/**
* @return bool
*/
private function shouldKeep(Envelope $envelope)
{
$stamp = $envelope->get('Flasher\Prime\Stamp\WhenStamp');
if ($stamp instanceof WhenStamp && false === $stamp->getCondition()) {
return false;
}
$stamp = $envelope->get('Flasher\Prime\Stamp\UnlessStamp');
if ($stamp instanceof UnlessStamp && true === $stamp->getCondition()) {
return false;
}
return true;
}
}

View File

@ -0,0 +1,16 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher\EventListener;
interface EventSubscriberInterface
{
/**
* @return string|string[]
*/
public static function getSubscribedEvents();
}

View File

@ -0,0 +1,97 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher\EventListener;
use Flasher\Prime\EventDispatcher\Event\PersistEvent;
use Flasher\Prime\Exception\PresetNotFoundException;
use Flasher\Prime\Notification\Envelope;
use Flasher\Prime\Stamp\PresetStamp;
/**
* @phpstan-type PresetType array<string, array{
* type: string,
* title: string,
* message: string,
* options: array<string, mixed>,
* }>
*/
final class PresetListener implements EventSubscriberInterface
{
/**
* @phpstan-var PresetType
*/
private $presets = array();
/**
* @phpstan-param PresetType $presets
*/
public function __construct(array $presets)
{
$this->presets = $presets;
}
/**
* @return void
*
* @throws PresetNotFoundException
*/
public function __invoke(PersistEvent $event)
{
foreach ($event->getEnvelopes() as $envelope) {
$this->attachPresets($envelope);
}
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return 'Flasher\Prime\EventDispatcher\Event\PersistEvent';
}
/**
* @return void
*
* @throws PresetNotFoundException
*/
private function attachPresets(Envelope $envelope)
{
$presetStamp = $envelope->get('Flasher\Prime\Stamp\PresetStamp');
if (!$presetStamp instanceof PresetStamp) {
return;
}
if (!isset($this->presets[$presetStamp->getPreset()])) {
throw new PresetNotFoundException($presetStamp->getPreset(), array_keys($this->presets));
}
$preset = $this->presets[$presetStamp->getPreset()];
$preset = array_merge(array(
'type' => 'info',
'title' => null,
'message' => null,
'options' => array(),
), $preset);
if (null === $envelope->getType()) {
$envelope->setType($preset['type']);
}
if (null === $envelope->getTitle()) {
$envelope->setTitle($preset['title']);
}
if (null === $envelope->getMessage()) {
$envelope->setMessage($preset['message']);
}
$options = array_merge($preset['options'], $envelope->getOptions());
$envelope->setOptions($options);
}
}

View File

@ -0,0 +1,46 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher\EventListener;
use Flasher\Prime\EventDispatcher\Event\RemoveEvent;
use Flasher\Prime\Stamp\HopsStamp;
final class RemoveListener implements EventSubscriberInterface
{
/**
* @return void
*/
public function __invoke(RemoveEvent $event)
{
$envelopesToKeep = $event->getEnvelopesToKeep();
$envelopesToRemove = array();
foreach ($event->getEnvelopesToRemove() as $envelope) {
$hopsStamp = $envelope->get('Flasher\Prime\Stamp\HopsStamp');
if (!$hopsStamp instanceof HopsStamp || 1 === $hopsStamp->getAmount()) {
$envelopesToRemove[] = $envelope;
continue;
}
$envelope->with(new HopsStamp($hopsStamp->getAmount() - 1));
$envelopesToKeep[] = $envelope;
}
$event->setEnvelopesToKeep($envelopesToKeep);
$event->setEnvelopesToRemove($envelopesToRemove);
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return 'Flasher\Prime\EventDispatcher\Event\RemoveEvent';
}
}

View File

@ -0,0 +1,69 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher\EventListener;
use Flasher\Prime\EventDispatcher\Event\PersistEvent;
use Flasher\Prime\EventDispatcher\Event\UpdateEvent;
use Flasher\Prime\Notification\Envelope;
use Flasher\Prime\Stamp\CreatedAtStamp;
use Flasher\Prime\Stamp\DelayStamp;
use Flasher\Prime\Stamp\HopsStamp;
use Flasher\Prime\Stamp\PriorityStamp;
use Flasher\Prime\Stamp\UuidStamp;
final class StampsListener implements EventSubscriberInterface
{
/**
* @param PersistEvent|UpdateEvent $event
*
* @return void
*/
public function __invoke($event)
{
foreach ($event->getEnvelopes() as $envelope) {
$this->attachStamps($envelope);
}
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return array(
'Flasher\Prime\EventDispatcher\Event\PersistEvent',
'Flasher\Prime\EventDispatcher\Event\UpdateEvent',
);
}
/**
* @return void
*/
private function attachStamps(Envelope $envelope)
{
if (null === $envelope->get('Flasher\Prime\Stamp\CreatedAtStamp')) {
$envelope->withStamp(new CreatedAtStamp());
}
if (null === $envelope->get('Flasher\Prime\Stamp\UuidStamp')) {
$envelope->withStamp(new UuidStamp(spl_object_hash($envelope)));
}
if (null === $envelope->get('Flasher\Prime\Stamp\DelayStamp')) {
$envelope->withStamp(new DelayStamp(0));
}
if (null === $envelope->get('Flasher\Prime\Stamp\HopsStamp')) {
$envelope->withStamp(new HopsStamp(1));
}
if (null === $envelope->get('Flasher\Prime\Stamp\PriorityStamp')) {
$envelope->withStamp(new PriorityStamp(0));
}
}
}

View File

@ -0,0 +1,89 @@
<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Prime\EventDispatcher\EventListener;
use Flasher\Prime\EventDispatcher\Event\PresentationEvent;
use Flasher\Prime\Stamp\PresetStamp;
use Flasher\Prime\Stamp\TranslationStamp;
use Flasher\Prime\Translation\EchoTranslator;
use Flasher\Prime\Translation\Language;
use Flasher\Prime\Translation\TranslatorInterface;
final class TranslationListener implements EventSubscriberInterface
{
/**
* @var TranslatorInterface
*/
private $translator;
/**
* @var bool
*/
private $autoTranslate;
/**
* @param bool $autoTranslate
*/
public function __construct(TranslatorInterface $translator = null, $autoTranslate = true)
{
$this->translator = $translator ?: new EchoTranslator();
$this->autoTranslate = $autoTranslate;
}
/**
* @return void
*/
public function __invoke(PresentationEvent $event)
{
foreach ($event->getEnvelopes() as $envelope) {
$stamp = $envelope->get('Flasher\Prime\Stamp\TranslationStamp');
if (!$stamp instanceof TranslationStamp && !$this->autoTranslate) {
continue;
}
$locale = $stamp instanceof TranslationStamp && $stamp->getLocale()
? $stamp->getLocale()
: $this->translator->getLocale();
$parameters = $stamp instanceof TranslationStamp && $stamp->getParameters()
? $stamp->getParameters()
: array();
$preset = $envelope->get('Flasher\Prime\Stamp\PresetStamp');
if ($preset instanceof PresetStamp) {
foreach ($preset->getParameters() as $key => $value) {
$parameters[$key] = $this->translator->translate($value, $parameters, $locale); // @phpstan-ignore-line
}
}
$title = $envelope->getTitle() ?: $envelope->getType();
if (null !== $title) {
$title = $this->translator->translate($title, $parameters, $locale);
$envelope->setTitle($title);
}
$message = $envelope->getMessage();
if (null !== $message) {
$message = $this->translator->translate($message, $parameters, $locale);
$envelope->setMessage($message);
}
if (Language::isRTL($locale)) {
$envelope->setOption('rtl', true);
}
}
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return 'Flasher\Prime\EventDispatcher\Event\PresentationEvent';
}
}