diff --git a/app/Http/Controllers/admin/ModuleIPPoolController.php b/app/Http/Controllers/admin/ModuleIPPoolController.php new file mode 100644 index 0000000..dd57638 --- /dev/null +++ b/app/Http/Controllers/admin/ModuleIPPoolController.php @@ -0,0 +1,65 @@ +ipPoolRepository->filter( + [ + 'page' => $request->get('page') ?? 1 + ] + ); + $title = 'List all server ip pool'; + return view('admin.module.ippool.index', compact('modules', 'title')); + } + + public function create() + { + $title = 'Add new server ip pool'; + return view('admin.module.ippool.add', compact('title')); + } + + public function store(Request $request) + { + $data = $request->all(); + $ipAddresses = explode(',', $data['ip_address']); + $moduleNetworkId = $data['module_network_id']; + + foreach ($ipAddresses as $ip) { + $this->ipPoolRepository->create([ + 'ip_address' => trim($ip), + 'module_network_id' => $moduleNetworkId, + ]); + } + + return redirect()->route('module.ippool.index')->with('success', 'Add new server ip pool success'); + } + + public function edit(int $id = 0) + { + $module = $this->ipPoolRepository->find($id); + $title = 'Edit server ip pool'; + return view('admin.module.ippool.edit', compact('module', 'title')); + } + + public function update(Request $request, int $id = 0) + { + $this->ipPoolRepository->update($id, $request->all()); + } + + public function destroy(int $id = 0) + { + $this->ipPoolRepository->delete($id); + return redirect()->route('module.ippool.index')->with('success', 'Delete server ip pool success'); + } +} diff --git a/app/Http/Controllers/frontend/ServiceController.php b/app/Http/Controllers/frontend/ServiceController.php index 9f512e3..a714a16 100644 --- a/app/Http/Controllers/frontend/ServiceController.php +++ b/app/Http/Controllers/frontend/ServiceController.php @@ -756,7 +756,7 @@ class ServiceController extends Controller ], 422); } - $productId = htmlspecialchars(strip_tags(trim($request->product_id)), ENT_QUOTES, 'UTF-8'); + $productId = $request->product_id; $userId = $user->id; $product = ModuleVmware::where('vmware_id', $productId) diff --git a/app/Jobs/VirtualMachine/ProcessOrderPaymentJob.php b/app/Jobs/VirtualMachine/ProcessOrderPaymentJob.php index b46526e..382c6b7 100644 --- a/app/Jobs/VirtualMachine/ProcessOrderPaymentJob.php +++ b/app/Jobs/VirtualMachine/ProcessOrderPaymentJob.php @@ -117,14 +117,6 @@ class ProcessOrderPaymentJob implements ShouldQueue $successfulVMs = array_filter($vmCreationResults, fn($vm) => $vm['success']); $failedVMs = array_filter($vmCreationResults, fn($vm) => !$vm['success']); - Log::info("Kết quả tạo VM cho đơn hàng #{$this->order->order_num}", [ - 'order_id' => $this->order->id, - 'total_vms' => count($vmCreationResults), - 'successful_vms' => count($successfulVMs), - 'failed_vms' => count($failedVMs), - 'vm_results' => $vmCreationResults - ]); - // Nếu tất cả VM được tạo thành công, tiến hành thanh toán if ($allVMsCreated && count($successfulVMs) > 0) { DB::beginTransaction(); @@ -142,13 +134,6 @@ class ProcessOrderPaymentJob implements ShouldQueue DB::commit(); - Log::info("Thanh toán thành công cho đơn hàng #{$this->order->order_num}", [ - 'order_id' => $this->order->id, - 'vm_results' => $vmCreationResults, - 'total_vms' => count($vmCreationResults), - 'successful_vms' => count($successfulVMs) - ]); - // Gửi thông báo thành công cho khách hàng $this->sendSuccessNotification($vmCreationResults); diff --git a/app/Models/IpPool.php b/app/Models/IpPool.php new file mode 100644 index 0000000..0bd1151 --- /dev/null +++ b/app/Models/IpPool.php @@ -0,0 +1,21 @@ +belongsTo(ModuleNetwork::class, 'module_network_id', 'id'); + } +} diff --git a/app/Providers/RepositoryProvider.php b/app/Providers/RepositoryProvider.php index f54bd66..03aba5d 100644 --- a/app/Providers/RepositoryProvider.php +++ b/app/Providers/RepositoryProvider.php @@ -38,6 +38,8 @@ use App\Repositories\Module\Datastore\DatastoreCachedRepository; use App\Repositories\Module\Datastore\DatastoreRepositoryInterface; use App\Repositories\Module\DnsServer\DnsServerCachedRepository; use App\Repositories\Module\DnsServer\DnsServerRepositoryInterface; +use App\Repositories\Module\IPPool\IPPoolCachedRepository; +use App\Repositories\Module\IPPool\IPPoolRepositoryInterface; use App\Repositories\Note\NoteCachedRepository; use App\Repositories\Note\NoteRepositoryInterface; use App\Repositories\Order\OrderCachedRepository; @@ -327,6 +329,12 @@ class RepositoryProvider extends ServiceProvider VPSRepositoryInterface::class, VPSCachedRepository::class ); + + //Module IP Pool + $this->app->bind( + IPPoolRepositoryInterface::class, + IPPoolCachedRepository::class + ); } /** diff --git a/app/Repositories/Module/IPPool/IPPoolCachedRepository.php b/app/Repositories/Module/IPPool/IPPoolCachedRepository.php new file mode 100644 index 0000000..0436152 --- /dev/null +++ b/app/Repositories/Module/IPPool/IPPoolCachedRepository.php @@ -0,0 +1,44 @@ +ipPoolRepository->getModel(); + } + public function filter(array $data = [], array $relationships = [], array $withCount = [], array $select = ['*']) + { + $cacheKey = $this->getCacheKey(md5(json_encode([ + 'filterItem' => [ + 'data' => $data, + 'relationships' => $relationships, + 'select' => $select, + 'withCount' => $withCount + ] + ]))); + return Cache::remember($cacheKey, $this->cacheTime, function () use ($data, $relationships, $select, $withCount) { + return $this->ipPoolRepository->filter($data, $relationships, $withCount, $select); + }); + } + public function findByName(string $name = '') + { + $cacheKey = $this->getCacheKey(md5(json_encode([ + 'findByName' => [ + 'name' => $name + ] + ]))); + return Cache::remember($cacheKey, $this->cacheTime, function () use ($name){ + return $this->ipPoolRepository->findByName($name); + }); + } +} diff --git a/app/Repositories/Module/IPPool/IPPoolRepository.php b/app/Repositories/Module/IPPool/IPPoolRepository.php new file mode 100644 index 0000000..da668d1 --- /dev/null +++ b/app/Repositories/Module/IPPool/IPPoolRepository.php @@ -0,0 +1,54 @@ +model->with($relationships)->select($select); + if (isset($data['relations'])) { + foreach ($data['relations'] as $key => $value) { + $model = $model->whereHas($key, function ($query) use ($value) { + if (isset($value['condition'])) { + switch (strtoupper($value['condition'])) { + case "IN": + $query->whereIn($value['key'], $value['value']); + break; + case "NotIn": + $query->whereNotIn($value['key'], $value['value']); + break; + default: + $query->where($value['key'], $value['condition'], $value['value']); + break; + } + } else { + $query->where($value['key'], $value['value']); + } + }); + } + } + + if (count($withCount) > 0) { + $model = $model->withCount($withCount); + } + if (isset($data['page'])) { + return $model->paginate(15); + } + return $model->get(); + } + public function findByName(string $name = '') + { + if (empty($name)) { + return false; + } + return $this->model->where('name','LIKE',"%$name%")->first(); + } +} diff --git a/app/Repositories/Module/IPPool/IPPoolRepositoryInterface.php b/app/Repositories/Module/IPPool/IPPoolRepositoryInterface.php new file mode 100644 index 0000000..718d38b --- /dev/null +++ b/app/Repositories/Module/IPPool/IPPoolRepositoryInterface.php @@ -0,0 +1,10 @@ +id(); + $table->string('ip_address'); + $table->unsignedBigInteger('module_network_id'); + $table->foreign('module_network_id')->references('id')->on('module_network'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('ip_pools'); + } +}; diff --git a/database/seeders/RolesAndPermissions.php b/database/seeders/RolesAndPermissions.php index ded9650..bcb7d91 100644 --- a/database/seeders/RolesAndPermissions.php +++ b/database/seeders/RolesAndPermissions.php @@ -92,6 +92,12 @@ class RolesAndPermissions extends Seeder Permission::create(['name' => 'edit module vcenter']); Permission::create(['name' => 'delete module vcenter']); + // create module ippool permissions + Permission::create(['name' => 'manager module ippool']); + Permission::create(['name' => 'add module ippool']); + Permission::create(['name' => 'edit module ippool']); + Permission::create(['name' => 'delete module ippool']); + // create package permissions Permission::create(['name' => 'manager package module']); Permission::create(['name' => 'add package module']); diff --git a/resources/views/admin/block/ModuleIPPool.blade.php b/resources/views/admin/block/ModuleIPPool.blade.php new file mode 100644 index 0000000..f3e80ad --- /dev/null +++ b/resources/views/admin/block/ModuleIPPool.blade.php @@ -0,0 +1,9 @@ + Add New IP Pool +
+ @csrf + + +
+ File Import Demo diff --git a/resources/views/admin/module/ippool/add.blade.php b/resources/views/admin/module/ippool/add.blade.php new file mode 100644 index 0000000..12149f0 --- /dev/null +++ b/resources/views/admin/module/ippool/add.blade.php @@ -0,0 +1,41 @@ +@extends('admin.main') +@section('content') + @if (auth()->guard('admins')->user()->can('add module ippool')) +
+
+ @csrf +
+
+
+ {{-- Server Host --}} +
+ +
+ +
+
+ {{-- Module Network --}} +
+ +
+ +
+
+
+
+
+ +
+
+ @else +
+
Access Denied - You are not assigned to any Module IP Pool + management department
+
+ @endif +@endsection diff --git a/resources/views/admin/module/ippool/index.blade.php b/resources/views/admin/module/ippool/index.blade.php new file mode 100644 index 0000000..fa8cf2a --- /dev/null +++ b/resources/views/admin/module/ippool/index.blade.php @@ -0,0 +1,77 @@ +@php use App\Http\Helpers\Helper; @endphp +@extends('admin.main') +@section('content') + @if (auth()->guard('admins')->user()->can('manager module ippool')) +
+
+ @include('admin.block.ModuleIPPool') +
+
+ + + + + + + + + + + + + @if (count($modules) > 0) + @foreach ($modules as $item) + + + + + + + + + @endforeach + @endif + +
+ + IP AddressModule NetworkvCenter
+ + + {{ $item->ip_address }} + + {{ $item->network->name . ' - ' . $item->network->network }} + + {{ $item->network->host->datacenter->vCenter->host }} + + + + + + @if (auth()->guard('admins')->user()->can('delete module ippool')) +
+ @method('delete') + @csrf + +
+ @endif +
+
+ +
+ @else +
+
Access Denied - You are not assigned to any Module IP Pool + management department
+
+ @endif +@endsection diff --git a/resources/views/admin/sidebar.blade.php b/resources/views/admin/sidebar.blade.php index f799fc7..e618657 100644 --- a/resources/views/admin/sidebar.blade.php +++ b/resources/views/admin/sidebar.blade.php @@ -119,6 +119,12 @@

