Files
ladill-transfer/app/Http/Controllers/SearchController.php
T
isaaccladandCursor f9b16f6b61
Deploy Ladill Transfer / deploy (push) Successful in 44s
Add Files page upload flow with manual folders and duplicate handling.
Users can create folders, upload files or folders, and choose replace or keep both on name conflicts instead of auto-grouping by transfer.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-08 21:27:39 +00:00

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