Files
ismysiteup.online/app/Http/Controllers/DashboardController.php
T

143 lines
4.8 KiB
PHP
Raw Normal View History

2026-01-17 13:46:20 +02:00
<?php
namespace App\Http\Controllers;
use App\Models\Site;
use Illuminate\Http\Request;
class DashboardController extends Controller
{
public function index()
{
$sites = auth()->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'
));
}
}