clusev/app/Livewire/Audit/Index.php

53 lines
1.3 KiB
PHP

<?php
namespace App\Livewire\Audit;
use App\Models\AuditEvent;
use Illuminate\Support\Collection;
use Livewire\Attributes\Layout;
use Livewire\Attributes\Title;
use Livewire\Component;
#[Layout('layouts.app')]
#[Title('Audit-Log — Clusev')]
class Index extends Component
{
/** Freitext-Filter über Akteur / Aktion / Ziel / Server. */
public string $q = '';
/**
* Letzte Audit-Ereignisse, optional gefiltert. Echte Daten aus der DB;
* die Filterung läuft im Speicher über die geladenen 50 Einträge.
*/
protected function events(): Collection
{
$events = AuditEvent::with('server')->latest()->limit(50)->get();
$needle = trim($this->q);
if ($needle === '') {
return $events;
}
$needle = mb_strtolower($needle);
return $events->filter(function (AuditEvent $e) use ($needle): bool {
$haystack = mb_strtolower(implode(' ', array_filter([
$e->actor,
$e->action,
$e->target,
$e->server?->name,
])));
return str_contains($haystack, $needle);
})->values();
}
public function render()
{
return view('livewire.audit.index', [
'events' => $this->events(),
]);
}
}