group(function () { Route::prefix('administrator')->group(function () { Route::post('login', [AuthController::class, 'login']); Route::middleware('api.auth:admin')->group(function () { Route::post('logout', [AuthController::class, 'logout']); Route::post('refresh', [AuthController::class, 'refresh']); Route::get('me', [AuthController::class, 'me']); // Customers Route::prefix('customers')->group(function () { Route::get('/', [CustomerController::class, 'index']); Route::get('/datatable', [CustomerController::class, 'datatable']); Route::post('/', [CustomerController::class, 'store']); Route::get('{id}', [CustomerController::class, 'show']); Route::put('{id}', [CustomerController::class, 'update']); Route::delete('{id}', [CustomerController::class, 'destroy']); Route::post('{id}/reset-password', [CustomerController::class, 'resetPassword']); Route::post('{id}/add-credit', [CustomerController::class, 'addCredit']); Route::get('{id}/products', [CustomerController::class, 'getProducts']); Route::get('{id}/invoices', [CustomerController::class, 'getInvoices']); Route::get('{id}/transactions', [CustomerController::class, 'getTransactions']); Route::get('{id}/domains', [CustomerController::class, 'getDomains']); Route::get('trash', [CustomerController::class, 'trash']); Route::post('{id}/restore', [CustomerController::class, 'restore']); Route::delete('{id}/force', [CustomerController::class, 'forceDelete']); }); // Products Route::prefix('products')->group(function () { Route::get('/', [ProductController::class, 'index']); Route::post('/', [ProductController::class, 'store']); Route::get('{id}', [ProductController::class, 'show']); Route::put('{id}', [ProductController::class, 'update']); Route::delete('{id}', [ProductController::class, 'destroy']); Route::post('{id}/duplicate', [ProductController::class, 'duplicate']); Route::post('import', [ProductController::class, 'import']); Route::get('export', [ProductController::class, 'export']); }); // Product Categories (Groups) Route::prefix('product-categories')->group(function () { Route::get('/', [ProductCategoryController::class, 'index']); Route::post('/', [ProductCategoryController::class, 'store']); Route::get('{id}', [ProductCategoryController::class, 'show']); Route::put('{id}', [ProductCategoryController::class, 'update']); Route::delete('{id}', [ProductCategoryController::class, 'destroy']); }); // Orders Route::prefix('orders')->group(function () { Route::get('/', [OrderController::class, 'index']); Route::get('/datatable', [OrderController::class, 'datatable']); Route::post('/', [OrderController::class, 'store']); Route::get('{id}', [OrderController::class, 'show']); Route::put('{id}', [OrderController::class, 'update']); Route::delete('{id}', [OrderController::class, 'destroy']); Route::post('{id}/accept', [OrderController::class, 'accept']); Route::post('{id}/cancel', [OrderController::class, 'cancel']); }); // Invoices Route::prefix('invoices')->group(function () { Route::get('/', [InvoiceController::class, 'index']); Route::get('/datatable', [InvoiceController::class, 'datatable']); Route::post('/', [InvoiceController::class, 'store']); Route::get('{id}', [InvoiceController::class, 'show']); Route::put('{id}', [InvoiceController::class, 'update']); Route::delete('{id}', [InvoiceController::class, 'destroy']); Route::post('{id}/paid', [InvoiceController::class, 'markAsPaid']); Route::post('{id}/cancel', [InvoiceController::class, 'cancel']); }); // Payments Route::prefix('payments')->group(function () { Route::get('/', [PaymentController::class, 'index']); Route::post('/', [PaymentController::class, 'store']); Route::get('{id}', [PaymentController::class, 'show']); Route::put('{id}', [PaymentController::class, 'update']); Route::delete('{id}', [PaymentController::class, 'destroy']); }); // VPS Route::prefix('vps')->group(function () { Route::get('/', [VPSController::class, 'index']); Route::get('{id}', [VPSController::class, 'show']); Route::put('{id}', [VPSController::class, 'update']); Route::post('{id}/power-on', [VPSController::class, 'powerOn']); Route::post('{id}/power-off', [VPSController::class, 'powerOff']); Route::post('{id}/restart', [VPSController::class, 'restart']); Route::get('{id}/console-ticket', [VPSController::class, 'getConsoleTicket']); }); // vCenter Route::prefix('vcenter')->group(function () { Route::get('tree', [VCenterController::class, 'tree']); Route::get('console-ticket', [VCenterController::class, 'consoleTicket']); Route::post('/', [VCenterController::class, 'store']); Route::post('sync', [VCenterController::class, 'sync']); Route::put('node/{type}/{id}', [VCenterController::class, 'updateNode']); Route::delete('node/{type}/{id}', [VCenterController::class, 'destroyNode']); }); // vCenter Manager Power Operations Route::prefix('vcenter-manager')->group(function () { Route::post('vm/power-on', [App\Http\Controllers\admin\VCenterManagerController::class, 'powerOn']); Route::post('vm/power-off', [App\Http\Controllers\admin\VCenterManagerController::class, 'powerOff']); Route::get('vms/powered-off', [App\Http\Controllers\admin\VCenterManagerController::class, 'getPoweredOffVms']); }); }); }); Route::prefix('system')->middleware(['api.auth'])->group(function () { Route::post('get-all-image', function (Media $media) { $files = $media->getAllMedia(); return response()->json(['data' => $files]); })->name('api.GetAllImage'); Route::get('get-ticket-console', function (Request $request, ServiceVCenter $serviceVCenter) { $product_id = $request->get('product'); if (!$product_id) { return response()->json(['error' => true, 'message' => "Please choose product"]); } $product = ModuleVmware::with('ipAddress.host.datacenter.vCenter')->find($product_id); if (!$product) { return response()->json(['error' => true, 'message' => "Can't find product"]); } $vcenter = null; if ($product->ipAddress && $product->ipAddress->host && $product->ipAddress->host->datacenter && $product->ipAddress->host->datacenter->vCenter) { $vcenter = $product->ipAddress->host->datacenter->vCenter; } if (!$vcenter) { return response()->json(['error' => true, 'message' => "Can't find vCenter information"]); } // Đăng nhập vCenter trước khi lấy ticket if (!$serviceVCenter->loginServer($vcenter)) { return response()->json([ 'error' => true, 'message' => 'Không thể đăng nhập vào vCenter' ]); } $ConsoleTicket = $serviceVCenter->GetConsoleTickets($product->vmware_id); // Nếu login hết hạn, thử login lại 1 lần nữa if ($ConsoleTicket === 'Login_Again') { if ($serviceVCenter->loginServer($vcenter)) { $ConsoleTicket = $serviceVCenter->GetConsoleTickets($product->vmware_id); } else { return response()->json([ 'error' => true, 'message' => 'Không thể đăng nhập lại vào vCenter' ]); } } // Nếu vẫn lỗi, trả về lỗi rõ ràng if (is_string($ConsoleTicket)) { return response()->json([ 'error' => true, 'message' => "Failed to get console ticket: $ConsoleTicket" ]); } if ($ConsoleTicket['error']) { return response()->json([ 'error' => true, 'message' => $ConsoleTicket['data'] ]); } return response()->json([ 'error' => false, 'data' => $ConsoleTicket['data'], 'host' => $vcenter->host, 'vmware-api-session-id' => $serviceVCenter->token ])->cookie('vmware-api-session-id', $serviceVCenter->token, 60, '/', null, false, false); })->name('api.GetConsoleTicket'); }); }); Route::any('{any}', function () { return response()->json([ 'error' => true, 'message' => 'API Route not found' ], 404); })->where('any', '.*');