user(); $accounts = $this->sharedHostingAccounts($user); $accountIds = $accounts->pluck('id'); $pendingOrders = CustomerHostingOrder::query() ->forUser($user->id) ->whereHas('product', fn ($q) => $q->whereIn('type', $this->sharedTypes())) ->whereIn('status', [ CustomerHostingOrder::STATUS_PENDING_PAYMENT, CustomerHostingOrder::STATUS_PENDING_APPROVAL, CustomerHostingOrder::STATUS_APPROVED, CustomerHostingOrder::STATUS_PROVISIONING, ]) ->with('product') ->latest() ->take(5) ->get(); $linkedDomains = $accountIds->isEmpty() ? 0 : HostedSite::query()->whereIn('hosting_account_id', $accountIds)->count(); return view('hosting.dashboard', [ 'accounts' => $accounts, 'activeCount' => $accounts->where('status', HostingAccount::STATUS_ACTIVE)->count(), 'expiringCount' => $accounts ->where('status', HostingAccount::STATUS_ACTIVE) ->filter(fn (HostingAccount $account) => $account->expires_at !== null && $account->expires_at->between(now(), now()->addDays(30))) ->count(), 'pendingOrderCount' => CustomerHostingOrder::query() ->forUser($user->id) ->whereHas('product', fn ($q) => $q->whereIn('type', $this->sharedTypes())) ->whereIn('status', [ CustomerHostingOrder::STATUS_PENDING_PAYMENT, CustomerHostingOrder::STATUS_PENDING_APPROVAL, CustomerHostingOrder::STATUS_APPROVED, CustomerHostingOrder::STATUS_PROVISIONING, ]) ->count(), 'linkedDomains' => $linkedDomains, 'recent' => $accounts->take(5), 'pendingOrders' => $pendingOrders, ]); } public function accounts(Request $request): View { return view('hosting.accounts-list', [ 'title' => 'Your Hosting Accounts', 'accounts' => $this->sharedHostingAccounts($request->user()), ]); } /** @return list */ private function sharedTypes(): array { return [ HostingProduct::TYPE_SINGLE_DOMAIN, HostingProduct::TYPE_MULTI_DOMAIN, HostingProduct::TYPE_WORDPRESS, ]; } /** @return Collection */ private function sharedHostingAccounts(User $user): Collection { $sharedTypes = $this->sharedTypes(); $sharedAccountIds = HostingAccountMember::query() ->where('user_id', $user->id) ->pluck('hosting_account_id'); $hostingAccounts = HostingAccount::query() ->where(function ($query) use ($user, $sharedAccountIds) { $query->where('user_id', $user->id); if ($sharedAccountIds->isNotEmpty()) { $query->orWhereIn('id', $sharedAccountIds); } }) ->whereHas('product', fn ($q) => $q->whereIn('type', $sharedTypes)) ->with(['product', 'sites']) ->latest() ->get(); $orderAccounts = CustomerHostingOrder::query() ->forUser($user->id) ->whereHas('product', fn ($q) => $q->whereIn('type', $sharedTypes)) ->with(['hostingAccount.product', 'hostingAccount.sites']) ->latest() ->get() ->filter(fn (CustomerHostingOrder $order) => $order->hostingAccount !== null) ->map(fn (CustomerHostingOrder $order) => $order->hostingAccount); return $hostingAccounts->merge($orderAccounts)->unique('id')->values(); } }