feat: 增强玩家 API,新增 locale 和时间字段,更新钱包 API 以支持可用余额计算,添加错误码与多语言支持

This commit is contained in:
2026-05-09 15:05:46 +08:00
parent f1b38ef421
commit a0f86a4e36
36 changed files with 2523 additions and 34 deletions

View File

@@ -0,0 +1,77 @@
<?php
namespace App\Http\Controllers\Api\V1\Wallet;
use App\Exceptions\WalletOperationException;
use App\Http\Controllers\Controller;
use App\Http\Requests\Wallet\WalletTransferRequest;
use App\Lottery\ErrorCode;
use App\Models\Player;
use App\Services\Wallet\LotteryTransferService;
use App\Support\ApiResponse;
use App\Support\LotteryMessage;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* 转入:主站扣款 彩票钱包加款。
*
* `POST /api/v1/wallet/transfer-in` body JSON`amount`(最小货币单位整数), `idempotent_key`, `currency`(可选)
*/
class WalletTransferInController extends Controller
{
public function __construct(
private readonly LotteryTransferService $transferService,
) {}
public function __invoke(WalletTransferRequest $request): JsonResponse
{
$player = $request->lotteryPlayer();
abort_if($player === null, 500, 'lottery_player missing');
$currency = $this->resolveCurrencyCode($request, $player);
if ($currency instanceof JsonResponse) {
return $currency;
}
try {
$data = $this->transferService->transferIn(
$player,
$currency,
(int) $request->validated('amount'),
(string) $request->validated('idempotent_key'),
);
} catch (WalletOperationException $e) {
return ApiResponse::error(
LotteryMessage::wallet($request, $e->lotteryCode),
$e->lotteryCode,
null,
$e->httpStatus,
);
}
return ApiResponse::success($data);
}
private function resolveCurrencyCode(Request $request, Player $player): string|JsonResponse
{
$raw = $request->input('currency');
if (is_string($raw) && $raw !== '') {
$code = strtoupper(substr(trim($raw), 0, 16));
} else {
$fallback = $player->default_currency ?? config('lottery.default_currency', 'NPR');
$code = strtoupper(substr(trim((string) $fallback), 0, 16));
}
if (! preg_match('/^[A-Z0-9]{1,16}$/', $code)) {
return ApiResponse::error(
__('wallet.invalid_currency'),
ErrorCode::WalletInvalidCurrency->value,
null,
400,
);
}
return $code;
}
}