Module vCenter

+ diff --git a/routes/web.php b/routes/web.php index 0f1f278..e3fd299 100644 --- a/routes/web.php +++ b/routes/web.php @@ -13,6 +13,7 @@ use App\Http\Controllers\admin\MediaController; use App\Http\Controllers\admin\MenuController; use App\Http\Controllers\admin\ModuleDNSController; use App\Http\Controllers\admin\ModuleHostingController; +use App\Http\Controllers\admin\ModuleIPPoolController; use App\Http\Controllers\admin\ModulevCenterController; use App\Http\Controllers\admin\OrderController; use App\Http\Controllers\admin\package\Datacenter; @@ -203,6 +204,16 @@ Route::prefix('administrator')->group(function () { Route::delete('remove-server-dns/{id}', 'destroy')->name('module.dns.destroy'); }); + Route::controller(ModuleIPPoolController::class)->group(function () { + Route::get('list-all-server-ip-pool', 'index')->name('module.ippool.index'); + Route::post('import-ip-pool-from-csv', 'import')->name('module.ippool.import'); + Route::get('add-new-server-ip-pool', 'create')->name('module.ippool.create'); + Route::post('add-new-server-ip-pool', 'store')->name('module.ippool.store'); + Route::get('view-server-ip-pool/{id}', 'edit')->name('module.ippool.edit'); + Route::put('view-server-ip-pool/{id}', 'update')->name('module.ippool.update'); + Route::delete('remove-server-ip-pool/{id}', 'destroy')->name('module.ippool.destroy'); + }); + //Module vCenter Server Route::controller(ModulevCenterController::class)->group(function () { Route::get('list-all-vcenter', 'index')->name('module.vcenter.index');