39 lines
1.3 KiB
PHP
39 lines
1.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Middleware;
|
|
|
|
use App\Services\PortalProfileAccess;
|
|
use Closure;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Validation\ValidationException;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
|
|
|
|
class AuditProfileDecision
|
|
{
|
|
public function handle(Request $request, Closure $next): Response
|
|
{
|
|
$access = app(PortalProfileAccess::class);
|
|
if (! $request->user() || ! $access->available() || ! preg_match('#^(perfil/|perfis/|minhas-oportunidades)#', $request->path())) {
|
|
return $next($request);
|
|
}
|
|
try {
|
|
$response = $next($request);
|
|
} catch (\Throwable $error) {
|
|
$status = $error instanceof HttpExceptionInterface ? $error->getStatusCode() : ($error instanceof ValidationException ? 422 : 500);
|
|
$this->record($request, $access, $status);
|
|
throw $error;
|
|
}
|
|
if ($response->getStatusCode() >= 400) {
|
|
$this->record($request, $access, $response->getStatusCode());
|
|
}
|
|
|
|
return $response;
|
|
}
|
|
|
|
private function record(Request $request, PortalProfileAccess $access, int $status): void
|
|
{
|
|
$access->audit($request->user(), 'request_denied', ['method' => $request->method(), 'path' => $request->path(), 'status' => $status]);
|
|
}
|
|
}
|