lots of progress
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
<?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'
|
||||
));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user