Files
jabali-panel/app/Filament/Jabali/Widgets/StatsOverview.php
2026-02-02 03:11:45 +02:00

106 lines
3.1 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Filament\Jabali\Widgets;
use App\Models\Domain;
use App\Models\Mailbox;
use App\Services\Agent\AgentClient;
use Filament\Widgets\Widget;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class StatsOverview extends Widget
{
protected static ?int $sort = 1;
protected int|string|array $columnSpan = 'full';
protected string $view = 'filament.jabali.widgets.stats-overview';
public function getStats(): array
{
$user = Auth::user();
// Count domains
$domainCount = Domain::where('user_id', $user->id)->count();
// Count email accounts
$emailCount = Mailbox::whereHas('emailDomain', function ($query) use ($user) {
$query->whereHas('domain', function ($q) use ($user) {
$q->where('user_id', $user->id);
});
})->count();
// Count databases
$dbCount = 0;
$dbCountResolved = false;
try {
$agent = app(AgentClient::class);
$result = $agent->mysqlListDatabases($user->username);
if (($result['success'] ?? false) === true) {
$dbCountResolved = true;
$dbCount = count($result['databases'] ?? []);
}
} catch (\Exception $e) {
// Ignore agent errors and fall back to direct DB query
}
if (! $dbCountResolved) {
$prefix = $user->username.'_';
$connections = [config('database.default')];
if ($connections[0] === 'sqlite') {
$connections = ['mysql', 'mariadb', 'sqlite'];
}
foreach ($connections as $connection) {
try {
$databases = DB::connection($connection)->select('SHOW DATABASES LIKE ?', [$prefix.'%']);
$dbCount = count($databases);
if ($dbCount > 0) {
break;
}
} catch (\Exception $e) {
// Try next connection
}
}
}
// Count SSL certificates
$sslCount = Domain::where('user_id', $user->id)
->whereHas('sslCertificate', function ($query) {
$query->where('expires_at', '>', now());
})->count();
return [
[
'value' => $domainCount,
'label' => __('Domains'),
'icon' => 'heroicon-o-globe-alt',
'color' => 'success',
],
[
'value' => $emailCount,
'label' => __('Mailboxes'),
'icon' => 'heroicon-o-envelope',
'color' => 'info',
],
[
'value' => $dbCount,
'label' => __('Databases'),
'icon' => 'heroicon-o-circle-stack',
'color' => 'warning',
],
[
'value' => $sslCount,
'label' => __('SSL Certificates'),
'icon' => 'heroicon-o-lock-closed',
'color' => 'success',
],
];
}
}