Files
ladill-transfer/app/Http/Controllers/SearchController.php
T
isaaccladandCursor c1e3d8b3ac Initial Ladill Transfer app — file sharing with QR links.
Scaffolded from the Ladill mini/events extraction pattern: multi-file transfers,
retention controls, public landing pages, analytics, and Gitea deploy workflow.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-08 09:25:30 +00:00

56 lines
1.7 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\QrCode;
use App\Support\Qr\QrTypeCatalog;
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
{
$like = '%'.$q.'%';
return ladill_account()->qrCodes()
->whereIn('type', QrTypeCatalog::eventsTypes())
->where(function ($query) use ($like): void {
$query->where('label', 'like', $like)
->orWhere('short_code', 'like', $like)
->orWhere('destination_url', 'like', $like);
})
->orderByDesc('updated_at')
->limit(15)
->get()
->map(function (QrCode $code): array {
$content = $code->content();
return [
'type' => $code->type === QrCode::TYPE_EVENT ? 'event' : 'programme',
'title' => $content['name'] ?? $code->label,
'subtitle' => $code->typeLabel().' · '.$code->publicUrl(),
'url' => route('events.show', $code),
];
})
->all();
}
}