*/ public function sharedHostingAccountsForNode(HostingNode $node): Collection { return HostingAccount::query() ->where('hosting_node_id', $node->id) ->where('type', HostingAccount::TYPE_SHARED) ->with(['user:id,name,email', 'product:id,name']) ->orderByDesc('disk_used_bytes') ->get(); } /** * @return Collection */ public function mailStorageByUserForServer(EmailServer $server): Collection { $memberIds = app(\App\Services\Mail\EmailServerPoolService::class) ->poolMembers($server->poolRoot()) ->pluck('id'); $rows = Mailbox::query() ->selectRaw('mailboxes.user_id') ->selectRaw('COUNT(mailboxes.id) as mailbox_count') ->selectRaw('COALESCE(SUM(mailboxes.quota_mb), 0) as allocated_storage_mb') ->selectRaw('COALESCE(SUM(mailboxes.disk_used_bytes), 0) as used_storage_bytes') ->where(function ($query) use ($memberIds) { $query->whereHas('emailDomain', fn ($q) => $q->whereIn('email_server_id', $memberIds)) ->orWhereHas('domain', fn ($q) => $q->whereIn('email_server_id', $memberIds)); }) ->groupBy('mailboxes.user_id') ->orderByDesc('used_storage_bytes') ->get(); $users = User::query() ->whereIn('id', $rows->pluck('user_id')->filter()) ->get() ->keyBy('id'); return $rows->map(function ($row) use ($users) { $user = $users->get($row->user_id); return (object) [ 'user_id' => (int) $row->user_id, 'name' => $user?->name, 'email' => $user?->email, 'mailbox_count' => (int) $row->mailbox_count, 'allocated_storage_mb' => (int) $row->allocated_storage_mb, 'used_storage_mb' => (int) ceil(((int) $row->used_storage_bytes) / 1048576), ]; }); } }