feat: implement system-wide activity logging with database persistence, repository patterns, and admin controller access.
This commit is contained in:
@@ -7,6 +7,7 @@ use App\Http\Requests\Api\Client\ClientAuthRequest;
|
||||
use App\Http\Requests\Api\Client\ClientRegisterRequest;
|
||||
use App\Http\Requests\Api\Client\ClientUpdateRequest;
|
||||
use App\Http\Resources\Api\Client\ClientResource;
|
||||
use App\Services\ActivityLogger;
|
||||
use App\Services\Api\Client\ClientAuthService;
|
||||
use Illuminate\Http\Request;
|
||||
use Tymon\JWTAuth\Facades\JWTAuth;
|
||||
@@ -21,10 +22,12 @@ use Tymon\JWTAuth\Exceptions\JWTException;
|
||||
class ClientController extends Controller
|
||||
{
|
||||
protected $authService;
|
||||
protected ActivityLogger $activityLogger;
|
||||
|
||||
public function __construct(ClientAuthService $authService)
|
||||
public function __construct(ClientAuthService $authService, ActivityLogger $activityLogger)
|
||||
{
|
||||
$this->authService = $authService;
|
||||
$this->activityLogger = $activityLogger;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -130,10 +133,13 @@ class ClientController extends Controller
|
||||
{
|
||||
$result = $this->authService->authenticateClient($request->validated());
|
||||
|
||||
$client = $result['client'];
|
||||
$this->activityLogger->logAuth('login', 'customer', $client->id, $client->email);
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'data' => [
|
||||
'client' => new ClientResource($result['client']->loadCount(['vps', 'hosting', 'domain'])),
|
||||
'client' => new ClientResource($client->loadCount(['vps', 'hosting', 'domain'])),
|
||||
'token' => $result['token'],
|
||||
'refresh_token' => $result['refresh_token'],
|
||||
'expires_in' => config('jwt.ttl', 60) * 60, // seconds
|
||||
@@ -182,10 +188,13 @@ class ClientController extends Controller
|
||||
{
|
||||
$result = $this->authService->registerClient($request->validated());
|
||||
|
||||
$client = $result['client'];
|
||||
$this->activityLogger->logAuth('register', 'customer', $client->id, $client->email);
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'data' => [
|
||||
'client' => new ClientResource($result['client']->loadCount(['vps', 'hosting', 'domain'])),
|
||||
'client' => new ClientResource($client->loadCount(['vps', 'hosting', 'domain'])),
|
||||
'token' => $result['token'],
|
||||
'refresh_token' => $result['refresh_token'],
|
||||
'expires_in' => config('jwt.ttl', 60) * 60,
|
||||
@@ -222,6 +231,11 @@ class ClientController extends Controller
|
||||
*/
|
||||
public function logout(Request $request)
|
||||
{
|
||||
$customer = auth('client')->user();
|
||||
if ($customer) {
|
||||
$this->activityLogger->logAuth('logout', 'customer', $customer->id, $customer->email);
|
||||
}
|
||||
|
||||
if ($rawToken = $request->input('refresh_token')) {
|
||||
$this->authService->revokeRefreshToken($rawToken);
|
||||
}
|
||||
@@ -297,9 +311,22 @@ class ClientController extends Controller
|
||||
{
|
||||
$user = auth('client')->user();
|
||||
|
||||
$oldValues = array_intersect_key($user->toArray(), $request->validated());
|
||||
$user->fill($request->validated());
|
||||
$dirty = $user->getDirty();
|
||||
$user->save();
|
||||
|
||||
if (!empty($dirty)) {
|
||||
$this->activityLogger->log(
|
||||
event: 'profile_update',
|
||||
logName: 'Customer',
|
||||
description: "Customer {$user->email} cập nhật thông tin cá nhân: " . implode(', ', array_keys($dirty)),
|
||||
subject: $user,
|
||||
oldValues: array_intersect_key($oldValues, $dirty),
|
||||
newValues: array_diff_key($dirty, array_flip(['password', 'remember_token'])),
|
||||
);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => 'Cập nhật thông tin thành công',
|
||||
|
||||
@@ -9,6 +9,7 @@ use App\Http\Services\vCenter;
|
||||
use App\Models\Order;
|
||||
use App\Models\Service;
|
||||
use App\Repositories\Api\ServiceClient\ServiceClientRepository;
|
||||
use App\Services\ActivityLogger;
|
||||
use App\Services\Api\ServiceClient\ServiceClientService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
@@ -17,13 +18,16 @@ class ServiceController extends Controller
|
||||
{
|
||||
protected $serviceClientService;
|
||||
protected $serviceClientRepository;
|
||||
protected ActivityLogger $activityLogger;
|
||||
|
||||
public function __construct(
|
||||
ServiceClientService $serviceClientService,
|
||||
ServiceClientRepository $serviceClientRepository
|
||||
ServiceClientRepository $serviceClientRepository,
|
||||
ActivityLogger $activityLogger,
|
||||
) {
|
||||
$this->serviceClientService = $serviceClientService;
|
||||
$this->serviceClientRepository = $serviceClientRepository;
|
||||
$this->activityLogger = $activityLogger;
|
||||
}
|
||||
|
||||
public function getService(Request $request)
|
||||
@@ -99,6 +103,14 @@ class ServiceController extends Controller
|
||||
|
||||
$ticket = basename(parse_url((string) $consoleTicket['data'], PHP_URL_PATH));
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'console_access',
|
||||
logName: 'VM',
|
||||
description: "Customer {$customer->email} truy cập console VM: {$vm->name} (service: {$uuid})",
|
||||
subject: $vm,
|
||||
newValues: ['service_uuid' => $uuid, 'vm_name' => $vm->name],
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => $ticket,
|
||||
@@ -154,6 +166,14 @@ class ServiceController extends Controller
|
||||
return response()->json(['error' => true, 'message' => $consoleTicket['data']]);
|
||||
}
|
||||
|
||||
$this->activityLogger->log(
|
||||
event: 'console_access',
|
||||
logName: 'VM',
|
||||
description: "Customer {$customer->email} truy cập console VM: {$vm->name} (order: {$order->order_num})",
|
||||
subject: $vm,
|
||||
newValues: ['order_num' => $order->order_num, 'vm_name' => $vm->name],
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'data' => $consoleTicket['data'],
|
||||
|
||||
Reference in New Issue
Block a user