query('q', '')); $results = mb_strlen($q) >= 2 ? $this->resultsForUser($request->user(), $q) : []; if ($request->expectsJson() || $request->ajax() || $request->wantsJson()) { return response()->json(['results' => $results]); } return view('search', [ 'query' => $q, 'results' => $results, ]); } /** @return list */ private function resultsForUser($user, string $q): array { $like = '%'.$q.'%'; $results = []; $seenUrls = []; $push = function (array $item) use (&$results, &$seenUrls): void { if (isset($seenUrls[$item['url']])) { return; } $seenUrls[$item['url']] = true; $results[] = $item; }; $sharedTypes = [ HostingProduct::TYPE_SINGLE_DOMAIN, HostingProduct::TYPE_MULTI_DOMAIN, HostingProduct::TYPE_WORDPRESS, ]; $sharedAccountIds = app(HostingAccessResolver::class)->sharedAccountIds($user); HostingAccount::query() ->where(function ($query) use ($user, $sharedAccountIds) { $query->where('user_id', $user->id); if ($sharedAccountIds->isNotEmpty()) { $query->orWhereIn('id', $sharedAccountIds); } }) ->whereHas('product', fn ($query) => $query->whereIn('type', $sharedTypes)) ->where(function ($query) use ($like) { $query->where('username', 'like', $like) ->orWhere('primary_domain', 'like', $like) ->orWhereHas('sites', fn ($sites) => $sites->where('domain', 'like', $like)); }) ->with(['product', 'sites']) ->orderByDesc('updated_at') ->limit(8) ->get() ->each(function (HostingAccount $account) use ($push, $user): void { $sharedDeveloperAccess = (int) $account->user_id !== (int) $user->id; $push([ 'type' => 'hosting', 'title' => $account->linkedDomainLabel() ?? $account->username, 'subtitle' => ($account->product?->name ?? 'Hosting').' · '.ucfirst((string) $account->status), 'url' => $sharedDeveloperAccess ? route('hosting.panel.index', $account) : route('hosting.accounts.show', $account), ]); }); CustomerHostingOrder::query() ->forUser($user->id) ->whereHas('product', fn ($query) => $query->whereIn('type', $sharedTypes)) ->where(function ($query) use ($like) { $query->where('domain_name', 'like', $like) ->orWhere('server_ip', 'like', $like); }) ->with('product') ->orderByDesc('updated_at') ->limit(5) ->get() ->each(function (CustomerHostingOrder $order) use ($push): void { $push([ 'type' => 'order', 'title' => $order->domain_name ?: ($order->product?->name ?? 'Hosting order #'.$order->id), 'subtitle' => 'Hosting order · '.ucwords(str_replace('_', ' ', (string) $order->status)), 'url' => route('hosting.orders.show', $order), ]); }); return array_slice($results, 0, 12); } }