user()->sites() ->with(['uptimeChecks' => function($query) { $query->latest('checked_at')->limit(1); }, 'sslCertificates' => function($query) { $query->latest('checked_at')->limit(1); }]) ->withCount('brokenLinks') ->get(); // Calculate stats for each site $sites->each(function($site) { $checks = $site->uptimeChecks() ->where('checked_at', '>=', now()->subDays(30)) ->get(); $totalChecks = $checks->count(); $successfulChecks = $checks->where('status_code', '>=', 200) ->where('status_code', '<', 400) ->count(); $site->uptime_percentage = $totalChecks > 0 ? ($successfulChecks / $totalChecks) * 100 : 0; $site->avg_response_time = $checks->avg('response_time_ms'); }); // Calculate overall stats $totalSites = $sites->count(); $sitesUp = $sites->filter(function($site) { $latestCheck = $site->uptimeChecks->first(); return $latestCheck && $latestCheck->status_code >= 200 && $latestCheck->status_code < 400; })->count(); $sitesDown = $sites->filter(function($site) { $latestCheck = $site->uptimeChecks->first(); return $latestCheck && ($latestCheck->status_code < 200 || $latestCheck->status_code >= 400); })->count(); $avgUptime = $sites->avg('uptime_percentage') ?? 0; // Prepare chart data for last 7 days $chartData = null; if ($sites->isNotEmpty()) { $labels = []; for ($i = 6; $i >= 0; $i--) { $labels[] = now()->subDays($i)->format('M d'); } $datasets = $sites->map(function($site) use ($labels) { $data = []; for ($i = 6; $i >= 0; $i--) { $date = now()->subDays($i)->startOfDay(); $checks = $site->uptimeChecks() ->whereDate('checked_at', $date) ->get(); $totalChecks = $checks->count(); $successfulChecks = $checks->where('status_code', '>=', 200) ->where('status_code', '<', 400) ->count(); $data[] = $totalChecks > 0 ? round(($successfulChecks / $totalChecks) * 100, 2) : null; } return [ 'label' => $site->name, 'data' => $data, 'color' => '#' . substr(md5($site->id), 0, 6) ]; })->toArray(); $chartData = [ 'labels' => $labels, 'datasets' => $datasets ]; } return view('dashboard', compact( 'sites', 'totalSites', 'sitesUp', 'sitesDown', 'avgUptime', 'chartData' )); } public function show(Site $site) { $this->authorize('view', $site); // Get uptime checks for the last 30 days $uptimeChecks = $site->uptimeChecks() ->where('checked_at', '>=', now()->subDays(30)) ->orderBy('checked_at', 'asc') ->get(); // Get latest SSL certificate $latestSslCert = $site->sslCertificates() ->latest('checked_at') ->first(); // Get broken links $brokenLinks = $site->brokenLinks() ->orderBy('last_checked_at', 'desc') ->paginate(20); // Calculate uptime percentage $totalChecks = $uptimeChecks->count(); $successfulChecks = $uptimeChecks->where('status_code', '>=', 200) ->where('status_code', '<', 400) ->count(); $uptimePercentage = $totalChecks > 0 ? round(($successfulChecks / $totalChecks) * 100, 2) : 0; // Calculate average response time $avgResponseTime = $uptimeChecks->avg('response_time_ms'); // Prepare chart data $chartLabels = $uptimeChecks->pluck('checked_at')->map(fn($date) => $date->format('M d H:i'))->toArray(); $chartData = $uptimeChecks->pluck('response_time_ms')->toArray(); $chartStatusCodes = $uptimeChecks->pluck('status_code')->toArray(); return view('dashboard.show', compact( 'site', 'uptimeChecks', 'latestSslCert', 'brokenLinks', 'uptimePercentage', 'avgResponseTime', 'chartLabels', 'chartData', 'chartStatusCodes' )); } }