$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', 20))); $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; } }