Files
2026-01-17 16:42:43 +02:00

74 lines
2.2 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\Api\UptimeIndexRequest;
use App\Models\Site;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UptimeController extends Controller
{
/**
* Get uptime history for a site (paginated).
*/
public function index(UptimeIndexRequest $request, Site $site): JsonResponse
{
// Ensure the site belongs to the authenticated user
if ($site->user_id !== $request->user()->id) {
return response()->json([
'message' => 'Unauthorized',
], 403);
}
$perPage = $request->input('per_page', 50);
$perPage = min($perPage, 100); // Max 100 per page
$uptimeChecks = $site->uptimeChecks()
->orderBy('checked_at', 'desc')
->paginate($perPage);
return response()->json($uptimeChecks);
}
/**
* Get uptime statistics for a site.
*/
public function stats(Request $request, Site $site): JsonResponse
{
// Ensure the site belongs to the authenticated user
if ($site->user_id !== $request->user()->id) {
return response()->json([
'message' => 'Unauthorized',
], 403);
}
$totalChecks = $site->uptimeChecks()->count();
$successfulChecks = $site->uptimeChecks()
->whereBetween('status_code', [200, 299])
->count();
$uptimePercentage = $totalChecks > 0
? round(($successfulChecks / $totalChecks) * 100, 2)
: 0;
$averageResponseTime = $site->uptimeChecks()
->avg('response_time_ms');
$latestCheck = $site->uptimeChecks()
->latest('checked_at')
->first();
return response()->json([
'data' => [
'total_checks' => $totalChecks,
'successful_checks' => $successfulChecks,
'uptime_percentage' => $uptimePercentage,
'average_response_time_ms' => $averageResponseTime ? round($averageResponseTime, 2) : null,
'latest_check' => $latestCheck,
],
]);
}
}