customer(); $block = SecurityBlock::query() ->where('uuid', $uuid) ->whereHas('instance', fn ($q) => $q->where('customer_id', $customer?->id)) ->first(); abort_if($block === null, 403); // Der Datensatz steht in jedem Fall; nur die Firewall kann nachhinken, // wenn der Host gerade nicht erreichbar ist. Dann sagen wir das — // sonst versucht sich jemand gleich wieder anzumelden und wird // wortlos erneut abgewiesen. $this->dispatch('notify', message: $block->release(auth()->user()) ? __('security.blocks_released') : __('security.blocks_released_pending')); } public function render() { $customer = $this->customer(); $blocks = $customer ? SecurityBlock::query() ->whereHas('instance', fn ($q) => $q->where('customer_id', $customer->id)) ->orderByDesc('blocked_at') ->get() : collect(); // Aktiv/Verlauf wird hier gesplittet, nicht per zweiter Abfrage: // scopeActive() prueft dieselben zwei Felder, die die Menge schon in // der Hand haelt. return view('livewire.security', [ 'active' => $blocks->filter( fn (SecurityBlock $b) => $b->released_at === null && $b->expires_at->isFuture() )->values(), 'history' => $blocks->filter( fn (SecurityBlock $b) => $b->released_at !== null || $b->expires_at->isPast() )->values(), ]); } }