some progress
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
|
||||
class AuthController extends Controller
|
||||
{
|
||||
/**
|
||||
* Create a new API token for the authenticated user.
|
||||
*/
|
||||
public function createToken(Request $request): JsonResponse
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'token_name' => ['required', 'string', 'max:255'],
|
||||
]);
|
||||
|
||||
$token = $request->user()->createToken($validated['token_name']);
|
||||
|
||||
return response()->json([
|
||||
'token' => $token->plainTextToken,
|
||||
'type' => 'Bearer',
|
||||
], 201);
|
||||
}
|
||||
|
||||
/**
|
||||
* List all tokens for the authenticated user.
|
||||
*/
|
||||
public function tokens(Request $request): JsonResponse
|
||||
{
|
||||
$tokens = $request->user()->tokens()->get(['id', 'name', 'last_used_at', 'created_at']);
|
||||
|
||||
return response()->json([
|
||||
'data' => $tokens,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Revoke a specific token.
|
||||
*/
|
||||
public function revokeToken(Request $request, string $tokenId): JsonResponse
|
||||
{
|
||||
$deleted = $request->user()->tokens()->where('id', $tokenId)->delete();
|
||||
|
||||
if (!$deleted) {
|
||||
return response()->json([
|
||||
'message' => 'Token not found',
|
||||
], 404);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'message' => 'Token revoked successfully',
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Revoke all tokens for the authenticated user.
|
||||
*/
|
||||
public function revokeAllTokens(Request $request): JsonResponse
|
||||
{
|
||||
$request->user()->tokens()->delete();
|
||||
|
||||
return response()->json([
|
||||
'message' => 'All tokens revoked successfully',
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Api\BrokenLinksIndexRequest;
|
||||
use App\Models\Site;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class LinkController extends Controller
|
||||
{
|
||||
/**
|
||||
* Get broken links list for a site.
|
||||
*/
|
||||
public function index(BrokenLinksIndexRequest $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
|
||||
|
||||
$brokenLinks = $site->brokenLinks()
|
||||
->orderBy('last_checked_at', 'desc')
|
||||
->paginate($perPage);
|
||||
|
||||
return response()->json($brokenLinks);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get broken links 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);
|
||||
}
|
||||
|
||||
$totalBrokenLinks = $site->brokenLinks()->count();
|
||||
|
||||
$statusCodeBreakdown = $site->brokenLinks()
|
||||
->selectRaw('status_code, COUNT(*) as count')
|
||||
->groupBy('status_code')
|
||||
->orderBy('count', 'desc')
|
||||
->get();
|
||||
|
||||
return response()->json([
|
||||
'data' => [
|
||||
'total_broken_links' => $totalBrokenLinks,
|
||||
'status_code_breakdown' => $statusCodeBreakdown,
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Site;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class SiteController extends Controller
|
||||
{
|
||||
/**
|
||||
* List all sites for the authenticated user.
|
||||
*/
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$sites = $request->user()
|
||||
->sites()
|
||||
->withCount(['uptimeChecks', 'sslCertificates', 'brokenLinks'])
|
||||
->orderBy('created_at', 'desc')
|
||||
->get();
|
||||
|
||||
return response()->json([
|
||||
'data' => $sites,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a specific site for the authenticated user.
|
||||
*/
|
||||
public function show(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);
|
||||
}
|
||||
|
||||
$site->loadCount(['uptimeChecks', 'sslCertificates', 'brokenLinks']);
|
||||
|
||||
return response()->json([
|
||||
'data' => $site,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Api\SslHistoryRequest;
|
||||
use App\Models\Site;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class SslController extends Controller
|
||||
{
|
||||
/**
|
||||
* Get SSL certificate data for a site.
|
||||
*/
|
||||
public function show(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);
|
||||
}
|
||||
|
||||
$latestCertificate = $site->sslCertificates()
|
||||
->latest('checked_at')
|
||||
->first();
|
||||
|
||||
if (!$latestCertificate) {
|
||||
return response()->json([
|
||||
'message' => 'No SSL certificate data found',
|
||||
], 404);
|
||||
}
|
||||
|
||||
$daysUntilExpiry = null;
|
||||
$isExpiring = false;
|
||||
|
||||
if ($latestCertificate->expires_at) {
|
||||
$daysUntilExpiry = now()->diffInDays($latestCertificate->expires_at, false);
|
||||
$isExpiring = $daysUntilExpiry <= 30 && $daysUntilExpiry > 0;
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'data' => [
|
||||
'issuer' => $latestCertificate->issuer,
|
||||
'expires_at' => $latestCertificate->expires_at,
|
||||
'checked_at' => $latestCertificate->checked_at,
|
||||
'days_until_expiry' => $daysUntilExpiry ? (int) $daysUntilExpiry : null,
|
||||
'is_expiring_soon' => $isExpiring,
|
||||
'is_expired' => $daysUntilExpiry !== null && $daysUntilExpiry < 0,
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get SSL certificate history for a site.
|
||||
*/
|
||||
public function history(SslHistoryRequest $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', 20);
|
||||
$perPage = min($perPage, 100); // Max 100 per page
|
||||
|
||||
$certificates = $site->sslCertificates()
|
||||
->orderBy('checked_at', 'desc')
|
||||
->paginate($perPage);
|
||||
|
||||
return response()->json($certificates);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
<?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,
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user