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:
Claude Dev
2026-03-14 17:10:23 -04:00
parent dd1a5d7ffc
commit 40c1ecc6fe
90 changed files with 20113 additions and 457 deletions

View File

@@ -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');
});