Files
portal-api/routes/api.php
T

224 lines
11 KiB
PHP

<?php
use App\Http\Controllers\Api\Admin\Auth\AuthController;
use App\Http\Controllers\Api\Admin\Customer\CustomerController;
use App\Http\Controllers\Api\Admin\Invoice\InvoiceController;
use App\Http\Controllers\Api\Admin\Order\OrderController;
use App\Http\Controllers\Api\Admin\Payment\PaymentController;
use App\Http\Controllers\Api\Admin\Product\ProductCategoryController;
use App\Http\Controllers\Api\Admin\Product\ProductController;
use App\Http\Controllers\Api\Admin\VPS\VPSController;
use App\Http\Controllers\Api\Admin\VCenter\VCenterController;
use App\Http\Services\Media;
use App\Http\Services\vCenter as ServiceVCenter;
use App\Models\ModuleVmware;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::prefix('v1')
/* Api for Admin */
->group(function () {
Route::prefix('administrator')->group(function () {
Route::post('login', [AuthController::class, 'login']);
Route::middleware('api.auth:admins-api')->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', '.*');