Files
hdk-pay/src/Infrastructure/Repository/AccountRepo.php
李东云 cae728b392 feat(账户): 添加邮箱管理功能并重构账户仓库
- 创建 Email 值对象用于封装邮箱信息
- 扩展 AccountRepoInterface 添加邮箱管理方法
- 重命名 AccountBalanceRepo 为 AccountRepo 并实现邮箱功能
- 更新相关测试用例和配置以适配新功能
2025-11-28 18:25:52 +08:00

109 lines
3.3 KiB
PHP

<?php
/**
* AccountRepo.php@Pay
*
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
* Powered by PhpStorm
* Created on 2025/8/17
*/
declare(strict_types=1);
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;
use Singularity\HDK\Pay\Domain\Account\Repository\AccountRepoInterface;
use Singularity\HDK\Pay\Domain\Account\ValueObject\Email;
final class AccountRepo extends AbstractRepo implements AccountRepoInterface
{
public function getAccount(string $uid): AccountBalance
{
$response = $this->requestService->requestGet(
url: "/rpc/v2/account/$uid/balance",
params: [
'type' => join(',', PointType::values()),
],
);
$content = $response->getBody()->getContents();
$result = Json::decode($content);
return new AccountBalance(
uid: $result['uid'],
pointsBalances: array_map(
callback: fn($pointBalance)
=> new PointsBalance(
type: PointType::from($pointBalance['name']),
total: $pointBalance['total'],
cost: $pointBalance['cost'],
amount: $pointBalance['amount'],
version: $pointBalance['version'],
expiredAt: isset($pointBalance['expired_at']) ? new Carbon($pointBalance['expired_at']) : null,
),
array: $result['point_balance'],
),
);
}
public function getPointBalance(string $uid, PointType $pointType): PointsBalance
{
$response = $this->requestService->requestGet(
url: "/rpc/v2/account/$uid/balance/$pointType->value",
);
$content = $response->getBody()->getContents();
$result = Json::decode($content);
return new PointsBalance(
type: PointType::from($result['name']),
total: $result['total'],
cost: $result['cost'],
amount: $result['amount'],
version: $result['version'],
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
);
}
public function getEmail(string $uid): Email
{
$response = $this->requestService->requestGet(
url: "/rpc/v2/account/$uid/inv-email"
);
$content = $response->getBody()->getContents();
$result = Json::decode($content);
return new Email($result['email']);
}
public function updateEmail(string $uid, Email $email): void
{
$this->requestService->requestPut(
url: "/rpc/v2/account/$uid/inv-email",
data: [
'email' => $email->getValue()
]
);
}
}