From 75e4f5f80861b2a38393aa17fb84971c2d9eb7cc Mon Sep 17 00:00:00 2001 From: Dave Smith-Hayes Date: Wed, 16 Apr 2025 22:04:24 -0400 Subject: [PATCH] Add FactoryInterface and work on factory classes for entities. --- app/src/Domain/Entity/Channel.php | 2 + app/src/Domain/Entity/User.php | 8 ---- app/src/Domain/Factory/ChannelFactory.php | 41 ++++++++++++++++ app/src/Domain/Factory/UserFactory.php | 47 +++++++++++++++++++ app/src/Domain/FactoryInterface.php | 21 +++++++++ app/src/Domain/Record.php | 16 +++++-- .../User/RegisterUserActionTest.php | 3 +- app/tests/TestCase.php | 3 +- 8 files changed, 127 insertions(+), 14 deletions(-) create mode 100644 app/src/Domain/Factory/ChannelFactory.php create mode 100644 app/src/Domain/Factory/UserFactory.php create mode 100644 app/src/Domain/FactoryInterface.php diff --git a/app/src/Domain/Entity/Channel.php b/app/src/Domain/Entity/Channel.php index ca35e1e..1a61b4e 100644 --- a/app/src/Domain/Entity/Channel.php +++ b/app/src/Domain/Entity/Channel.php @@ -3,10 +3,12 @@ namespace Slovocast\Domain\Entity; use Slovocast\Domain\Entity; +use Slovocast\Domain\Record; class Channel { use Entity; + use Record; public function __construct( private string $name, diff --git a/app/src/Domain/Entity/User.php b/app/src/Domain/Entity/User.php index cc59df4..6527741 100644 --- a/app/src/Domain/Entity/User.php +++ b/app/src/Domain/Entity/User.php @@ -64,18 +64,10 @@ class User } if (isset($props['createdAt'])) { - if (is_string($props['createdAt'])) { - $props['createdAt'] = new DateTimeImmutable($props['createdAt']); - } - $user->setCreatedAt($props['createdAt']); } if (isset($props['updatedAt'])) { - if (is_string($props['updatedAt'])) { - $props['updatedAt'] = new DateTime($props['updatedAt']); - } - $user->setUpdatedAt($props['updatedAt']); } diff --git a/app/src/Domain/Factory/ChannelFactory.php b/app/src/Domain/Factory/ChannelFactory.php new file mode 100644 index 0000000..bea1398 --- /dev/null +++ b/app/src/Domain/Factory/ChannelFactory.php @@ -0,0 +1,41 @@ +setId($props['id']); + } + + if (isset($props['createdAt'])) { + $channel->setCreatedAt($props['createdAt']); + } + + if (isset($props['updatedAt'])) { + $channel->setUpdatedAt($props['updatedAt']); + } + + return $channel; + } + + public static function toArray(Channel $channel): array + { + return []; + } +} diff --git a/app/src/Domain/Factory/UserFactory.php b/app/src/Domain/Factory/UserFactory.php new file mode 100644 index 0000000..bcdfd40 --- /dev/null +++ b/app/src/Domain/Factory/UserFactory.php @@ -0,0 +1,47 @@ +setId($props['id']); + } + + if (isset($props['createdAt'])) { + if (is_string($props['createdAt'])) { + $props['createdAt'] = new DateTimeImmutable($props['createdAt']); + } + + $user->setCreatedAt($props['createdAt']); + } + + if (isset($props['updatedAt'])) { + if (is_string($props['updatedAt'])) { + $props['updatedAt'] = new DateTime($props['updatedAt']); + } + + $user->setUpdatedAt($props['updatedAt']); + } + + return $user; + } + + public static function toArray(User $user): array + { + return [ + 'name' => $user->getName(), + 'email' => $user->getEmail(), + 'id' => $user->getId() ?? null, + ]; + } +} diff --git a/app/src/Domain/FactoryInterface.php b/app/src/Domain/FactoryInterface.php new file mode 100644 index 0000000..540c233 --- /dev/null +++ b/app/src/Domain/FactoryInterface.php @@ -0,0 +1,21 @@ +createdAt = $createdAt; + if (is_string($createdAt)) { + $this->createdAt = new DateTimeImmutable($createdAt); + } else { + $this->createdAt = $createdAt; + } } public function getCreatedAt(): DateTimeImmutable @@ -20,9 +24,13 @@ trait Record return $this->createdAt; } - public function setUpdatedAt(DateTime $updatedAt): void + public function setUpdatedAt(DateTime|string $updatedAt): void { - $this->updatedAt = $updatedAt; + if (is_string($updatedAt)) { + $this->updatedAt = new DateTime($updatedAt); + } else { + $this->updatedAt = $updatedAt; + } } public function getUpdatedAt(): DateTime diff --git a/app/tests/Controller/User/RegisterUserActionTest.php b/app/tests/Controller/User/RegisterUserActionTest.php index cc928cd..fcf2269 100644 --- a/app/tests/Controller/User/RegisterUserActionTest.php +++ b/app/tests/Controller/User/RegisterUserActionTest.php @@ -2,6 +2,7 @@ namespace Slovocast\Tests\Controller\User; +use Slovocast\Domain\Factory\UserFactory; use Slovocast\Tests\TestCase; use Slovocast\Domain\Repository\User\UserRepositoryInterface; use Slovocast\Domain\Entity\User; @@ -12,7 +13,7 @@ class RegisterUserActionTest extends TestCase { protected function getUser(): User { - return User::fromArray([ + return UserFactory::fromArray([ 'email' => 'dave@slovocast.com', 'name' => 'Dave SH', 'password' => 'hashed_password' diff --git a/app/tests/TestCase.php b/app/tests/TestCase.php index 69f1a85..0d1bd28 100644 --- a/app/tests/TestCase.php +++ b/app/tests/TestCase.php @@ -12,6 +12,7 @@ use Slim\Psr7\Request as SlimRequest; use Slim\Psr7\Uri; use Slovocast\Bootstrap; use Slovocast\Domain\Entity\User; +use Slovocast\Domain\Factory\UserFactory; /** * This is the common test harness pattern lifted right out of the official @@ -78,6 +79,6 @@ class TestCase extends PHPUnit_TestCase ]; } - return User::fromArray($user); + return UserFactory::fromArray($user); } }