feat: implement system-wide activity logging with database persistence, repository patterns, and admin controller access.
This commit is contained in:
@@ -19,6 +19,7 @@ use App\Models\Order;
|
||||
use App\Models\Product;
|
||||
use App\Models\Service;
|
||||
use App\Repositories\Api\Order\OrderRepository;
|
||||
use App\Services\ActivityLogger;
|
||||
use App\Services\Api\Order\OrderService;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
@@ -31,8 +32,9 @@ use Illuminate\Support\Facades\DB;
|
||||
class OrderController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
protected OrderService $orderService,
|
||||
protected OrderRepository $orderRepo,
|
||||
protected OrderService $orderService,
|
||||
protected OrderRepository $orderRepo,
|
||||
protected ActivityLogger $activityLogger,
|
||||
) {}
|
||||
|
||||
// =========================================================================
|
||||
@@ -147,6 +149,14 @@ class OrderController extends Controller
|
||||
$order = $result['order']->load(['orderItems.product', 'invoice', 'customer']);
|
||||
$invoice = $result['invoice'];
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'created',
|
||||
logName: 'Order',
|
||||
description: "Customer {$customer->email} tạo đơn hàng #{$order->order_num} - Tổng: " . number_format($order->total) . ' VNĐ',
|
||||
subject: $order,
|
||||
newValues: ['order_num' => $order->order_num, 'total' => $order->total, 'product_id' => $data['product_id']],
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Tạo đơn hàng thành công.',
|
||||
@@ -190,6 +200,14 @@ class OrderController extends Controller
|
||||
|
||||
$this->orderService->pay($order, $request->payment_method);
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'payment',
|
||||
logName: 'Order',
|
||||
description: "Customer {$request->user()->email} thanh toán đơn hàng #{$order->order_num} qua {$request->payment_method}",
|
||||
subject: $order,
|
||||
newValues: ['payment_method' => $request->payment_method, 'total' => $order->total],
|
||||
);
|
||||
|
||||
return response()->json(['success' => true, 'message' => 'Thanh toán thành công.']);
|
||||
} catch (\Exception $e) {
|
||||
return $this->error($e->getMessage());
|
||||
@@ -222,6 +240,13 @@ class OrderController extends Controller
|
||||
|
||||
RetryProvisioningOrchestrator::dispatch($order->id, $request->user()->id);
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'retry_provisioning',
|
||||
logName: 'Order',
|
||||
description: "Customer {$request->user()->email} yêu cầu khởi tạo lại dịch vụ cho đơn hàng #{$order->order_num}",
|
||||
subject: $order,
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Đã yêu cầu khởi tạo lại dịch vụ. Hệ thống sẽ kiểm tra và xử lý trong vài phút.',
|
||||
@@ -470,6 +495,14 @@ class OrderController extends Controller
|
||||
|
||||
$service->update(['auto_renew' => (bool) $validated['auto_renew']]);
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'updated',
|
||||
logName: 'Service',
|
||||
description: "Customer {$request->user()->email} " . ($validated['auto_renew'] ? 'bật' : 'tắt') . " tự động gia hạn dịch vụ #{$service->id}",
|
||||
subject: $service,
|
||||
newValues: ['auto_renew' => (bool) $validated['auto_renew']],
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Cập nhật tự động gia hạn thành công.',
|
||||
@@ -597,6 +630,14 @@ class OrderController extends Controller
|
||||
->delay(now()->addSeconds(5));
|
||||
}
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'renew',
|
||||
logName: 'Service',
|
||||
description: "Customer {$customer->email} gia hạn dịch vụ #{$service->id} ({$service->server_name}) - {$months} tháng - " . number_format($price) . ' VNĐ',
|
||||
subject: $service,
|
||||
newValues: ['months' => $months, 'price' => $price, 'invoice_number' => $invoice->invoice_number],
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Gia hạn thành công. Dịch vụ đã được kích hoạt lại.',
|
||||
|
||||
@@ -10,6 +10,7 @@ use App\Jobs\VirtualMachine\Snapshot\RevertSnapshot;
|
||||
use App\Jobs\VirtualMachine\Snapshot\RemoveSnapshot;
|
||||
use App\Models\ModuleSnapshot;
|
||||
use App\Models\ModuleVmware;
|
||||
use App\Services\ActivityLogger;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
@@ -17,6 +18,8 @@ class SnapshotController extends Controller
|
||||
{
|
||||
use ResolvesVm;
|
||||
|
||||
public function __construct(protected ActivityLogger $activityLogger) {}
|
||||
|
||||
public function store(Request $request): JsonResponse
|
||||
{
|
||||
$customer = $request->user();
|
||||
@@ -47,6 +50,14 @@ class SnapshotController extends Controller
|
||||
|
||||
CreateSnapshot::dispatch($snapshot->id);
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'created',
|
||||
logName: 'Snapshot',
|
||||
description: "Customer {$customer->email} tạo snapshot: {$snapshot->name} cho VM #{$vm->id}",
|
||||
subject: $snapshot,
|
||||
newValues: ['name' => $snapshot->name, 'vm_id' => $vm->id],
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => 'Đã gửi yêu cầu tạo snapshot vào hàng đợi',
|
||||
@@ -159,6 +170,13 @@ class SnapshotController extends Controller
|
||||
|
||||
RevertSnapshot::dispatch($vm->id, $snapshot->id);
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'revert',
|
||||
logName: 'Snapshot',
|
||||
description: "Customer {$customer->email} revert snapshot: {$snapshot->name} (ID: {$snapshot->id}) cho VM #{$vm->id}",
|
||||
subject: $snapshot,
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => 'Đã gửi yêu cầu revert snapshot vào hàng đợi',
|
||||
@@ -189,6 +207,13 @@ class SnapshotController extends Controller
|
||||
|
||||
RemoveSnapshot::dispatch($vm->id, $snapshot->id);
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'deleted',
|
||||
logName: 'Snapshot',
|
||||
description: "Customer {$customer->email} xóa snapshot: {$snapshot->name} (ID: {$snapshot->id}) của VM #{$vm->id}",
|
||||
subject: $snapshot,
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => 'Đã gửi yêu cầu xóa snapshot vào hàng đợi',
|
||||
|
||||
@@ -14,6 +14,7 @@ use App\Jobs\VirtualMachine\ChangeVmPasswordJob;
|
||||
use App\Models\ModuleVmware;
|
||||
use App\Models\Os;
|
||||
use App\Models\Service;
|
||||
use App\Services\ActivityLogger;
|
||||
use App\Services\VmProvisionService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
@@ -24,6 +25,8 @@ class VmController extends Controller
|
||||
use ResolvesVm {
|
||||
ResolvesVm::resolveVmById as resolveVmForClient;
|
||||
}
|
||||
|
||||
public function __construct(protected ActivityLogger $activityLogger) {}
|
||||
// -------------------------------------------------------------------------
|
||||
// Power ON
|
||||
// -------------------------------------------------------------------------
|
||||
@@ -47,6 +50,13 @@ class VmController extends Controller
|
||||
|
||||
$result = $action->execute($vm);
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'power_on',
|
||||
logName: 'VM',
|
||||
description: "Customer {$request->user()->email} bật VM: {$vm->name} (ID: {$vm->vmware_id})",
|
||||
subject: $vm,
|
||||
);
|
||||
|
||||
return $this->vmResponse($result, 'Đã gửi lệnh bật VM.');
|
||||
}
|
||||
|
||||
@@ -73,6 +83,13 @@ class VmController extends Controller
|
||||
|
||||
$result = $action->execute($vm);
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'power_off',
|
||||
logName: 'VM',
|
||||
description: "Customer {$request->user()->email} tắt VM: {$vm->name} (ID: {$vm->vmware_id})",
|
||||
subject: $vm,
|
||||
);
|
||||
|
||||
return $this->vmResponse($result, 'Đã gửi lệnh tắt VM.');
|
||||
}
|
||||
|
||||
@@ -189,6 +206,14 @@ class VmController extends Controller
|
||||
. "ℹ️ Kiểm tra lại VM để xác nhận IP đã thay đổi chưa.");
|
||||
}
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'change_ip',
|
||||
logName: 'VM',
|
||||
description: "Customer {$request->user()->email} đổi IP VM: {$vm->name} → {$validated['ip_address']}",
|
||||
subject: $vm,
|
||||
newValues: ['ip_address' => $validated['ip_address'], 'gateway' => $gateway, 'os_type' => $osType],
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Đã gửi lệnh đổi IP.',
|
||||
@@ -234,6 +259,16 @@ class VmController extends Controller
|
||||
? (bool) $result['success']
|
||||
: !($result['error'] ?? true);
|
||||
|
||||
if ($ok) {
|
||||
$this->activityLogger->log(
|
||||
event: 'change_port',
|
||||
logName: 'VM',
|
||||
description: "Customer {$request->user()->email} đổi cổng RDP VM: {$vm->name} → port {$validated['new_port']}",
|
||||
subject: $vm,
|
||||
newValues: ['new_port' => $validated['new_port']],
|
||||
);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'success' => $ok,
|
||||
'message' => $ok ? 'Đổi cổng RDP thành công.' : ($result['message'] ?? 'Đổi cổng thất bại.'),
|
||||
@@ -269,6 +304,14 @@ class VmController extends Controller
|
||||
return $result;
|
||||
}
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'console_access',
|
||||
logName: 'VM',
|
||||
description: "Customer {$request->user()->email} truy cập console VM: {$vm->name} (ID: {$vm->vmware_id})",
|
||||
subject: $vm,
|
||||
newValues: ['product_id' => $productId, 'vm_name' => $vm->name],
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'data' => $result['data'],
|
||||
@@ -300,6 +343,13 @@ class VmController extends Controller
|
||||
], 400);
|
||||
}
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'restart',
|
||||
logName: 'VM',
|
||||
description: "Customer {$request->user()->email} restart VM: {$vm->name} (ID: {$vm->vmware_id})",
|
||||
subject: $vm,
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => 'Đã gửi lệnh restart VM',
|
||||
@@ -345,6 +395,14 @@ class VmController extends Controller
|
||||
$validated['current_password'],
|
||||
);
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'change_password',
|
||||
logName: 'VM',
|
||||
description: "Customer {$request->user()->email} yêu cầu đổi mật khẩu VM: {$vm->name}",
|
||||
subject: $vm,
|
||||
newValues: ['os_family' => $osFamily],
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Yêu cầu đổi mật khẩu đã được ghi nhận. Hệ thống sẽ xử lý trong vài phút.',
|
||||
|
||||
@@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
|
||||
use App\Http\Controllers\Api\Service\Concerns\ResolvesVm;
|
||||
use App\Http\Services\vCenter;
|
||||
use App\Models\ModuleVmware;
|
||||
use App\Services\ActivityLogger;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
@@ -14,6 +15,8 @@ class VmRebuildController extends Controller
|
||||
{
|
||||
use ResolvesVm;
|
||||
|
||||
public function __construct(protected ActivityLogger $activityLogger) {}
|
||||
|
||||
public function options(Request $request): JsonResponse
|
||||
{
|
||||
$productId = (int) $request->query('product');
|
||||
@@ -103,6 +106,14 @@ class VmRebuildController extends Controller
|
||||
], 400);
|
||||
}
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'rebuild',
|
||||
logName: 'VM',
|
||||
description: "Customer {$customer->email} rebuild VM: {$vm->name} với OS ID: {$payload['os_id']}",
|
||||
subject: $vm,
|
||||
newValues: ['os_id' => $payload['os_id']],
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => 'Đã gửi yêu cầu rebuild VM',
|
||||
@@ -207,6 +218,14 @@ class VmRebuildController extends Controller
|
||||
}
|
||||
}
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'upgrade_addons',
|
||||
logName: 'VM',
|
||||
description: "Customer {$customer->email} nâng cấp addons VM: {$vm->name} - áp dụng: " . implode(', ', $applied ?: ['none']),
|
||||
subject: $vm,
|
||||
newValues: array_filter(['cpu' => $payload['cpu'] ?? null, 'ram' => $payload['ram'] ?? null, 'disk' => $payload['disk'] ?? null]),
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => 'Đã gửi yêu cầu nâng cấp addons',
|
||||
|
||||
Reference in New Issue
Block a user