143 lines
4.8 KiB
PHP
143 lines
4.8 KiB
PHP
<?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'
|
|
));
|
|
}
|
|
}
|