mailwolt/app/Livewire/Ui/System/WoltguardCard.php

90 lines
3.1 KiB
PHP

<?php
namespace App\Livewire\Ui\System;
use Illuminate\Support\Facades\Cache;
use Livewire\Component;
class WoltguardCard extends Component
{
/** Gesamter Roh-Input aus dem Health-Cache (optional für später) */
public array $services = [];
/** UI: zusammengefasster Status */
public bool $guardOk = false; // alle Dienste OK?
public int $okCount = 0; // wie viele OK
public int $totalCount = 0; // wie viele gesamt
public int $downCount = 0; // wie viele down
public string $badgeText = 'unbekannt';
public string $badgeIcon = 'ph ph-question';
public string $badgeClass = 'text-white/70 border-white/20 bg-white/10';
/** Optional: Liste der ausgefallenen Dienste (für Tooltip/weitere Anzeige) */
public array $downServices = [];
/** Pollintervall steuern (z. B. 30s) */
public int $pollSeconds = 30;
public function mount(): void
{
$this->load();
}
public function render()
{
return view('livewire.ui.system.woltguard-card');
}
/** Manuelles Refresh aus dem UI */
public function refresh(): void
{
$this->load();
}
/* ---------------- intern ---------------- */
protected function load(): void
{
// Erwartet: Cache::put('health:services', [['name'=>'postfix','ok'=>true], ...])
$list = Cache::get('health:services', []);
$this->services = is_array($list) ? $list : [];
$this->totalCount = count($this->services);
$this->okCount = collect($this->services)->filter(fn ($s) => (bool)($s['ok'] ?? false))->count();
$this->downCount = $this->totalCount - $this->okCount;
$this->guardOk = ($this->totalCount > 0) && ($this->downCount === 0);
// Down-Services Namen extrahieren
$this->downServices = collect($this->services)
->filter(fn ($s) => !($s['ok'] ?? false))
->map(fn ($s) => (string)($s['name'] ?? 'unbekannt'))
->values()
->all();
// Badge aufbereiten (Text/Style/Icon)
if ($this->totalCount === 0) {
$this->badgeText = 'keine Daten';
$this->badgeIcon = 'ph ph-warning-circle';
$this->badgeClass = 'text-amber-300 border-amber-400/30 bg-amber-500/10';
return;
}
if ($this->guardOk) {
$this->badgeText = 'alle Dienste OK';
$this->badgeIcon = 'ph ph-check-circle';
$this->badgeClass = 'text-emerald-300 border-emerald-400/30 bg-emerald-500/10';
} else {
// kleine Abstufung je nach Anzahl der Störungen
if ($this->downCount >= 3) {
$this->badgeText = "{$this->downCount} Dienste down";
$this->badgeIcon = 'ph ph-x-circle';
$this->badgeClass = 'text-rose-300 border-rose-400/30 bg-rose-500/10';
} else {
$this->badgeText = 'Störung erkannt';
$this->badgeIcon = 'ph ph-warning-circle';
$this->badgeClass = 'text-amber-300 border-amber-400/30 bg-amber-500/10';
}
}
}
}