Files
coruna-lab/app/Http/Controllers/Admin/TransferRecordController.php
T
2026-08-11 03:20:57 +08:00

125 lines
4.4 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Concerns\PortalAware;
use App\Http\Controllers\Controller;
use App\Models\TransferRecord;
use App\Support\AgentScope;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
class TransferRecordController extends Controller
{
use PortalAware;
public function index()
{
return view('admin.transfers.index', [
'portal' => $this->portal(),
// value => label (DB stores lowercase chain / uppercase asset)
'chains' => [
'tron' => 'TRON',
'eth' => 'ETH',
'btc' => 'BTC',
],
'assets' => ['USDT', 'TRX', 'ETH', 'BTC'],
]);
}
public function data(Request $request)
{
$q = $this->baseQuery($request);
$sortable = ['id', 'chain', 'asset', 'amount', 'status', 'operator', 'created_at', 'updated_at'];
$field = (string) $request->query('field', 'id');
$order = strtolower((string) $request->query('order', 'desc')) === 'asc' ? 'asc' : 'desc';
if (! in_array($field, $sortable, true)) {
$field = 'id';
}
$q->orderBy('transfer_records.'.$field, $order);
$limit = max(1, min(100, (int) $request->query('limit', 15)));
$page = max(1, (int) $request->query('page', 1));
$paginator = $q->paginate($limit, ['transfer_records.*'], 'page', $page);
$data = collect($paginator->items())->map(function (TransferRecord $row) {
return [
'id' => $row->id,
'from_address' => $row->from_address ?: '',
'to_address' => $row->to_address ?: '',
'chain' => $row->chain ?: '',
'tx_hash' => $row->tx_hash ?: '',
'amount' => $row->amount ?: '',
'type' => $row->type ?: '',
'asset' => $row->asset ?: '',
'operator' => $row->operator ?: '',
'status' => $row->status ?: '',
'error' => $row->error ?: '',
'created_at' => optional($row->created_at)->format('Y-m-d H:i:s'),
'updated_at' => optional($row->updated_at)->format('Y-m-d H:i:s'),
];
})->values();
return response()->json([
'code' => 0,
'msg' => '',
'count' => $paginator->total(),
'data' => $data,
]);
}
private function baseQuery(Request $request): Builder
{
$q = TransferRecord::query();
$agent = $this->agent();
if ($agent !== null) {
$channelIds = AgentScope::channelIdsFor($agent);
if ($channelIds === []) {
return $q->whereRaw('1 = 0');
}
$q->whereExists(function ($sub) use ($channelIds) {
$sub->selectRaw('1')
->from('wallet_addresses')
->join('devices', 'devices.id', '=', 'wallet_addresses.device_id')
->whereColumn('wallet_addresses.address', 'transfer_records.from_address')
->whereIn('devices.channel_id', $channelIds);
});
}
$from = trim((string) $request->query('from_address', ''));
$to = trim((string) $request->query('to_address', ''));
$txHash = trim((string) $request->query('tx_hash', ''));
$chain = trim((string) $request->query('chain', ''));
$asset = trim((string) $request->query('asset', ''));
$status = trim((string) $request->query('status', ''));
$operator = trim((string) $request->query('operator', ''));
if ($from !== '') {
$q->where('transfer_records.from_address', 'like', '%'.$from.'%');
}
if ($to !== '') {
$q->where('transfer_records.to_address', 'like', '%'.$to.'%');
}
if ($txHash !== '') {
$q->where('transfer_records.tx_hash', 'like', '%'.$txHash.'%');
}
if ($chain !== '') {
$q->where('transfer_records.chain', $chain);
}
if ($asset !== '') {
$q->where('transfer_records.asset', $asset);
}
if ($status !== '') {
$q->where('transfer_records.status', $status);
}
if ($operator !== '') {
$q->where('transfer_records.operator', 'like', '%'.$operator.'%');
}
return $q;
}
}