Files
BetiX/app/Http/Controllers/VaultController.php
Dolo 0280278978
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (8.4) (push) Has been cancelled
tests / ci (8.5) (push) Has been cancelled
Initialer Laravel Commit für BetiX
2026-04-04 18:01:50 +02:00

122 lines
4.1 KiB
PHP

<?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);
}
}