Remove old Vuexy wrapper components (AppTextField, AppSelect, AppTextarea, FlashMessages, NotificationBell)
All pages now use native Vuetify components directly. Flash messages are handled by the ToastStack component via Pinia store. Notifications use NotificationPanel. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,55 +2,56 @@
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use App\Models\Service;
|
||||
use App\Services\Provisioning\ProvisioningFactory;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Http\Controllers\Api\V1\Admin\AdminAnalyticsController;
|
||||
use App\Http\Controllers\Api\V1\Admin\AdminCustomerController;
|
||||
use App\Http\Controllers\Api\V1\Admin\AdminServiceController;
|
||||
use App\Http\Controllers\Api\V1\CustomerInvoiceController;
|
||||
use App\Http\Controllers\Api\V1\CustomerServiceController;
|
||||
use App\Http\Controllers\Api\V1\CustomerSubscriptionController;
|
||||
use App\Http\Controllers\Api\V1\CustomerTicketController;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::middleware('auth:api')->group(function (): void {
|
||||
//
|
||||
Route::middleware(['auth:api', 'throttle:api'])->prefix('v1')->group(function (): void {
|
||||
// Services
|
||||
Route::get('services', [CustomerServiceController::class, 'index'])->name('api.v1.services.index');
|
||||
Route::get('services/{service}', [CustomerServiceController::class, 'show'])->name('api.v1.services.show');
|
||||
Route::post('services/{service}/reboot', [CustomerServiceController::class, 'reboot'])->name('api.v1.services.reboot');
|
||||
|
||||
// Invoices
|
||||
Route::get('invoices', [CustomerInvoiceController::class, 'index'])->name('api.v1.invoices.index');
|
||||
Route::get('invoices/{invoice}/pdf', [CustomerInvoiceController::class, 'downloadPdf'])->name('api.v1.invoices.pdf');
|
||||
|
||||
// Subscriptions
|
||||
Route::get('subscriptions', [CustomerSubscriptionController::class, 'index'])->name('api.v1.subscriptions.index');
|
||||
Route::post('subscriptions/{subscription}/cancel', [CustomerSubscriptionController::class, 'cancel'])->name('api.v1.subscriptions.cancel');
|
||||
|
||||
// Tickets
|
||||
Route::get('tickets', [CustomerTicketController::class, 'index'])->name('api.v1.tickets.index');
|
||||
Route::post('tickets', [CustomerTicketController::class, 'store'])->name('api.v1.tickets.store');
|
||||
Route::get('tickets/{ticket}', [CustomerTicketController::class, 'show'])->name('api.v1.tickets.show');
|
||||
Route::post('tickets/{ticket}/reply', [CustomerTicketController::class, 'reply'])->name('api.v1.tickets.reply');
|
||||
});
|
||||
|
||||
// Debug endpoint to check request details
|
||||
Route::any('/debug/request', function (Request $request) {
|
||||
return response()->json([
|
||||
'method' => $request->method(),
|
||||
'url' => $request->url(),
|
||||
'fullUrl' => $request->fullUrl(),
|
||||
'path' => $request->path(),
|
||||
'is_webhook' => $request->is('webhooks/*'),
|
||||
'is_api' => $request->is('api/*'),
|
||||
'has_csrf_token' => $request->hasHeader('X-CSRF-TOKEN') || $request->hasHeader('X-XSRF-TOKEN'),
|
||||
'headers' => $request->headers->all(),
|
||||
]);
|
||||
})->name('api.debug.request');
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Admin API Routes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| These routes are protected by Passport authentication and require the
|
||||
| admin role. Rate limited at 120 requests per minute.
|
||||
|
|
||||
*/
|
||||
Route::middleware(['auth:api', 'role:admin', 'throttle:120,1'])->prefix('v1/admin')->group(function (): void {
|
||||
// Customers
|
||||
Route::get('customers', [AdminCustomerController::class, 'index'])->name('api.v1.admin.customers.index');
|
||||
Route::get('customers/{user}', [AdminCustomerController::class, 'show'])->name('api.v1.admin.customers.show');
|
||||
|
||||
// Test endpoint for VirtFusion provisioning (no auth required for testing)
|
||||
Route::post('/test/provision/{service}', function (Request $request, Service $service) {
|
||||
try {
|
||||
$factory = new ProvisioningFactory;
|
||||
$provisioningService = $factory->make($service);
|
||||
// Services
|
||||
Route::get('services', [AdminServiceController::class, 'index'])->name('api.v1.admin.services.index');
|
||||
Route::get('services/{service}', [AdminServiceController::class, 'show'])->name('api.v1.admin.services.show');
|
||||
Route::post('services/{service}/suspend', [AdminServiceController::class, 'suspend'])->name('api.v1.admin.services.suspend');
|
||||
Route::post('services/{service}/unsuspend', [AdminServiceController::class, 'unsuspend'])->name('api.v1.admin.services.unsuspend');
|
||||
|
||||
// Get or create a fake subscription for testing
|
||||
$subscription = $service->subscription;
|
||||
if (! $subscription) {
|
||||
return response()->json([
|
||||
'error' => 'Service has no subscription. Create a subscription first.',
|
||||
], 400);
|
||||
}
|
||||
|
||||
$result = $provisioningService->provision($subscription);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'service' => $result,
|
||||
'message' => 'Service provisioned successfully',
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'error' => $e->getMessage(),
|
||||
'trace' => config('app.debug') ? $e->getTraceAsString() : null,
|
||||
], 500);
|
||||
}
|
||||
})->name('api.test.provision');
|
||||
// Analytics
|
||||
Route::get('analytics', [AdminAnalyticsController::class, 'index'])->name('api.v1.admin.analytics.index');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user