From f508ee3e3d0d07a8c5999e235af5f2c7920fbceb Mon Sep 17 00:00:00 2001 From: Eloi Poch Date: Mon, 2 Mar 2015 09:45:48 +0100 Subject: [PATCH] publish account balance changed event --- .../Service/TransactionProcessor.php | 23 ++++++++++++++++++- .../DomainEvent/AccountBalanceChanged.php | 22 ++++++++++++++++++ src/MPWAR/Module/Economy/Domain/Account.php | 5 ++++ .../Module/Economy/Domain/VirtualMoney.php | 10 ++++++++ .../DependencyInjection/economy_services.yml | 1 + 5 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/MPWAR/Module/Economy/Contract/DomainEvent/AccountBalanceChanged.php diff --git a/src/MPWAR/Module/Economy/Application/Service/TransactionProcessor.php b/src/MPWAR/Module/Economy/Application/Service/TransactionProcessor.php index 18212cd..01ad981 100644 --- a/src/MPWAR/Module/Economy/Application/Service/TransactionProcessor.php +++ b/src/MPWAR/Module/Economy/Application/Service/TransactionProcessor.php @@ -2,17 +2,23 @@ namespace MPWAR\Module\Economy\Application\Service; +use iter; +use MPWAR\Module\Economy\Domain\Account; use MPWAR\Module\Economy\Domain\AccountOwner; use MPWAR\Module\Economy\Domain\AccountRepository; use MPWAR\Module\Economy\Domain\VirtualMoney; +use SimpleBus\Message\Bus\MessageBus; +use SimpleBus\Message\Type\Event; final class TransactionProcessor { private $repository; + private $eventBus; - public function __construct(AccountRepository $repository) + public function __construct(AccountRepository $repository, MessageBus $eventBus) { $this->repository = $repository; + $this->eventBus = $eventBus; } public function __invoke(AccountOwner $owner, VirtualMoney $money) @@ -22,5 +28,20 @@ public function __invoke(AccountOwner $owner, VirtualMoney $money) $account->add($money); $this->repository->save($account); + + $this->publishDomainEvents($account); + } + + private function publishDomainEvents(Account $account) + { + iter\apply($this->handleEvent(), $account->recordedMessages()); + $account->eraseMessages(); + } + + private function handleEvent() + { + return function (Event $event) { + $this->eventBus->handle($event); + }; } } diff --git a/src/MPWAR/Module/Economy/Contract/DomainEvent/AccountBalanceChanged.php b/src/MPWAR/Module/Economy/Contract/DomainEvent/AccountBalanceChanged.php new file mode 100644 index 0000000..d4a63ff --- /dev/null +++ b/src/MPWAR/Module/Economy/Contract/DomainEvent/AccountBalanceChanged.php @@ -0,0 +1,22 @@ +aggregateId = $aggregateId; + $this->occurredOn = new DateTimeImmutable(); + $this->amount = $amount; + $this->currency = $currency; + } +} diff --git a/src/MPWAR/Module/Economy/Domain/Account.php b/src/MPWAR/Module/Economy/Domain/Account.php index 3e617d2..8268eaf 100644 --- a/src/MPWAR/Module/Economy/Domain/Account.php +++ b/src/MPWAR/Module/Economy/Domain/Account.php @@ -3,6 +3,7 @@ namespace MPWAR\Module\Economy\Domain; use DateTimeImmutable; +use MPWAR\Module\Economy\Contract\DomainEvent\AccountBalanceChanged; use MPWAR\Module\Economy\Contract\DomainEvent\AccountOpened; use SimpleBus\Message\Recorder\PrivateMessageRecorderCapabilities; use SimpleBus\Message\Recorder\RecordsMessages; @@ -42,5 +43,9 @@ public function balance() public function add(VirtualMoney $money) { $this->balance = $this->balance()->add($money); + + $this->record( + new AccountBalanceChanged($this->owner()->value(), $money->amount(), $money->currency()->value()) + ); } } diff --git a/src/MPWAR/Module/Economy/Domain/VirtualMoney.php b/src/MPWAR/Module/Economy/Domain/VirtualMoney.php index b640a36..477f2c9 100644 --- a/src/MPWAR/Module/Economy/Domain/VirtualMoney.php +++ b/src/MPWAR/Module/Economy/Domain/VirtualMoney.php @@ -30,6 +30,16 @@ public function add(VirtualMoney $other) return new self($this->amount + $other->amount, $this->currency); } + public function amount() + { + return $this->amount; + } + + public function currency() + { + return $this->currency; + } + private function guard($amount) { if (!is_int($amount) || 0 > $amount) { diff --git a/src/MPWAR/Module/Economy/Infrastructure/DependencyInjection/economy_services.yml b/src/MPWAR/Module/Economy/Infrastructure/DependencyInjection/economy_services.yml index 1b38959..9640497 100644 --- a/src/MPWAR/Module/Economy/Infrastructure/DependencyInjection/economy_services.yml +++ b/src/MPWAR/Module/Economy/Infrastructure/DependencyInjection/economy_services.yml @@ -30,4 +30,5 @@ services: class: MPWAR\Module\Economy\Application\Service\TransactionProcessor arguments: - @mpwar.economy.infrastructure.account_repository + - @event_bus public: false