<?php
namespace App\EventListener;
use App\Aws\SESManager;
use App\Entity\Clinic\Clinic;
use App\Entity\Person\Admin;
use App\Entity\Person\SuperClinicAdmin;
use App\Entity\Person\User;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
class ClinicSubscriber implements EventSubscriberInterface
{
const EMAIL_MESSAGE = 'Please verify your clinic email address. An automated email from Amazon Web Services (SES) has been sent to that address. Clicking on the link within that email will verify your clinic email address.';
const ALLOWED_ROUTES = [
'clinics_delete',
'clinics_onboarding_index',
'patients_import',
'clinics_product_import',
'clinic_users_import',
'clinics_treatment_category_import',
'clinics_price_list_import',
'patients_note_import',
'invoices_import',
'clinic_register_price_tiers',
'clinic_register_profile',
'clinic_register_customer',
'clinics_customer_new',
'clinic_register_team',
'clinic_register_products',
'clinic_register_treatments',
'clinic_register_payment',
'admin_clinics_price_tiers',
'clinic_register_form_files',
'clinics_onboarding_finish'
];
/**
* @var SESManager
*/
private $ses;
/**
* @var Router
*/
private $router;
/**
* @var Session
*/
private $session;
/**
* @var TokenStorageInterface
*/
private $tokenStorage;
public function __construct(SESManager $ses, Router $router, Session $session, TokenStorageInterface $tokenStorage)
{
$this->ses = $ses;
$this->router = $router;
$this->session = $session;
$this->tokenStorage = $tokenStorage;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return [
'kernel.controller_arguments' => 'onKernelController',
'kernel.view' => 'onKernelView',
'kernel.response' => 'onKernelResponse'
];
}
public function onKernelView(ViewEvent $event)
{
$request = $event->getRequest();
/** @var Clinic $clinic */
$clinic = $request->attributes->get('clinic');
if ($clinic) {
$controllerName = $request->attributes->get('_controller');
$routeName = $request->attributes->get('_route');
$trialEndDate= $clinic->getTrialEndDate();
$token = $this->tokenStorage->getToken();
$user = $token instanceof TokenInterface ? $token->getUser() : null;
$isAdmin = false;
if ($user instanceof Admin) {
$isAdmin = true;
}
if(count($clinic->getLicenses()) == 0) {
if ($trialEndDate && $trialEndDate <= date('Ymd') && $request->attributes->get('_route')) {
if(in_array($request->attributes->get('_route'), ['clinics_customer_new', 'clinics_license_new', 'clinic_register_price_tiers'])) {
;
} else if(!$isAdmin && 'clinic_register_customer' !== $request->attributes->get('_route')){
$needLicense = false;
if($clinic->getOrganisation()) {
$org = $clinic->getOrganisation();
if($org->isEnableLicensing()) {
$needLicense = true;
}
}
if($needLicense) {
$link = $this->router->generate('clinic_register_customer', ['id' => $clinic->getId()]);
$event->setResponse(new RedirectResponse($link));
return;
}
}
}
}
if (false === strpos($controllerName, 'App\Controller\Admin') || ($routeName && in_array(
$routeName,
self::ALLOWED_ROUTES,
true
))) {
return;
}
if (!$isAdmin && count($messages = $this->checkClinic($clinic))) {
if ($request->attributes->get('_route') && 'clinics_edit' !== $request->attributes->get('_route')) {
$token = $this->tokenStorage->getToken();
$user = $token instanceof TokenInterface ? $token->getUser() : null;
if ($user instanceof Admin || $user instanceof SuperClinicAdmin || User::ROLE_CLINIC_ADMIN === $user->getRole()) {
$link = $this->router->generate('clinics_edit', ['id' => $clinic->getId()]);
} else {
$link = $this->router->generate('dashboard_index');
}
$event->setResponse(new RedirectResponse($link));
}
}
}
}
private function checkClinic(Clinic $clinic)
{
$messages = [];
if (!$clinic->isVerifiedEmail()) {
$this->ses->verifyEmail($clinic);
if (!$clinic->isVerifiedEmail()) {
$messages[] = self::EMAIL_MESSAGE;
}
}
return $messages;
}
public function onKernelController(ControllerArgumentsEvent $event)
{
$request = $event->getRequest();
/** @var Clinic $clinic */
$clinic = $request->attributes->get('clinic');
if ($clinic) {
$controllerName = $request->attributes->get('_controller');
$routeName = $request->attributes->get('_route');
if (!$routeName) {
return;
}
if (false === strpos($controllerName, 'App\Controller\Admin') || in_array(
$routeName,
self::ALLOWED_ROUTES,
true
)) {
return;
}
if (count($messages = $this->checkClinic($clinic))) {
$this->session->getFlashBag()->set('warning', $messages);
}
}
}
public function onKernelResponse(ResponseEvent $event)
{
if (!($event->getResponse() instanceof JsonResponse)) {
$token = $this->tokenStorage->getToken();
$response = $event->getResponse();
$request = $event->getRequest();
$controllerName = $request->attributes->get('_controller');
if ($token) {
$user = $token->getUser();
if ($user && is_object($user)) {
if ('App\Controller\Admin\HelpController::index' === $controllerName) {
$cookie = new Cookie(
'wpl',
md5((new \DateTime())->format('d-m-Y')),
(new \DateTime())->setTime(23, 59, 59),
'/',
'.consentz.com',
false,
true,
false
);
$response->headers->setCookie($cookie);
}
} else {
$cookie = new Cookie(
'wpl',
md5((new \DateTime())->format('d-m-Y')),
(new \DateTime())->setTime(0, 0, 0),
'/',
'.consentz.com',
false,
true,
false
);
$response->headers->setCookie($cookie);
}
}
}
}
}