<?php
declare(strict_types=1);
namespace App\Infrastructure\Sentry;
use App\Entity\Project\User;
use Sentry\State\HubInterface;
use Sentry\State\Scope;
use Sentry\UserDataBag;
use Symfony\Component\HttpKernel\Event\KernelEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class SentryRequestListener
{
public function __construct(
private readonly ?HubInterface $hub,
private readonly ?TokenStorageInterface $tokenStorage
) {
}
protected function isMainRequest(KernelEvent $event): bool
{
return method_exists($event, 'isMainRequest')
? $event->isMainRequest()
: $event->isMasterRequest();
}
public function handleKernelRequestEvent(RequestEvent $event): void
{
if (!$this->hub || !$this->isMainRequest($event)) {
return;
}
$client = $this->hub->getClient();
if (null === $client || !$client->getOptions()->shouldSendDefaultPii()) {
return;
}
$userData = UserDataBag::createFromUserIpAddress($event->getRequest()->getClientIp());
if ($user = $this->tokenStorage?->getToken()?->getUser()) {
if (!$user instanceof User) {
return;
}
$userData->setId($user->getId());
$userData->setUsername($user->getFirstname().' '.$user->getLastname());
$userData->setEmail($user->getPhone());
}
$this->hub->configureScope(static function (Scope $scope) use ($userData): void {
$scope->setUser($userData);
});
}
}