diff --git a/src/Api/AuthenticatedApi.php b/src/Api/AuthenticatedApi.php index 28c2955..ad9c919 100644 --- a/src/Api/AuthenticatedApi.php +++ b/src/Api/AuthenticatedApi.php @@ -17,7 +17,12 @@ */ final class AuthenticatedApi extends AbstractApi { - use LazyGhostTrait; + use LazyGhostTrait { + createLazyGhost as private; + initializeLazyObject as private; + isLazyObjectInitialized as private; + resetLazyObject as private; + } public Customer $customer; @@ -49,9 +54,9 @@ private function populateLazyProperties(): void public function transactions(?string $accountNumber = null): TransactionBuilder { - return new TransactionBuilder( - ['accountNumber' => $accountNumber ?? $this->customer->accountNumber], + return TransactionBuilder::from( $this->getTransactions(...), + ['accountNumber' => $accountNumber ?? $this->customer->accountNumber], ); } diff --git a/src/Builder/TransactionBuilder.php b/src/Builder/TransactionBuilder.php index 21e6b82..8dffe08 100644 --- a/src/Builder/TransactionBuilder.php +++ b/src/Builder/TransactionBuilder.php @@ -8,20 +8,36 @@ /** * @psalm-import-type ParametersType from BodyBuilder * + * @psalm-type GetterType = \Closure(ParametersType):\Traversable + * * @implements \IteratorAggregate */ final class TransactionBuilder implements \IteratorAggregate { /** - * @param ParametersType $parameters - * @param \Closure(ParametersType):\Traversable $getter + * @param GetterType $getter + * @param ParametersType $parameters */ - public function __construct( - private array $parameters, + private function __construct( private \Closure $getter, + private array $parameters, ) { } + /** + * @param GetterType $getter + * @param ParametersType $parameters + */ + public static function from( + \Closure $getter, + array $parameters, + ): self { + return new self( + $getter, + $parameters, + ); + } + public function between( \DateTimeInterface $from, \DateTimeInterface $to, diff --git a/src/Entity/Account.php b/src/Entity/Account.php index a2153a3..0c4676a 100644 --- a/src/Entity/Account.php +++ b/src/Entity/Account.php @@ -2,22 +2,50 @@ namespace IPay\Entity; +use EventSauce\ObjectHydrator\Constructor; + readonly class AccountState { - public function __construct( + private function __construct( public int $availableBalance, public int $balance, ) { } + + #[Constructor] + public static function create( + int $availableBalance, + int $balance, + ): self { + return new self( + $availableBalance, + $balance, + ); + } } readonly class Account { - public function __construct( + private function __construct( public string $title, public string $number, public string $currencyCode, public AccountState $accountState, ) { } + + #[Constructor] + public static function create( + string $title, + string $number, + string $currencyCode, + AccountState $accountState, + ): self { + return new self( + $title, + $number, + $currencyCode, + $accountState, + ); + } } diff --git a/src/Entity/Customer.php b/src/Entity/Customer.php index 52ef8dd..9d256fd 100644 --- a/src/Entity/Customer.php +++ b/src/Entity/Customer.php @@ -2,21 +2,30 @@ namespace IPay\Entity; -use EventSauce\ObjectHydrator\MapFrom; +use EventSauce\ObjectHydrator\Constructor; -#[MapFrom([ - 'fullname' => 'name', - 'phone' => 'phone', - 'jobTitle' => 'job', - 'feeAcctNo' => 'accountNumber', -])] readonly class Customer { - public function __construct( + private function __construct( public string $name, public string $phone, public string $job, public string $accountNumber, ) { } + + #[Constructor] + public static function create( + string $fullname, + string $phone, + string $jobTitle, + string $feeAcctNo, + ): self { + return new self( + $fullname, + $phone, + $jobTitle, + $feeAcctNo, + ); + } } diff --git a/src/Entity/Transaction.php b/src/Entity/Transaction.php index 4e9d0d5..1620aee 100644 --- a/src/Entity/Transaction.php +++ b/src/Entity/Transaction.php @@ -2,20 +2,40 @@ namespace IPay\Entity; +use EventSauce\ObjectHydrator\Constructor; use EventSauce\ObjectHydrator\PropertyCasters\CastToDateTimeImmutable; use EventSauce\ObjectHydrator\PropertyCasters\CastToType; readonly class Transaction { - public function __construct( + private function __construct( public string $currency, - #[CastToType('integer')] public int $amount, public string $remark, public string $corresponsiveAccount, public string $corresponsiveName, - #[CastToDateTimeImmutable('d-m-Y H:i:s')] public \DateTimeImmutable $processDate, ) { } + + #[Constructor] + public static function create( + string $currency, + #[CastToType('integer')] + int $amount, + string $remark, + string $corresponsiveAccount, + string $corresponsiveName, + #[CastToDateTimeImmutable('d-m-Y H:i:s')] + \DateTimeImmutable $processDate, + ): self { + return new self( + $currency, + $amount, + $remark, + $corresponsiveAccount, + $corresponsiveName, + $processDate, + ); + } }