feat: implement system-wide activity logging with database persistence, repository patterns, and admin controller access.

This commit is contained in:
pbao9
2026-05-16 20:01:52 +07:00
parent 8a115c5175
commit 551c90d60b
44 changed files with 845 additions and 33 deletions
@@ -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',