48 lines
1.4 KiB
PHP
48 lines
1.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Middleware;
|
|
|
|
use App\Models\ApiUsageLog;
|
|
use Closure;
|
|
use Illuminate\Http\Request;
|
|
use Laravel\Sanctum\PersonalAccessToken;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
class LogApiUsage
|
|
{
|
|
/**
|
|
* Handle an incoming request.
|
|
*
|
|
* @param Closure(Request): (Response) $next
|
|
*/
|
|
public function handle(Request $request, Closure $next): Response
|
|
{
|
|
$startedAt = microtime(true);
|
|
$response = $next($request);
|
|
|
|
$this->writeLog($request, $response, $startedAt);
|
|
|
|
return $response;
|
|
}
|
|
|
|
private function writeLog(Request $request, Response $response, float $startedAt): void
|
|
{
|
|
$token = $request->user()?->currentAccessToken();
|
|
$tokenId = $token instanceof PersonalAccessToken && (int) $token->getKey() > 0
|
|
? (int) $token->getKey()
|
|
: null;
|
|
|
|
ApiUsageLog::query()->create([
|
|
'user_id' => $request->user()?->id,
|
|
'personal_access_token_id' => $tokenId,
|
|
'method' => $request->method(),
|
|
'path' => '/'.$request->path(),
|
|
'route_name' => $request->route()?->getName(),
|
|
'status_code' => $response->getStatusCode(),
|
|
'ip_address' => $request->ip(),
|
|
'user_agent' => mb_substr((string) $request->userAgent(), 0, 512),
|
|
'duration_ms' => (int) round((microtime(true) - $startedAt) * 1000),
|
|
'requested_at' => now(),
|
|
]);
|
|
}
|
|
}
|