From c9938409fd4a9a14a03d4585f74310b8bbe3a46e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Kucha=C5=99?= <honza.kuchar@grifart.cz>
Date: Thu, 25 Feb 2016 15:19:19 +0100
Subject: [PATCH] Migrated to PHP7 types

---
 app/AggregateHistory.php                   |  8 +++-----
 app/AggregatePersister.php                 | 14 ++++++++++++++
 app/RecordsEvents.php                      |  2 +-
 app/aggreagates/AbstractAggregate.php      |  8 +++++---
 app/aggreagates/Basket.php                 | 11 ++++++-----
 app/events/BasketWasPickedUp.php           |  9 ++++-----
 app/events/DomainEvent.php                 |  5 +++--
 app/events/ProductWasAddedToBasket.php     | 16 ++++++----------
 app/events/ProductWasRemovedFromBasket.php | 14 +++++---------
 app/ids.php                                |  7 +++++--
 tests/BasketTest.phpt                      |  2 +-
 11 files changed, 53 insertions(+), 43 deletions(-)
 create mode 100644 app/AggregatePersister.php

diff --git a/app/AggregateHistory.php b/app/AggregateHistory.php
index d471239..b34b1fa 100644
--- a/app/AggregateHistory.php
+++ b/app/AggregateHistory.php
@@ -1,4 +1,5 @@
 <?php
+use Ramsey\Uuid\UuidInterface;
 
 /**
  * Collection of domain events
@@ -7,7 +8,7 @@ class AggregateHistory extends ArrayObject {
 
 	private $aggregateId;
 
-	public function __construct($aggregateId, DomainEvents $domainEvents)
+	public function __construct(UuidInterface $aggregateId, DomainEvents $domainEvents)
 	{
 		$this->aggregateId = $aggregateId;
 
@@ -17,10 +18,7 @@ class AggregateHistory extends ArrayObject {
 		parent::__construct((array) $domainEvents);
 	}
 
-	/**
-	 * @return array|null|object
-	 */
-	public function getAggregateId()
+	public function getAggregateId(): UuidInterface
 	{
 		return $this->aggregateId;
 	}
diff --git a/app/AggregatePersister.php b/app/AggregatePersister.php
new file mode 100644
index 0000000..4b68e95
--- /dev/null
+++ b/app/AggregatePersister.php
@@ -0,0 +1,14 @@
+<?php
+
+use Ramsey\Uuid\UuidInterface;
+
+class AggregatePersister
+{
+	public function save(string $aggregateRoot, AbstractAggregate $aggregate) : void {
+		
+	}
+
+	public function load(string $aggregateRoot, UuidInterface $id): AbstractAggregate {
+
+	}
+}
\ No newline at end of file
diff --git a/app/RecordsEvents.php b/app/RecordsEvents.php
index e0e7361..c1c3458 100644
--- a/app/RecordsEvents.php
+++ b/app/RecordsEvents.php
@@ -2,7 +2,7 @@
 
 interface RecordsEvents
 {
-	public function getRecordedEvents();
+	public function getRecordedEvents(): DomainEvents;
 
 	public function clearRecordedEvents();
 }
\ No newline at end of file
diff --git a/app/aggreagates/AbstractAggregate.php b/app/aggreagates/AbstractAggregate.php
index ea6c001..b0a8f83 100644
--- a/app/aggreagates/AbstractAggregate.php
+++ b/app/aggreagates/AbstractAggregate.php
@@ -7,7 +7,7 @@ abstract class AbstractAggregate
 	 * @param \DomainEvent $domainEvent
 	 * @return string
 	 */
-	private function getApplyMethodForDomainEvent(DomainEvent $domainEvent)
+	private function getApplyMethodForDomainEvent(DomainEvent $domainEvent): string
 	{
 		return "apply" . get_class($domainEvent);
 	}
@@ -17,7 +17,8 @@ abstract class AbstractAggregate
 	 * @param \DomainEvent $domainEvent
 	 * @internal
 	 */
