Files
ladill-transfer/app/Http/Controllers/SearchController.php
T
isaaccladandCursor 1a95915e21
Deploy Ladill Transfer / deploy (push) Successful in 28s
Separate share transfers from Files storage and add folder upload to New transfer.
Transfers lists only intentional shares while Files shows all storage, and New transfer accepts folder picks with flattened file uploads.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-08 22:31:45 +00:00

82 lines
2.8 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Transfer;
use App\Models\TransferFile;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class SearchController extends Controller
{
public function __invoke(Request $request): JsonResponse|View
{
$q = trim((string) $request->query('q'));
$results = mb_strlen($q) >= 2 ? $this->results($q) : [];
if ($request->expectsJson() || $request->ajax() || $request->wantsJson()) {
return response()->json(['results' => $results]);
}
return view('search.index', [
'query' => $q,
'results' => $results,
]);
}
/** @return list<array{type: string, title: string, subtitle: string, url: string}> */
private function results(string $q): array
{
$account = ladill_account();
$like = '%'.$q.'%';
$results = [];
Transfer::query()
->where('user_id', $account->id)
->shareTransfers()
->where('status', '!=', Transfer::STATUS_DELETED)
->where(function ($query) use ($like) {
$query->where('title', 'like', $like)
->orWhere('message', 'like', $like)
->orWhere('recipient_email', 'like', $like);
})
->withCount('files')
->latest()
->limit(8)
->get()
->each(function (Transfer $transfer) use (&$results) {
$results[] = [
'type' => 'transfer',
'title' => $transfer->title,
'subtitle' => $transfer->files_count.' file'.($transfer->files_count === 1 ? '' : 's').' · '.$transfer->billingStatusLabel(),
'url' => route('transfer.transfers.show', $transfer),
];
});
TransferFile::query()
->whereHas('transfer', fn ($inner) => $inner
->where('user_id', $account->id)
->where('status', '!=', Transfer::STATUS_DELETED))
->where('original_name', 'like', $like)
->with('transfer')
->latest()
->limit(8)
->get()
->each(function (TransferFile $file) use (&$results) {
$params = $file->transfer->is_folder
? ['folder' => $file->transfer_id, 'q' => $file->original_name]
: ['q' => $file->original_name];
$results[] = [
'type' => 'file',
'title' => $file->original_name,
'subtitle' => $file->humanSize().($file->transfer->is_folder ? ' · '.$file->transfer->title : ''),
'url' => route('transfer.files.index', $params),
];
});
return array_slice($results, 0, 15);
}
}