<?php
namespace Social\FrontendBundle\EventListener;
use Sentry\ClientInterface;
use Social\UserBundle\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Routing\RouterInterface;
use Social\FrontendBundle\Entity\Relationship;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Social\UserBundle\Repository\UserRepository;
use Social\FrontendBundle\Repository\RelationshipRepository;
/**
* Class ViewingAnotherUserListener
*
* @package Social\FrontendBundle\EventListener
*/
class ViewingAnotherUserListener implements EventSubscriberInterface
{
/**
* @var EntityManagerInterface $em
*/
private $em = null;
/**
* @var UserRepository $userRepository
*/
private $userRepository;
/**
* @var RelationshipRepository $relationshipRepository
*/
private $relationshipRepository;
/**
* @var RouterInterface $router
*/
private $router;
/**
* @var TokenStorageInterface $tokenStorage
*/
private $tokenStorage;
/**
* @var ClientInterface
*/
private $sentry;
/**
* ViewingAnotherUserListener constructor.
*
* @param TokenStorageInterface $tokenStorage
* @param EntityManagerInterface $entityManager
* @param RouterInterface $router
* @param ClientInterface $sentry
*/
public function __construct(
TokenStorageInterface $tokenStorage,
EntityManagerInterface $entityManager,
RouterInterface $router,
ClientInterface $sentry
) {
$this->tokenStorage = $tokenStorage;
$this->em = $entityManager;
$this->router = $router;
$this->userRepository = $this->em->getRepository(User::class);
$this->relationshipRepository = $this->em->getRepository(Relationship::class);
$this->sentry = $sentry;
}
/**
* @param GetResponseEvent $event
*
* @return GetResponseEvent
*/
public function onKernelRequest(GetResponseEvent $event): GetResponseEvent
{
try {
if (!$this->tokenStorage->getToken() instanceof TokenInterface) {
return $event;
}
$user = $this->tokenStorage->getToken()->getUser();
if (!$user instanceof User) {
return $event;
}
$viewingUser = null;
if (!$route = $event->getRequest()->get('_route')) {
return $event;
}
$request = $event->getRequest();
$route = $request->get('_route');
$otherUserRoutes = [
'social_frontend_user_about',
'social_frontend_user_friends',
'social_frontend_user_photo',
'social_frontend_user_photos',
'social_frontend_user_video',
'social_frontend_user_videos',
'social_frontend_user_album',
];
$routesWithIds = [
'social_frontend_photos_load_more',
'social_frontend_videos_load_more',
'social_frontend_albums_load_more',
];
if (in_array($route, $otherUserRoutes)) {
$viewingUser = $this->userRepository
->findOneBy(
[
'username' => $event->getRequest()->get('username'),
]
);
if (!$viewingUser) {
throw new NotFoundHttpException("User not found");
}
$this->setViewingUserData($user, $viewingUser);
} elseif (in_array($route, $routesWithIds)) {
$userId = $request->get('user_id');
$viewingUser = $this->userRepository->find($userId);
if (!$viewingUser instanceof User) {
throw new NotFoundHttpException("User not found");
}
$this->setViewingUserData($user, $viewingUser);
}
return $event;
} catch (\Exception $exception) {
$this->sentry->captureException($exception);
return $event;
}
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest', 128],
];
}
/**
* @param User $user
* @param User $viewingUser
*/
private function setViewingUserData(User $user, User $viewingUser)
{
try {
if ($user->getId() != $viewingUser->getId()) {
$user->setViewingUser($viewingUser); // set which entity you are viewing
$relObj = $this->relationshipRepository->returnRecordBetweenUsers($user, $viewingUser);
$user->setRelationshipObjectWithUser($viewingUser, $relObj);
}
} catch (\Exception $exception) {
$this->sentry->captureException($exception);
}
}
}