Initialer Laravel Commit für BetiX
This commit is contained in:
121
app/Http/Controllers/VaultController.php
Normal file
121
app/Http/Controllers/VaultController.php
Normal file
@@ -0,0 +1,121 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\WalletTransfer;
|
||||
use App\Services\WalletService;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
class VaultController extends Controller
|
||||
{
|
||||
public function __construct(private readonly WalletService $wallet)
|
||||
{
|
||||
}
|
||||
|
||||
private const SUPPORTED_CURRENCIES = ['BTX', 'BTC', 'ETH', 'SOL'];
|
||||
|
||||
/**
|
||||
* GET /api/wallet/vault — returns balances for all currencies
|
||||
*/
|
||||
public function show(Request $request)
|
||||
{
|
||||
$user = Auth::user();
|
||||
abort_unless($user, 403);
|
||||
|
||||
$perPage = min(100, max(1, (int) $request->query('per_page', 20)));
|
||||
$items = WalletTransfer::where('user_id', $user->id)
|
||||
->orderByDesc('id')
|
||||
->limit($perPage)
|
||||
->get(['id','type','amount','currency','created_at']);
|
||||
|
||||
$transfers = $items->map(fn($t) => [
|
||||
'id' => $t->id,
|
||||
'type' => $t->type,
|
||||
'amount' => (string) $t->amount,
|
||||
'currency' => $t->currency,
|
||||
'created_at' => $t->created_at?->toIso8601String(),
|
||||
]);
|
||||
|
||||
$map = $user->vault_balances ?? [];
|
||||
|
||||
return response()->json([
|
||||
'balance' => (string) ($user->balance ?? '0.0000'),
|
||||
'vault_balance' => (string) ($user->vault_balance ?? '0.0000'),
|
||||
'vault_balances' => array_merge(
|
||||
['BTX' => (string) ($user->vault_balance ?? '0.0000')],
|
||||
$map
|
||||
),
|
||||
'currency' => 'BTX',
|
||||
'transfers' => $transfers,
|
||||
'now' => now()->toIso8601String(),
|
||||
], 200);
|
||||
}
|
||||
|
||||
/**
|
||||
* POST /api/wallet/vault/deposit
|
||||
*/
|
||||
public function deposit(Request $request)
|
||||
{
|
||||
$user = Auth::user();
|
||||
abort_unless($user, 403);
|
||||
|
||||
$data = $request->validate([
|
||||
'amount' => ['required','string','regex:/^\d+(?:\.\d{1,4})?$/'],
|
||||
'pin' => ['required','string','regex:/^\d{4,8}$/'],
|
||||
'currency' => ['sometimes','string','in:' . implode(',', self::SUPPORTED_CURRENCIES)],
|
||||
'idempotency_key' => ['sometimes','nullable','string','max:64'],
|
||||
]);
|
||||
|
||||
$currency = strtoupper($data['currency'] ?? 'BTX');
|
||||
|
||||
if ($resp = $this->wallet->verifyVaultPin($user, (string) $data['pin'])) {
|
||||
return $resp;
|
||||
}
|
||||
|
||||
$out = $this->wallet->depositToVault($user, $data['amount'], $data['idempotency_key'] ?? null, $currency);
|
||||
|
||||
return response()->json([
|
||||
'data' => ['type' => 'deposit', 'amount' => $data['amount'], 'currency' => $currency],
|
||||
'balances' => [
|
||||
'balance' => $out['balance'],
|
||||
'vault_balance' => $out['vault_balance'],
|
||||
'vault_balances' => $out['vault_balances'],
|
||||
],
|
||||
], 201);
|
||||
}
|
||||
|
||||
/**
|
||||
* POST /api/wallet/vault/withdraw
|
||||
*/
|
||||
public function withdraw(Request $request)
|
||||
{
|
||||
$user = Auth::user();
|
||||
abort_unless($user, 403);
|
||||
|
||||
$data = $request->validate([
|
||||
'amount' => ['required','string','regex:/^\d+(?:\.\d{1,4})?$/'],
|
||||
'pin' => ['required','string','regex:/^\d{4,8}$/'],
|
||||
'currency' => ['sometimes','string','in:' . implode(',', self::SUPPORTED_CURRENCIES)],
|
||||
'idempotency_key' => ['sometimes','nullable','string','max:64'],
|
||||
]);
|
||||
|
||||
$currency = strtoupper($data['currency'] ?? 'BTX');
|
||||
|
||||
if ($resp = $this->wallet->verifyVaultPin($user, (string) $data['pin'])) {
|
||||
return $resp;
|
||||
}
|
||||
|
||||
$out = $this->wallet->withdrawFromVault($user, $data['amount'], $data['idempotency_key'] ?? null, $currency);
|
||||
|
||||
return response()->json([
|
||||
'data' => ['type' => 'withdraw', 'amount' => $data['amount'], 'currency' => $currency],
|
||||
'balances' => [
|
||||
'balance' => $out['balance'],
|
||||
'vault_balance' => $out['vault_balance'],
|
||||
'vault_balances' => $out['vault_balances'],
|
||||
],
|
||||
], 201);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user