diff --git a/src/Application/Command/InitialAccountCmd.php b/src/Application/Command/InitialAccountCmd.php new file mode 100644 index 0000000..a4df7b6 --- /dev/null +++ b/src/Application/Command/InitialAccountCmd.php @@ -0,0 +1,40 @@ + + * Powered by PhpStorm + * Created on 2025/9/17 + */ +declare(strict_types=1); + +namespace Singularity\HDK\Pay\Application\Command; + +use Carbon\Carbon; +use Singularity\HDK\Pay\Domain\Account\Enum\PointType; + +final class InitialAccountCmd { + public array $pointsBalances; + + public function __construct( + public readonly string $uid, + ) {} + + public function addPointsBalance( + PointType $type, + float $basic, + float $bonus, + ?Carbon $expiredAt = null, + ?string $version = null, + ): array + { + return $this->pointsBalances[] = [ + 'type' => $type, + 'basic' => $basic, + 'bonus' => $bonus, + 'expired_at' => $expiredAt, + 'version' => $version, + ]; + } +} \ No newline at end of file diff --git a/src/Domain/Account/Repository/AccountRepoInterface.php b/src/Domain/Account/Repository/AccountRepoInterface.php index e3711ae..fd3cf70 100644 --- a/src/Domain/Account/Repository/AccountRepoInterface.php +++ b/src/Domain/Account/Repository/AccountRepoInterface.php @@ -11,13 +11,29 @@ declare(strict_types=1); namespace Singularity\HDK\Pay\Domain\Account\Repository; +use Singularity\HDK\Pay\Application\Command\InitialAccountCmd; use Singularity\HDK\Pay\Domain\Account\Aggregate\Account\AccountBalance; use Singularity\HDK\Pay\Domain\Account\Aggregate\Account\PointsBalance; use Singularity\HDK\Pay\Domain\Account\Enum\PointType; interface AccountRepoInterface { + /** + * @param string $uid + * @return AccountBalance + */ public function getAccount(string $uid): AccountBalance; + /** + * @param string $uid + * @param PointType $pointType + * @return PointsBalance + */ public function getPointBalance(string $uid, PointType $pointType): PointsBalance; + + /** + * @param InitialAccountCmd $cmd + * @return void + */ + public function initial(InitialAccountCmd $cmd): void; } \ No newline at end of file diff --git a/src/Infrastructure/Repository/AccountBalanceRepo.php b/src/Infrastructure/Repository/AccountBalanceRepo.php index ca6ccd8..8fff5b1 100644 --- a/src/Infrastructure/Repository/AccountBalanceRepo.php +++ b/src/Infrastructure/Repository/AccountBalanceRepo.php @@ -13,6 +13,7 @@ namespace Singularity\HDK\Pay\Infrastructure\Repository; use Carbon\Carbon; use Hyperf\Codec\Json; +use Singularity\HDK\Pay\Application\Command\InitialAccountCmd; use Singularity\HDK\Pay\Domain\Account\Aggregate\Account\AccountBalance; use Singularity\HDK\Pay\Domain\Account\Aggregate\Account\PointsBalance; use Singularity\HDK\Pay\Domain\Account\Enum\PointType; @@ -67,4 +68,17 @@ final class AccountBalanceRepo extends AbstractRepo implements AccountRepoInterf expiredAt: isset($result['expired_at']) ? new Carbon($result['expired_at']): null, ); } + + /** + * @inheritDoc + */ + public function initial(InitialAccountCmd $cmd): void + { + $uid = $cmd->uid; + + $this->requestService->requestPost( + url: "/rpc/v2/account/$uid/balance", + data: $cmd->pointsBalances + ); + } } \ No newline at end of file diff --git a/tests/Feature/Account/InitialAccountBalanceTest.php b/tests/Feature/Account/InitialAccountBalanceTest.php new file mode 100644 index 0000000..554af8e --- /dev/null +++ b/tests/Feature/Account/InitialAccountBalanceTest.php @@ -0,0 +1,53 @@ + + * Powered by PhpStorm + * Created on 2025/9/17 + */ + +use Carbon\Carbon; +use Singularity\HDK\Pay\Application\Command\InitialAccountCmd; +use Singularity\HDK\Pay\Domain\Account\Enum\PointType; + +use Singularity\HDK\Pay\Infrastructure\Repository\AccountBalanceRepo; + +use function Hyperf\Support\make; + +it('should initial account balance', function () { + $uid = uniqid('TDD'); + $data = [ + [ + 'type' => 'aligner', + 'basic' => 0, + 'bonus' => 40, + 'expired_at' => Carbon::now()->addYear()->toDateTimeString(), + 'version' => 'Trial', + ], + [ + 'type' => 'ema', + 'basic' => 0, + 'bonus' => 1, + 'expired_at' => Carbon::now()->addYear()->toDateTimeString(), + 'version' => 'trial', + ], + ]; + + $cmd = new InitialAccountCmd($uid); + foreach ($data as $point_balance) { + $cmd->addPointsBalance( + type: PointType::from($point_balance['type']), + basic: $point_balance['basic'] ?? 0, + bonus: $point_balance['bonus'] ?? 0, + expiredAt: isset($point_balance['expired_at']) ? new Carbon($point_balance['expired_at']) : null, + version: $point_balance['version'] ?? 0, + ); + } + + $repo = make(AccountBalanceRepo::class); + $repo->initial($cmd); + + expect(true)->toBeTrue(); +});