First commit

This commit is contained in:
dyzulk
2025-12-30 12:11:01 +07:00
commit f68f34980a
150 changed files with 22717 additions and 0 deletions

126
routes/api.php Normal file
View File

@@ -0,0 +1,126 @@
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\AuthController;
use App\Http\Controllers\ServiceController;
use App\Http\Controllers\NavigationController;
use App\Http\Controllers\Api\CertificateApiController;
use App\Http\Controllers\Api\RootCaApiController;
use App\Http\Controllers\Api\ApiKeyController;
use App\Http\Controllers\Api\PublicCaController;
use App\Http\Controllers\Api\ProfileController;
use App\Http\Controllers\Api\UserApiController;
use App\Http\Controllers\Api\MailController;
use App\Http\Controllers\Api\DashboardController;
// Public API Routes
Route::get('/public/ca-certificates', [PublicCaController::class, 'index']);
Route::get('/public/ca-certificates/{serial}/download', [PublicCaController::class, 'download']);
Route::get('/public/ca-certificates/{serial}/download/windows', [PublicCaController::class, 'downloadWindows']);
Route::get('/public/ca-certificates/{serial}/download/mac', [PublicCaController::class, 'downloadMac']);
Route::post('/public/inquiries', [\App\Http\Controllers\Api\InquiryController::class, 'store']);
Route::get('/public/legal-pages', [\App\Http\Controllers\Api\LegalPageController::class, 'index']);
Route::get('/public/legal-pages/{slug}', [\App\Http\Controllers\Api\LegalPageController::class, 'show']);
// Auth routes moved to web.php for SPA session support
// Auth routes moved to web.php for SPA session support (manually prefixed with /api there)
// This ensures they use the 'web' middleware stack for proper session persistence.
Route::get('/navigation-debug', [NavigationController::class, 'debug']);
Route::middleware(['auth:sanctum'])->group(function () {
Route::delete('/auth/social/{provider}', [AuthController::class, 'disconnectSocial']);
Route::post('/auth/set-password', [AuthController::class, 'setPassword']);
Route::get('/auth/link-token', [AuthController::class, 'getLinkToken']);
Route::get('/user', function (Request $request) {
return $request->user()->load('socialAccounts');
});
Route::get('/services', [ServiceController::class, 'index']);
Route::get('/navigation', [NavigationController::class, 'index']);
// Core Features (Require Email Verification)
Route::middleware(['verified'])->group(function () {
// Certificate Routes
Route::get('/certificates', [CertificateApiController::class, 'index']);
Route::post('/certificates', [CertificateApiController::class, 'store']);
Route::get('/certificates/{certificate}', [CertificateApiController::class, 'show']);
Route::delete('/certificates/{certificate}', [CertificateApiController::class, 'destroy']);
Route::get('/certificates/{certificate}/download/{type}', [CertificateApiController::class, 'downloadFile']);
// CA Management (Admin)
Route::post('/ca/setup', [CertificateApiController::class, 'setupCa']);
// Root CA Management (Admin Only)
Route::get('/admin/ca-certificates', [RootCaApiController::class, 'index']);
Route::post('/admin/ca-certificates/{certificate}/renew', [RootCaApiController::class, 'renew']);
// API Keys Management
Route::get('/api-keys', [ApiKeyController::class, 'index']);
Route::post('/api-keys', [ApiKeyController::class, 'store']);
Route::delete('/api-keys/{id}', [ApiKeyController::class, 'destroy']);
Route::patch('/api-keys/{id}/toggle', [ApiKeyController::class, 'toggle']);
Route::post('/api-keys/{id}/regenerate', [ApiKeyController::class, 'regenerate']);
// Profile Management (Sensitive parts)
Route::patch('/profile', [ProfileController::class, 'update']);
Route::put('/profile/password', [ProfileController::class, 'updatePassword']);
Route::post('/profile/avatar', [ProfileController::class, 'updateAvatar']);
Route::get('/profile/login-history', [ProfileController::class, 'getLoginHistory']);
Route::delete('/profile', [ProfileController::class, 'deleteAccount']);
Route::get('/profile/sessions', [ProfileController::class, 'getActiveSessions']);
Route::delete('/profile/sessions/{id}', [ProfileController::class, 'revokeSession']);
// Notifications
Route::get('/notifications', [\App\Http\Controllers\Api\NotificationController::class, 'index']);
Route::patch('/notifications/{id}/read', [\App\Http\Controllers\Api\NotificationController::class, 'markAsRead']);
Route::post('/notifications/mark-all-read', [\App\Http\Controllers\Api\NotificationController::class, 'markAllAsRead']);
Route::delete('/notifications/{id}', [\App\Http\Controllers\Api\NotificationController::class, 'destroy']);
// Dashboard
Route::get('/dashboard', [DashboardController::class, 'index']);
Route::get('/dashboard/ping', [DashboardController::class, 'ping']);
// Support Tickets
Route::get('/support/tickets', [\App\Http\Controllers\Api\TicketController::class, 'index']);
Route::post('/support/tickets', [\App\Http\Controllers\Api\TicketController::class, 'store']);
Route::get('/support/tickets/{id}', [\App\Http\Controllers\Api\TicketController::class, 'show']);
Route::post('/support/tickets/{id}/reply', [\App\Http\Controllers\Api\TicketController::class, 'reply']);
Route::patch('/support/tickets/{id}/close', [\App\Http\Controllers\Api\TicketController::class, 'close']);
// User Management (Admin Only)
Route::apiResource('/admin/users', UserApiController::class);
// Inquiry Management (Admin Only)
Route::middleware(['admin'])->group(function () {
Route::get('/admin/inquiries', [\App\Http\Controllers\Api\InquiryController::class, 'index']);
Route::get('/admin/inquiries/{inquiry}', [\App\Http\Controllers\Api\InquiryController::class, 'show']);
Route::post('/admin/inquiries/{inquiry}/reply', [\App\Http\Controllers\Api\InquiryController::class, 'reply']);
Route::delete('/admin/inquiries/{inquiry}', [\App\Http\Controllers\Api\InquiryController::class, 'destroy']);
});
// SMTP Testing (Admin Only)
Route::middleware(['admin'])->group(function () {
Route::get('/admin/smtp/config', [MailController::class, 'getConfigurations']);
Route::post('/admin/smtp/test', [MailController::class, 'sendTestEmail']);
});
// Legal Pages Management (Admin Only)
Route::middleware(['admin'])->group(function () {
Route::get('/admin/legal-pages', [\App\Http\Controllers\Api\Admin\LegalPageController::class, 'index']);
Route::post('/admin/legal-pages', [\App\Http\Controllers\Api\Admin\LegalPageController::class, 'store']);
Route::get('/admin/legal-pages/{legalPage}', [\App\Http\Controllers\Api\Admin\LegalPageController::class, 'show']);
Route::get('/admin/legal-pages/{id}/history', [\App\Http\Controllers\Api\Admin\LegalPageController::class, 'getHistory']);
Route::put('/admin/legal-pages/{legalPage}', [\App\Http\Controllers\Api\Admin\LegalPageController::class, 'update']);
Route::delete('/admin/legal-pages/{legalPage}', [\App\Http\Controllers\Api\Admin\LegalPageController::class, 'destroy']);
});
});
});
// Authenticated API Routes (v1) - Using API Key
Route::middleware([\App\Http\Middleware\CheckApiKey::class])->prefix('v1')->group(function () {
Route::get('/certificates', [CertificateApiController::class, 'index']);
});

