Files
portal-api/routes/api.php
T
2026-09-10 16:32:48 +07:00

852 lines
52 KiB
PHP

<?php
use App\Http\Controllers\admin\VCenterManagerController;
use App\Http\Controllers\Api\Admin\Auth\AuthController;
use App\Http\Controllers\Api\Admin\Setting\SettingController as AdminSettingController;
use App\Http\Controllers\Api\Admin\Domain\AdminDomainOrderController;
use App\Http\Controllers\Api\Admin\Domain\AdminDomainPricingController;
use App\Http\Controllers\Api\Admin\Domain\InetDomainController;
use App\Http\Controllers\Api\QueueMonitorController;
use App\Http\Controllers\Api\Admin\Staff\StaffOnlineController;
use App\Http\Controllers\Api\Admin\Customer\CustomerController;
use App\Http\Controllers\Api\Admin\Employee\EmployeeController;
use App\Http\Controllers\Api\Admin\Role\RolePermissionController;
use App\Http\Controllers\Api\Admin\Invoice\InvoiceController;
use App\Http\Controllers\Api\Admin\Report\ExportController;
use App\Http\Controllers\Api\Admin\Order\OrderController;
use App\Http\Controllers\Api\Admin\Payment\PaymentController;
use App\Http\Controllers\Api\Admin\Addon\AddonController;
use App\Http\Controllers\Api\Admin\WebDesign\WebDesignQuoteController;
use App\Http\Controllers\Api\Admin\Product\ProductCategoryController;
use App\Http\Controllers\Api\Admin\Product\ProductTypeFieldController;
use App\Http\Controllers\Api\Admin\Product\ProductController;
use App\Http\Controllers\Api\Admin\Service\ServiceController;
use App\Http\Controllers\Api\Admin\VPS\VPSController;
use App\Http\Controllers\Api\Admin\VCenter\VCenterController;
use App\Http\Controllers\Api\Admin\DnsManager\ServerController as DnsServerController;
use App\Http\Controllers\Api\Admin\DnsManager\DomainController as DnsDomainController;
use App\Http\Controllers\Api\Admin\DnsManager\RecordController as DnsRecordController;
use App\Http\Controllers\Api\Admin\Hosting\HostingAccountController;
use App\Http\Controllers\Api\Admin\OsManager\OsGroupController;
use App\Http\Controllers\Api\Admin\OsManager\OsController;
use App\Http\Controllers\Api\Admin\Hosting\ServicePlanController;
use App\Http\Controllers\Api\Admin\IpPool\IpPoolController;
use App\Http\Controllers\Api\Admin\Bank\BankController;
use App\Http\Controllers\Api\Admin\EmailTemplate\EmailTemplateController;
use App\Http\Controllers\Api\Admin\EmailNotificationTemplateController;
use App\Http\Controllers\Api\Admin\ActivityLog\ActivityLogController;
use App\Http\Controllers\Api\Admin\Rebuild\AdminReinstallLogController;
use App\Http\Controllers\Api\Admin\EmailLog\EmailLogController;
use App\Http\Controllers\Api\Admin\MailCampaign\MailCampaignController;
use App\Http\Controllers\Api\Admin\Transaction\AdminTransactionController;
use App\Http\Controllers\Api\Admin\Ticket\TicketController as AdminTicketController;
use App\Http\Controllers\Api\Admin\Docs\PostCategoryController as AdminPostCategoryController;
use App\Http\Controllers\Api\Admin\Docs\PostController as AdminPostController;
use App\Http\Controllers\Api\Admin\Media\MediaController as AdminMediaController;
use App\Http\Controllers\Api\NotificationController;
use App\Http\Controllers\Api\Admin\InfraManagement\InfraManagementController;
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'])->middleware('throttle:5,1');
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']);
Route::put('profile', [AuthController::class, 'updateProfile']);
// Role Permissions
Route::prefix('role-permissions')->group(function () {
// Accessible bởi mọi admin — trả về permissions hiệu lực của user hiện tại
Route::get('mine', [RolePermissionController::class, 'mine']);
// Các endpoint sau chỉ dành cho Full Administrator (kiểm tra trong controller)
Route::get('/', [RolePermissionController::class, 'index']);
Route::post('/', [RolePermissionController::class, 'store']);
Route::get('all-permissions', [RolePermissionController::class, 'allPermissions']);
Route::post('permissions', [RolePermissionController::class, 'createPermissionGroup']);
Route::delete('permissions/group/{module}', [
RolePermissionController::class,
'deletePermissionGroup',
]);
Route::patch('permissions/{id}', [RolePermissionController::class, 'renamePermission']);
Route::put('{roleId}', [RolePermissionController::class, 'update']);
});
// Employees (module: administrator)
Route::prefix('employees')->group(function () {
Route::get('roles', [EmployeeController::class, 'roles'])->middleware('perm:administrator.view');
Route::get('/', [EmployeeController::class, 'index'])->middleware('perm:administrator.view');
Route::post('/', [EmployeeController::class, 'store'])->middleware('perm:administrator.create');
Route::get('{id}', [EmployeeController::class, 'show'])->middleware('perm:administrator.view');
Route::put('{id}', [EmployeeController::class, 'update'])->middleware('perm:administrator.edit');
Route::delete('{id}', [EmployeeController::class, 'destroy'])->middleware(
'perm:administrator.destroy',
);
});
// Customers (module: customer)
Route::prefix('customers')
->controller(CustomerController::class)
->group(function () {
Route::get('trash', 'trash')->middleware('perm:customer.view');
Route::get('vps/available', 'listAvailableVms')->middleware('perm:customer.view');
Route::get('/', 'index')->middleware('perm:customer.view');
Route::post('/', 'store')->middleware('perm:customer.create');
Route::get('{uuid}', 'show')->middleware('perm:customer.view');
Route::put('{uuid}', 'update')->middleware('perm:customer.edit');
Route::delete('{uuid}', 'destroy')->middleware('perm:customer.destroy');
Route::delete('{uuid}/destroy', 'destroy')->middleware('perm:customer.destroy');
Route::post('{uuid}/reset-password', 'resetPassword')->middleware('perm:customer.edit');
Route::post('{uuid}/send-password', 'sendPasswordEmail')->middleware('perm:customer.edit');
Route::post('{uuid}/send-email', 'sendEmail')->middleware('perm:customer.edit');
Route::post('{uuid}/login-as', 'loginAs')->middleware('perm:customer.edit');
Route::post('{uuid}/add-credit', 'addCredit')->middleware('perm:customer.edit');
Route::post('{uuid}/add-total', 'addTotal')->middleware('perm:customer.edit');
Route::get('{uuid}/services', 'getServices')->middleware('perm:customer.view');
Route::post('{uuid}/services', 'createService')->middleware('perm:customer.edit');
Route::post('{uuid}/services/bulk-delete', 'bulkDeleteServices')->middleware(
'perm:customer.edit',
);
Route::put('{uuid}/services/{serviceId}', 'updateService')->middleware('perm:customer.edit');
Route::post('{uuid}/services/{serviceId}/change-ip', 'changeServiceIp')->middleware('perm:customer.edit');
Route::post('{uuid}/services/{serviceId}/change-port', 'changeServicePort')->middleware('perm:customer.edit');
Route::post('{uuid}/services/{serviceId}/notify-renew', 'notifyServiceRenewal')->middleware('perm:customer.edit');
Route::get('{uuid}/notes', 'getCustomerNotes')->middleware('perm:customer.view');
Route::post('{uuid}/notes', 'storeCustomerNote')->middleware('perm:customer.edit');
Route::delete('{uuid}/notes/{noteId}', 'destroyCustomerNote')->middleware('perm:customer.edit');
Route::get('{uuid}/services/{serviceId}/notes', 'getServiceNotes')->middleware('perm:customer.view');
Route::post('{uuid}/services/{serviceId}/notes', 'storeServiceNote')->middleware('perm:customer.edit');
Route::delete('{uuid}/services/{serviceId}/notes/{noteId}', 'destroyServiceNote')->middleware(
'perm:customer.edit',
);
Route::get('{uuid}/orders', 'getOrders')->middleware('perm:customer.view');
Route::put('{uuid}/orders/{orderId}', 'updateOrder')->middleware('perm:customer.edit');
Route::get('{uuid}/invoices', 'getInvoices')->middleware('perm:customer.view');
Route::put('{uuid}/invoices/{invoiceId}', 'updateInvoice')->middleware(
'perm:customer.edit',
);
Route::get('{uuid}/transactions', 'getTransactions')->middleware('perm:customer.view');
Route::put('{uuid}/transactions/{transactionId}', 'updateTransaction')->middleware(
'perm:customer.edit',
);
Route::get('{uuid}/domains', 'getDomains')->middleware('perm:customer.view');
Route::get('{uuid}/dns-domains', 'getDnsDomains')->middleware('perm:customer.view');
Route::get('{uuid}/dns-domains/{domainId}/records', 'getDnsDomainRecords')->middleware(
'perm:customer.view',
);
Route::patch('{uuid}/status', 'updateStatus')->middleware('perm:customer.edit');
Route::post('bulk-delete', 'bulkDelete')->middleware('perm:customer.destroy');
Route::post('bulk-restore', 'bulkRestore')->middleware('perm:customer.edit');
Route::post('bulk-force-delete', 'bulkForceDelete')->middleware('perm:customer.destroy');
Route::post('bulk-status', 'bulkStatus')->middleware('perm:customer.edit');
Route::post('{uuid}/restore', 'restore')->middleware('perm:customer.edit');
Route::delete('{uuid}/force', 'forceDelete')->middleware('perm:customer.destroy');
});
// Services (module: customer)
Route::prefix('services')->controller(ServiceController::class)->group(function () {
Route::get('/', 'index')->middleware('perm:customer.view');
Route::get('{id}', 'show')->middleware('perm:customer.view');
Route::patch('{id}/detach-customer', 'detachCustomer')->middleware('perm:customer.edit');
Route::post('{id}/resend-credentials', 'resendCredentials')->middleware('perm:customer.edit');
});
// Products (module: product-service)
Route::prefix('products')
->controller(ProductController::class)
->group(function () {
Route::get('export', 'export')->middleware('perm:product-service.manager');
Route::get('/', 'index')->middleware('perm:product-service.view');
Route::post('/', 'store')->middleware('perm:product-service.create');
Route::post('import', 'import')->middleware('perm:product-service.create');
Route::post('bulk-update-status', 'bulkUpdateStatus')->middleware('perm:product-service.edit');
Route::post('bulk-destroy', 'bulkDestroy')->middleware('perm:product-service.destroy');
Route::controller(ProductController::class)->group(function () {
Route::get('os', 'getOsList')->middleware('perm:product-service.view');
Route::get('{id}', 'show')->middleware('perm:product-service.view');
Route::get('{id}/os', 'getOs')->middleware('perm:product-service.view');
Route::get('{id}/operating-systems', 'getOperatingSystems')->middleware(
'perm:product-service.view',
);
Route::put('{id}', 'update')->middleware('perm:product-service.edit');
Route::delete('{id}', 'destroy')->middleware('perm:product-service.destroy');
Route::post('{id}/duplicate', 'duplicate')->middleware('perm:product-service.create');
});
});
Route::prefix('product-categories')
->controller(ProductCategoryController::class)
->as('product-categories.')
->group(function () {
Route::get('/', 'index')->middleware('perm:product-service.view')->name('index');
Route::post('/', 'store')->middleware('perm:product-service.create')->name('store');
Route::get('trashed', 'trashed')->middleware('perm:product-service.view')->name('trashed');
Route::post('bulk-update-status', 'bulkUpdateStatus')
->middleware('perm:product-service.edit')
->name('bulk-update-status');
Route::post('bulk-destroy', 'bulkDestroy')
->middleware('perm:product-service.destroy')
->name('bulk-destroy');
Route::post('bulk-restore', 'bulkRestore')
->middleware('perm:product-service.edit')
->name('bulk-restore');
Route::post('bulk-force-delete', 'bulkForceDelete')
->middleware('perm:product-service.destroy')
->name('bulk-force-delete');
Route::get('{id}', 'show')->middleware('perm:product-service.view')->name('show');
Route::put('{id}', 'update')->middleware('perm:product-service.edit')->name('update');
Route::delete('{id}', 'destroy')->middleware('perm:product-service.destroy')->name('destroy');
Route::post('{id}/restore', 'restore')
->middleware('perm:product-service.edit')
->name('restore');
Route::delete('{id}/force', 'forceDelete')
->middleware('perm:product-service.destroy')
->name('force-delete');
});
Route::prefix('product-type-fields')
->controller(ProductTypeFieldController::class)
->group(function () {
Route::get('/', 'index')->middleware('perm:product-service.view');
Route::post('/', 'store')->middleware('perm:product-service.create');
Route::put('{id}', 'update')->middleware('perm:product-service.edit');
Route::delete('{id}', 'destroy')->middleware('perm:product-service.destroy');
});
// Addons (module: product-service)
Route::prefix('addons')
->controller(AddonController::class)
->group(function () {
Route::get('/', 'index')->middleware('perm:product-service.view');
Route::post('/', 'store')->middleware('perm:product-service.create');
Route::post('bulk-update-status', 'bulkUpdateStatus')->middleware('perm:product-service.edit');
Route::post('bulk-destroy', 'bulkDestroy')->middleware('perm:product-service.destroy');
Route::get('{id}', 'show')->middleware('perm:product-service.view');
Route::put('{id}', 'update')->middleware('perm:product-service.edit');
Route::delete('{id}', 'destroy')->middleware('perm:product-service.destroy');
});
// Báo giá thiết kế website (module: order)
Route::prefix('web-design-quotes')
->controller(WebDesignQuoteController::class)
->group(function () {
Route::get('platform-options', 'platformOptions')->middleware('perm:order.view');
Route::get('/', 'index')->middleware('perm:order.view');
Route::post('/', 'store')->middleware('perm:order.create');
Route::get('{id}', 'show')->middleware('perm:order.view');
Route::put('{id}', 'update')->middleware('perm:order.edit');
Route::patch('{id}/status', 'updateStatus')->middleware('perm:order.edit');
Route::get('{id}/pdf', 'downloadPdf')->middleware('perm:order.view');
Route::delete('{id}', 'destroy')->middleware('perm:order.destroy');
});
Route::prefix('post-categories')
->controller(AdminPostCategoryController::class)
->as('post-categories.')
->group(function () {
Route::get('/', 'index')->name('index');
Route::post('/', 'store')->name('store');
Route::get('trashed', 'trashed')->name('trashed');
Route::post('bulk-restore', 'bulkRestore')->name('bulk-restore');
Route::post('bulk-force-delete', 'bulkForceDelete')->name('bulk-force-delete');
Route::post('{id}/restore', 'restore')->name('restore');
Route::delete('{id}/force-delete', 'forceDelete')->name('force-delete');
Route::get('{id}', 'show')->name('show');
Route::put('{id}', 'update')->name('update');
Route::delete('{id}', 'destroy')->name('destroy');
});
Route::prefix('posts')
->controller(AdminPostController::class)
->as('posts.')
->group(function () {
Route::get('/', 'index')->name('index');
Route::post('/', 'store')->name('store');
Route::post('sync-wordpress', 'syncWordpress')->name('sync-wordpress');
Route::post('bulk-delete', 'bulkDelete')->name('bulk-delete');
Route::post('bulk-update-status', 'bulkUpdateStatus')->name('bulk-update-status');
Route::get('trashed', 'trashed')->name('trashed');
Route::post('bulk-restore', 'bulkRestore')->name('bulk-restore');
Route::post('bulk-force-delete', 'bulkForceDelete')->name('bulk-force-delete');
Route::post('{id}/restore', 'restore')->name('restore');
Route::delete('{id}/force-delete', 'forceDelete')->name('force-delete');
Route::get('{id}', 'show')->name('show');
Route::put('{id}', 'update')->name('update');
Route::delete('{id}', 'destroy')->name('destroy');
});
// Orders (module: order)
Route::prefix('orders')
->controller(OrderController::class)
->group(function () {
Route::get('/', 'index')->middleware('perm:order.view');
Route::post('/upload-proof', 'uploadProof')->middleware('perm:order.create');
Route::post('/', 'store')->middleware('perm:order.create');
Route::get('{id}', 'show')->middleware('perm:order.view');
Route::put('{id}', 'update')->middleware('perm:order.edit');
Route::delete('{id}', 'destroy')->middleware('perm:order.destroy');
Route::post('{id}/accept', 'accept')->middleware('perm:order.edit');
Route::post('{id}/cancel', 'cancel')->middleware('perm:order.edit');
});
// Invoices (module: invoice)
Route::prefix('invoices')
->controller(InvoiceController::class)
->group(function () {
Route::get('/', 'index')->middleware('perm:invoice.view');
Route::get('/datatable', 'datatable')->middleware('perm:invoice.view');
Route::post('/', 'store')->middleware('perm:invoice.create');
Route::get('{id}', 'show')->middleware('perm:invoice.view');
Route::put('{id}', 'update')->middleware('perm:invoice.edit');
Route::delete('{id}', 'destroy')->middleware('perm:invoice.destroy');
Route::post('{id}/paid', 'markAsPaid')->middleware('perm:invoice.edit');
Route::post('{id}/cancel', 'cancel')->middleware('perm:invoice.edit');
// Attachments
Route::get('{id}/attachments', 'listAttachments')->middleware('perm:invoice.view');
Route::post('{id}/attachments', 'uploadAttachment')->middleware('perm:invoice.edit');
Route::delete('{id}/attachments/{attachmentId}', 'deleteAttachment')->middleware(
'perm:invoice.edit',
);
// Send mail notification
Route::post('{id}/send-mail', 'sendMail')->middleware('perm:invoice.edit');
});
// Reports / Data exports
Route::prefix('reports/export')
->controller(ExportController::class)
->middleware('perm:report.view')
->group(function () {
Route::get('history', 'history');
Route::post('preview', 'preview');
Route::post('/', 'store');
Route::get('{uuid}', 'show');
Route::get('{uuid}/download', 'download');
});
// Payments (module: payment)
Route::prefix('payments')
->controller(PaymentController::class)
->group(function () {
Route::get('for-select', 'forSelect');
Route::get('/', 'index')->middleware('perm:payment.view');
Route::post('/', 'store')->middleware('perm:payment.create');
Route::get('{id}', 'show')->middleware('perm:payment.view');
Route::put('{id}', 'update')->middleware('perm:payment.edit');
Route::delete('{id}', 'destroy')->middleware('perm:payment.destroy');
});
// OS Groups & OS Entries (module: module-vcenter)
Route::prefix('os-groups')
->controller(OsGroupController::class)
->as('os-groups.')
->group(function () {
Route::get('/', 'index')->middleware('perm:module-vcenter.manager')->name('index');
Route::post('/', 'store')->middleware('perm:module-vcenter.manager')->name('store');
Route::get('{id}', 'show')->middleware('perm:module-vcenter.manager')->name('show');
Route::put('{id}', 'update')->middleware('perm:module-vcenter.manager')->name('update');
Route::delete('{id}', 'destroy')->middleware('perm:module-vcenter.manager')->name('destroy');
});
Route::prefix('os')
->controller(OsController::class)
->as('os.')
->group(function () {
Route::post('/', 'store')->middleware('perm:module-vcenter.manager')->name('store');
Route::put('{id}', 'update')->middleware('perm:module-vcenter.manager')->name('update');
Route::delete('{id}', 'destroy')->middleware('perm:module-vcenter.manager')->name('destroy');
});
// VPS (module: module-vcenter)
Route::prefix('vps')
->controller(VPSController::class)
->group(function () {
Route::get('/', 'index')->middleware('perm:module-vcenter.view');
Route::get('{id}', 'show')->middleware('perm:module-vcenter.view');
Route::put('{id}', 'update')->middleware('perm:module-vcenter.edit');
Route::post('{id}/power-on', 'powerOn')->middleware('perm:module-vcenter.edit');
Route::post('{id}/power-off', 'powerOff')->middleware('perm:module-vcenter.edit');
Route::post('{id}/restart', 'restart')->middleware('perm:module-vcenter.edit');
Route::get('{id}/console-ticket', 'getConsoleTicket')->middleware('perm:module-vcenter.view');
});
// vCenter (module: module-vcenter)
Route::prefix('vcenter')
->controller(VCenterController::class)
->group(function () {
Route::get('tree', 'tree')->middleware('perm:module-vcenter.view');
Route::get('console-ticket', 'consoleTicket')->middleware('perm:module-vcenter.view');
Route::post('/', 'store')->middleware('perm:module-vcenter.create');
Route::post('sync', 'sync')->middleware('perm:module-vcenter.edit');
Route::post('node/{type}', 'storeNode')->middleware('perm:module-vcenter.create');
Route::put('node/{type}/{id}', 'updateNode')->middleware('perm:module-vcenter.edit');
Route::delete('node/{type}/{id}', 'destroyNode')->middleware('perm:module-vcenter.destroy');
});
// DNS Manager — Domains (module: domain.manager)
Route::prefix('domains')
->controller(DnsDomainController::class)
->group(function () {
Route::get('/', 'index')->middleware('perm:domain.manager');
Route::post('/', 'store')->middleware('perm:domain.manager');
Route::post('sync-dns', 'syncDns')->middleware('perm:domain.manager');
Route::get('{id}', 'show')->middleware('perm:domain.manager');
Route::put('{id}', 'update')->middleware('perm:domain.manager');
Route::delete('{id}', 'destroy')->middleware('perm:domain.manager');
// DNS Records
Route::get('{id}/dns', 'dnsIndex')->middleware('perm:domain.manager');
Route::post('{id}/dns', 'dnsStore')->middleware('perm:domain.manager');
Route::put('{id}/dns/{recordId}', 'dnsUpdate')->middleware('perm:domain.manager');
Route::delete('{id}/dns/{recordId}', 'dnsDestroy')->middleware('perm:domain.manager');
});
// DNS Manager — Servers (module: domain.manager)
Route::prefix('dns-servers')
->controller(DnsServerController::class)
->group(function () {
Route::get('/', 'index')->middleware('perm:domain.manager');
Route::post('/', 'store')->middleware('perm:domain.manager');
Route::get('{id}', 'show')->middleware('perm:domain.manager');
Route::post('{id}/check-connection', 'checkConnection')->middleware('perm:domain.manager');
Route::put('{id}', 'update')->middleware('perm:domain.manager');
Route::delete('{id}', 'destroy')->middleware('perm:domain.manager');
});
Route::prefix('dns-records')
->controller(DnsRecordController::class)
->group(function () {
Route::get('/', 'index')->middleware('perm:domain.manager');
Route::get('{id}', 'show')->middleware('perm:domain.manager');
Route::put('{id}', 'update')->middleware('perm:domain.manager');
});
// Hosting Manager (module: hosting)
Route::prefix('hosting-accounts')
->controller(HostingAccountController::class)
->group(function () {
Route::get('/', 'index')->middleware('perm:hosting.view');
Route::get('{id}', 'show')->middleware('perm:hosting.view');
Route::post('/', 'store')->middleware('perm:hosting.create');
Route::put('{id}', 'update')->middleware('perm:hosting.edit');
Route::delete('{id}', 'destroy')->middleware('perm:hosting.destroy');
Route::post('{id}/suspend', 'suspend')->middleware('perm:hosting.edit');
Route::post('{id}/unsuspend', 'unsuspend')->middleware('perm:hosting.edit');
Route::post('{id}/reset-ftp-password', 'resetFtpPassword')->middleware('perm:hosting.edit');
});
// Service Plans — hosting package configs (module: hosting)
Route::prefix('service-plans')
->controller(ServicePlanController::class)
->as('service-plans.')
->group(function () {
Route::get('/', 'index')->middleware('perm:hosting.view')->name('index');
Route::post('/', 'store')->middleware('perm:hosting.create')->name('store');
Route::get('{id}', 'show')->middleware('perm:hosting.view')->name('show');
Route::put('{id}', 'update')->middleware('perm:hosting.edit')->name('update');
Route::delete('{id}', 'destroy')->middleware('perm:hosting.destroy')->name('destroy');
});
// InfraManagement (jumphost, vcenter config)
Route::prefix('infra-management')
->controller(InfraManagementController::class)
->group(function () {
Route::get('/', 'index')->middleware('perm:module-vcenter.manager');
Route::post('/', 'store')->middleware('perm:module-vcenter.manager');
Route::get('{id}', 'show')->middleware('perm:module-vcenter.manager');
Route::put('{id}', 'update')->middleware('perm:module-vcenter.manager');
Route::delete('{id}', 'destroy')->middleware('perm:module-vcenter.manager');
});
// Domain Orders (module: order)
Route::prefix('domain-orders')
->controller(AdminDomainOrderController::class)
->group(function () {
Route::get('pending-count', 'pendingCount')->middleware('perm:order.view');
Route::get('/', 'index')->middleware('perm:order.view');
Route::get('{id}', 'show')->middleware('perm:order.view');
Route::post('{id}/confirm-registration', 'confirmRegistration')->middleware('perm:order.edit');
Route::patch('{id}/kyc', 'updateKyc')->middleware('perm:order.edit');
Route::patch('{id}/activate', 'activate')->middleware('perm:order.edit');
Route::post('{id}/reject-and-refund', 'rejectAndRefund')->middleware('perm:order.edit');
Route::get('{id}/registrant', 'getRegistrant')->middleware('perm:order.view');
Route::patch('{id}/registrant', 'updateRegistrant')->middleware('perm:order.edit');
Route::get('{id}/registrant/docx', 'downloadRegistrantDocx')->middleware('perm:order.view');
});
// Domain Pricing (module: settings)
Route::prefix('domain-pricing')
->controller(AdminDomainPricingController::class)
->middleware('perm:setting.manager')
->group(function () {
Route::get('/', 'index');
Route::put('/', 'update');
Route::post('/reset', 'reset');
});
// Domain Tools — proxy tới iNET API (module: domain.manager)
Route::prefix('domain-tools')
->controller(InetDomainController::class)
->group(function () {
Route::get('whois/{domain}', 'whois')->middleware('perm:domain.manager');
Route::get('check-available', 'checkAvailable')->middleware('perm:domain.manager');
Route::post('bulk-check-available', 'bulkCheckAvailable')->middleware('perm:domain.manager');
Route::post('ai-suggest', 'aiSuggest')->middleware('perm:domain.manager');
Route::get('suffixes', 'suffixes')->middleware('perm:domain.manager');
});
// Settings (module: administrator)
Route::prefix('settings')
->controller(AdminSettingController::class)
->middleware('perm:setting.manager')
->group(function () {
Route::get('/', 'index');
Route::put('/', 'update');
Route::post('test-telegram', 'testTelegram');
});
Route::prefix('media')
->controller(AdminMediaController::class)
->group(function () {
Route::get('/', 'index');
Route::post('bulk-destroy', 'bulkDestroy');
Route::delete('{id}', 'destroy');
});
Route::post('media/upload', [AdminSettingController::class, 'uploadMedia']);
// Provider (active vCenter chain + provider settings — module: module-vcenter)
Route::prefix('provider')->group(function () {
Route::get('active-chain', [
\App\Http\Controllers\Api\Admin\Provider\ActiveInfraController::class,
'chain',
])->middleware('perm:module-vcenter.view');
Route::post('{type}/{id}/activate', [
\App\Http\Controllers\Api\Admin\Provider\ActiveInfraController::class,
'activate',
])
->whereIn('type', ['vcenter', 'datacenter', 'host', 'datastore', 'network'])
->middleware('perm:module-vcenter.edit');
Route::post('{type}/{id}/deactivate', [
\App\Http\Controllers\Api\Admin\Provider\ActiveInfraController::class,
'deactivate',
])
->whereIn('type', ['vcenter', 'datacenter', 'host', 'datastore', 'network'])
->middleware('perm:module-vcenter.edit');
Route::get('settings', [
\App\Http\Controllers\Api\Admin\Provider\ProviderSettingController::class,
'index',
])->middleware('perm:module-vcenter.view');
Route::put('settings', [
\App\Http\Controllers\Api\Admin\Provider\ProviderSettingController::class,
'update',
])->middleware('perm:module-vcenter.edit');
});
// Dashboard Stats
Route::prefix('dashboard')
->controller(\App\Http\Controllers\Api\Admin\Dashboard\DashboardController::class)
->group(function () {
Route::get('stats', 'stats');
Route::get('monthly-stats', 'monthlyStats');
Route::get('daily-stats', 'dailyStats');
Route::get('recent-orders', 'recentOrders');
Route::get('recent-deposits', 'recentDeposits');
Route::get('top-services', 'topServices');
Route::get('expiring-services', 'expiringServices');
Route::get('activities', 'activities');
Route::get('latest-customers', 'latestCustomers');
});
// Staff Online
Route::prefix('staff-online')
->controller(StaffOnlineController::class)
->group(function () {
Route::get('/', 'index');
Route::post('ping', 'ping');
});
// Queue Monitor (Horizon)
Route::prefix('queue')
->controller(QueueMonitorController::class)
->group(function () {
Route::get('jobs/recent', 'recent');
Route::get('jobs/pending', 'pending');
Route::get('jobs/failed', 'failed');
Route::post('jobs/failed/{id}/retry', 'retry');
Route::get('jobs/metrics', 'metrics');
});
// Banks — deposit bank accounts (module: settings)
Route::prefix('banks')
->controller(BankController::class)
->middleware('perm:setting.manager')
->group(function () {
Route::get('/', 'index');
Route::post('/', 'store');
Route::put('{id}', 'update');
Route::delete('{id}', 'destroy');
Route::post('{id}/restore', 'restore');
});
// Email Templates (module: settings)
Route::prefix('email-templates')
->controller(EmailTemplateController::class)
->middleware('perm:email-template.manager')
->group(function () {
Route::get('/', 'index');
Route::post('/', 'store');
Route::get('scenarios', 'scenarios');
Route::put('scenarios/{key}/label', 'updateScenarioLabel');
Route::get('email-settings', 'getEmailSettings');
Route::put('email-settings', 'updateEmailSettings');
Route::get('{id}', 'show');
Route::put('{id}', 'update');
Route::delete('{id}', 'destroy');
Route::get('{id}/preview-invoice', 'previewInvoiceJson');
Route::post('{id}/preview', 'preview');
Route::post('{id}/send-test', 'sendTest');
});
// Notification Email Templates — block-based editor
Route::prefix('notification-templates')
->controller(EmailNotificationTemplateController::class)
->middleware('perm:email-template.manager')
->group(function () {
Route::get('/', 'index');
Route::post('/', 'store');
Route::get('field-definitions', 'fieldDefinitions');
Route::get('{id}', 'show');
Route::put('{id}', 'update');
Route::delete('{id}', 'destroy');
Route::get('{id}/preview', 'preview');
});
// Transactions — manual deposit review (module: transaction)
Route::prefix('transactions')
->controller(AdminTransactionController::class)
->group(function () {
Route::get('/', 'index')->middleware('perm:customer.view');
Route::get('pending-count', 'pendingCount')->middleware('perm:customer.view');
Route::post('{uuid}/approve', 'approve')->middleware('perm:customer.edit');
Route::post('{uuid}/reject', 'reject')->middleware('perm:customer.edit');
});
// IP Pool (module: module-vcenter)
Route::prefix('ip-pool')
->controller(IpPoolController::class)
->group(function () {
Route::get('networks', 'networks')->middleware('perm:module-vcenter.view');
Route::get('used-services', 'usedServices')->middleware('perm:module-vcenter.view');
Route::get('/', 'index')->middleware('perm:module-vcenter.view');
Route::post('/', 'store')->middleware('perm:module-vcenter.manager');
Route::post('sync', 'sync')->middleware('perm:module-vcenter.manager');
Route::post('import', 'import')->middleware('perm:module-vcenter.manager');
Route::delete('bulk', 'bulkDelete')->middleware('perm:module-vcenter.manager');
Route::post('bulk-update-gateway', 'bulkUpdateGateway')->middleware('perm:module-vcenter.manager');
Route::get('{id}', 'show')->middleware('perm:module-vcenter.view');
Route::put('{id}', 'update')->middleware('perm:module-vcenter.manager');
Route::delete('{id}', 'destroy')->middleware('perm:module-vcenter.manager');
});
// vCenter Manager Power Operations (module: module-vcenter)
Route::prefix('vcenter-manager')
->controller(VCenterManagerController::class)
->group(function () {
Route::post('vm/power-on', 'powerOn')->middleware('perm:module-vcenter.edit');
Route::post('vm/power-off', 'powerOff')->middleware('perm:module-vcenter.edit');
Route::post('vm/restart', 'restart')->middleware('perm:module-vcenter.edit');
Route::post('vm/snapshot', 'snapshot')->middleware('perm:module-vcenter.edit');
Route::post('vm/suspend', 'suspend')->middleware('perm:module-vcenter.edit');
Route::post('vm/update-config', 'updateConfig')->middleware('perm:module-vcenter.edit');
Route::post('vm/delete', 'deleteVM')->middleware('perm:module-vcenter.edit');
Route::get('vm/stats', 'stats')->middleware('perm:module-vcenter.view');
Route::get('vm/power-state', 'powerState')->middleware('perm:module-vcenter.view');
Route::get('vms/powered-off', 'getPoweredOffVms')->middleware('perm:module-vcenter.view');
});
// Tickets (support tickets)
Route::prefix('tickets')
->controller(AdminTicketController::class)
->group(function () {
Route::get('/', 'index')->middleware('perm:support.view');
Route::get('{ticket_num}', 'show')->middleware('perm:support.view');
Route::patch('{ticket_num}/status', 'updateStatus')->middleware('perm:support.edit');
Route::post('{ticket_num}/reply', 'reply')->middleware('perm:support.edit');
});
Route::prefix('notifications')
->controller(NotificationController::class)
->group(function () {
Route::get('/', fn() => app(NotificationController::class)->index(request(), 'admin'));
Route::get(
'{id}',
fn($id) => app(NotificationController::class)->show(request(), 'admin', (int) $id),
)->whereNumber('id');
Route::patch(
'{id}/read',
fn($id) => app(NotificationController::class)->markRead(request(), 'admin', (int) $id),
);
Route::patch(
'read-all',
fn() => app(NotificationController::class)->markAllRead(request(), 'admin'),
);
});
// Activity Logs
Route::prefix('activity-logs')
->controller(ActivityLogController::class)
->middleware('perm:system-log.manager')
->group(function () {
Route::get('/', 'index');
Route::get('modules', 'modules');
Route::get('stats', 'stats');
Route::get('{id}', 'show');
});
// Email Logs
Route::prefix('email-logs')
->controller(EmailLogController::class)
->middleware('perm:system-log.manager')
->group(function () {
Route::get('/', 'index');
Route::get('{id}', 'show')->whereNumber('id');
});
// Mail Campaigns (module: mail-campaign)
Route::prefix('mail-campaigns')
->controller(MailCampaignController::class)
->group(function () {
Route::get('/', 'index')->middleware('perm:mail-campaign.view');
Route::post('preview', 'preview')->middleware('perm:mail-campaign.create');
Route::get('{uuid}/preview', 'previewCampaign')->middleware('perm:mail-campaign.view');
Route::get('{uuid}', 'show')->middleware('perm:mail-campaign.view');
Route::post('/', 'store')->middleware('perm:mail-campaign.create');
});
// VM Rebuild Logs — who rebuilt, which OS, post-rebuild password
Route::prefix('rebuild-logs')
->controller(AdminReinstallLogController::class)
->group(function () {
Route::get('/', 'index')->middleware('perm:vps.view');
Route::get('stats', 'stats')->middleware('perm:vps.view');
Route::get('{id}', 'show')->middleware('perm:vps.view')->whereNumber('id');
});
});
});
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'],
'vmware-api-session-id' => $serviceVCenter->token,
])
->cookie('vmware-api-session-id', $serviceVCenter->token, 60, '/', null, false, false);
})->name('api.GetConsoleTicket');
});
Route::get('pdf-invoice', function () {
// return Pdf::loadView('pdf.invoice-pdf')->setPaper('a4', 'portrait')->stream('hoa-don-mau.pdf');
});
});
Route::any('{any}', function () {
return response()->json(
[
'error' => true,
'message' => 'API Route not found',
],
404,
);
})->where('any', '.*');