some progress

This commit is contained in:
Doar Mihai
2026-01-17 16:42:43 +02:00
parent 030a105992
commit 3665a1d5a3
57 changed files with 5804 additions and 3 deletions
@@ -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,
],
]);
}
}