7
routes/channels.php Normal file
View File

@@ -0,0 +1,7 @@
<?php
use Illuminate\Support\Facades\Broadcast;
Broadcast::channel('App.Models.User.{id}', function ($user, $id) {
return (string) $user->id === (string) $id;
});

11
routes/console.php Normal file
View File

@@ -0,0 +1,11 @@
<?php
use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Schedule;
Artisan::command('inspire', function () {
$this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote');
Schedule::command('certificates:notify-expiring')->daily();

42
routes/web.php Normal file
View File

@@ -0,0 +1,42 @@
<?php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return response()->json(['status' => 'ok', 'service' => 'trustlab-api']);
});
use App\Http\Controllers\AuthController;
Route::post('/login', [AuthController::class, 'login']);
Route::post('/logout', [AuthController::class, 'logout']);
Route::post('/register', [AuthController::class, 'register']);
use App\Http\Controllers\Api\PasswordResetController;
Route::post('/forgot-password', [PasswordResetController::class, 'sendResetLinkEmail']);
Route::post('/reset-password', [PasswordResetController::class, 'resetPassword']);
// Social Auth Routes (Manually prefixed with /api to match frontend/callback config, but served via web middleware)
Route::get('/api/auth/{provider}/redirect', [AuthController::class, 'socialRedirect'])->name('social.redirect');
Route::get('/api/auth/{provider}/callback', [AuthController::class, 'socialCallback'])->name('social.callback');
use App\Http\Controllers\TwoFactorController;
// 2FA Routes (Protected by Sanctum - supports both full auth and temp 2fa auth)
Route::middleware('auth:sanctum')->group(function () {
Route::post('/api/auth/2fa/enable', [TwoFactorController::class, 'enable']);
Route::post('/api/auth/2fa/confirm', [TwoFactorController::class, 'confirm']);
Route::delete('/api/auth/2fa/disable', [TwoFactorController::class, 'disable']);
Route::post('/api/auth/2fa/verify', [TwoFactorController::class, 'verify']);
Route::get('/api/auth/2fa/recovery-codes', [TwoFactorController::class, 'recoveryCodes']);
});
use App\Http\Controllers\Api\VerificationController;
Route::get('/email/verify/{id}/{hash}', [VerificationController::class, 'verify'])
->middleware(['auth:sanctum', 'signed'])
->name('verification.verify');
Route::post('/api/email/verification-notification', [VerificationController::class, 'resend'])
->middleware(['auth:sanctum', 'throttle:6,1'])
->name('verification.send');