-	public function applyIfAccepts(DomainEvent $domainEvent) {
+	public function applyIfAccepts(DomainEvent $domainEvent)
+	{
 		if(method_exists($this, $this->getApplyMethodForDomainEvent($domainEvent))) {
 			$this->apply($domainEvent);
 		}
@@ -27,7 +28,8 @@ abstract class AbstractAggregate
 	 * Apply domain event; if objects does not accepts this event -> fail
 	 * @param \DomainEvent $domainEvent
 	 */
-	public function apply(DomainEvent $domainEvent) {
+	public function apply(DomainEvent $domainEvent)
+	{
 		$method = $this->getApplyMethodForDomainEvent($domainEvent);
 		$this->$method($domainEvent);
 	}
diff --git a/app/aggreagates/Basket.php b/app/aggreagates/Basket.php
index 8d1a7eb..6a9706d 100644
--- a/app/aggreagates/Basket.php
+++ b/app/aggreagates/Basket.php
@@ -22,17 +22,17 @@ final class Basket extends AbstractAggregate implements RecordsEvents
 	 * @param \BasketId $basketId
 	 * @return \Basket
 	 */
-	public static function pickUp(BasketId $basketId)
+	public static function pickUp(BasketId $basketId): self
 	{
 		$basket = new Basket($basketId);
 		$basket->recordThat(new BasketWasPickedUp($basketId));
 		return $basket;
 	}
 
-	public static function reconstituteFrom(AggregateHistory $aggregateHistory)
+	public static function reconstituteFrom(AggregateHistory $aggregateHistory): self
 	{
 		$basketId = $aggregateHistory->getAggregateId();
-		$basket = new static($basketId);
+		$basket = new static(new BasketId($basketId));
 
 		foreach($aggregateHistory as $event) {
 			$basket->apply($event);
@@ -106,14 +106,15 @@ final class Basket extends AbstractAggregate implements RecordsEvents
 		}
 	}
 
-	private function isProductInBasket(ProductId $productId) {
+	private function isProductInBasket(ProductId $productId): bool
+	{
 		return isset($this->itemsCountById[(string) $productId]) && ($this->itemsCountById[(string) $productId] > 0);
 	}
 
 	// -------- implementation of RecordsEvents ------------------
 	private $recordedEvents = [];
 
-	public function getRecordedEvents()
+	public function getRecordedEvents(): DomainEvents
 	{
 		return new DomainEvents($this->recordedEvents);
 	}
diff --git a/app/events/BasketWasPickedUp.php b/app/events/BasketWasPickedUp.php
index 3e6d4f7..71d8ce3 100644
--- a/app/events/BasketWasPickedUp.php
+++ b/app/events/BasketWasPickedUp.php
@@ -1,5 +1,7 @@
 <?php
 
+use Ramsey\Uuid\UuidInterface;
+
 class BasketWasPickedUp implements DomainEvent
 {
 	private $basketId;
@@ -13,11 +15,8 @@ class BasketWasPickedUp implements DomainEvent
 		$this->basketId = $basketId;
 	}
 
-	/**
-	 * @return \BasketId
-	 */
-	public function getAggregateId()
+	public function getAggregateId(): UuidInterface
 	{
-		return $this->basketId;
+		return $this->basketId->getId();
 	}
 }
\ No newline at end of file
diff --git a/app/events/DomainEvent.php b/app/events/DomainEvent.php
index 32bd64e..8843617 100644
--- a/app/events/DomainEvent.php
+++ b/app/events/DomainEvent.php
@@ -1,12 +1,13 @@
 <?php
 
+use Ramsey\Uuid\UuidInterface;
+
 interface DomainEvent
 {
 
 	/**
 	 * Aggregate instance identifier (must be unique per aggregate)
-	 * @return \Ramsey\Uuid\Uuid
 	 */
-	public function getAggregateId();
+	public function getAggregateId(): UuidInterface;
 
 }
\ No newline at end of file
diff --git a/app/events/ProductWasAddedToBasket.php b/app/events/ProductWasAddedToBasket.php
index d2a327c..ce07c86 100644
--- a/app/events/ProductWasAddedToBasket.php
+++ b/app/events/ProductWasAddedToBasket.php
@@ -1,5 +1,7 @@
 <?php
 
+use Ramsey\Uuid\UuidInterface;
+
 class ProductWasAddedToBasket implements DomainEvent
 {
 	private $basketId;
@@ -19,23 +21,17 @@ class ProductWasAddedToBasket implements DomainEvent
 		$this->productName = $productName;
 	}
 
-	public function getAggregateId()
+	public function getAggregateId(): UuidInterface
 	{
-		return $this->basketId;
+		return $this->basketId->getId();
 	}
 
-	/**
-	 * @return BasketId
-	 */
-	public function getProductId()
+	public function getProductId(): ProductId
 	{
 		return $this->productId;
 	}
 
-	/**
-	 * @return ProductId
-	 */
-	public function getProductName()
+	public function getProductName(): string
 	{
 		return $this->productName;
 	}
diff --git a/app/events/ProductWasRemovedFromBasket.php b/app/events/ProductWasRemovedFromBasket.php
index 4c47a3b..2a38bda 100644
--- a/app/events/ProductWasRemovedFromBasket.php
+++ b/app/events/ProductWasRemovedFromBasket.php
@@ -1,5 +1,7 @@
 <?php
 
+use Ramsey\Uuid\UuidInterface;
+
 class ProductWasRemovedFromBasket implements DomainEvent
 {
 	private $basketId;
@@ -16,18 +18,12 @@ class ProductWasRemovedFromBasket implements DomainEvent
 		$this->productId = $productId;
 	}
 
-	/**
-	 * @return BasketId
-	 */
-	public function getAggregateId()
+	public function getAggregateId(): UuidInterface
 	{
-		return $this->basketId;
+		return $this->basketId->getId();
 	}
 
-	/**
-	 * @return ProductId
-	 */
-	public function getProductId()
+	public function getProductId(): ProductId
 	{
 		return $this->productId;
 	}
diff --git a/app/ids.php b/app/ids.php
index fba5901..f622910 100644
--- a/app/ids.php
+++ b/app/ids.php
@@ -1,5 +1,7 @@
 <?php
 
+use Ramsey\Uuid\UuidInterface;
+
 abstract class AbstractId {
 
 	private $uuid;
@@ -13,11 +15,12 @@ abstract class AbstractId {
 		$this->uuid = $uuid;
 	}
 
-	function getId() {
+	function getId(): UuidInterface
+	{
 		return $this->uuid;
 	}
 
-	function __toString()
+	function __toString(): string
 	{
 		return (string) $this->uuid;
 	}
diff --git a/tests/BasketTest.phpt b/tests/BasketTest.phpt
index da11dc3..4c1aea0 100644
--- a/tests/BasketTest.phpt
+++ b/tests/BasketTest.phpt
@@ -74,7 +74,7 @@ class BasketTest extends \Tester\TestCase {
 
 		// Act
 		$reconstitutedBasket = Basket::reconstituteFrom(
-			new AggregateHistory($basketId, $retrievedEvents = $events)
+			new AggregateHistory($basketId->getId(), $retrievedEvents = $events)
 		);
 
 		// Assert
-- 
GitLab