<?php
namespace App\Mailjet\Voter;
use App\Mailjet\Entity\MailjetCampaign;
use App\Mailjet\Entity\MailjetCampaignType;
use App\Mailjet\Entity\MailjetOperation;
use App\Mailjet\Repository\MailjetCampaignRepository;
use Crea\SecurityBundle\Entity\User;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class MailjetVoter extends Voter
{
const OPERATION_LIST = "MAILJET_OPERATION_LIST";
const OPERATION_CREATE = "MAILJET_OPERATION_CREATE";
const OPERATION_UPDATE = "MAILJET_OPERATION_UPDATE";
const OPERATION_REMOVE = "MAILJET_OPERATION_REMOVE";
const OPERATION_STATISTICS = "MAILJET_OPERATION_STATISTICS";
const CAMPAIGN_LIST = "MAILJET_CAMPAIGN_LIST";
const CAMPAIGN_CREATE = "MAILJET_CAMPAIGN_CREATE";
const CAMPAIGN_UPDATE = "MAILJET_CAMPAIGN_UPDATE";
const CAMPAIGN_DUPLICATE = "MAILJET_CAMPAIGN_DUPLICATE";
const CAMPAIGN_SYNCHRONIZE = "MAILJET_CAMPAIGN_SYNCHRONIZE";
const CAMPAIGN_REMOVE = "MAILJET_CAMPAIGN_REMOVE";
const CAMPAIGN_STATISTICS = "MAILJET_CAMPAIGN_STATISTICS";
const CAMPAIGN_TYPE_LIST = "MAILJET_CAMPAIGN_TYPE_LIST";
const CAMPAIGN_TYPE_CREATE = "MAILJET_CAMPAIGN_TYPE_CREATE";
const CAMPAIGN_TYPE_UPDATE = "MAILJET_CAMPAIGN_TYPE_UPDATE";
const CAMPAIGN_TYPE_REMOVE = "MAILJET_CAMPAIGN_TYPE_REMOVE";
const CONTACT_LIST_SYNCHRONIZE = "MAILJET_CONTACT_LIST_SYNCHRONIZE";
protected ParameterBagInterface $parameterBag;
public function __construct(ParameterBagInterface $parameterBag)
{
$this->parameterBag = $parameterBag;
}
protected function supports(string $attribute, $subject): bool
{
return in_array($attribute, [
self::OPERATION_LIST,
self::OPERATION_CREATE,
self::OPERATION_UPDATE,
self::OPERATION_REMOVE,
self::OPERATION_STATISTICS,
self::CAMPAIGN_LIST,
self::CAMPAIGN_CREATE,
self::CAMPAIGN_UPDATE,
self::CAMPAIGN_DUPLICATE,
self::CAMPAIGN_REMOVE,
self::CAMPAIGN_SYNCHRONIZE,
self::CAMPAIGN_STATISTICS,
self::CAMPAIGN_TYPE_LIST,
self::CAMPAIGN_TYPE_CREATE,
self::CAMPAIGN_TYPE_UPDATE,
self::CAMPAIGN_TYPE_REMOVE,
self::CONTACT_LIST_SYNCHRONIZE,
]);
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
/** @var User $loggedUser */
$loggedUser = $token->getUser();
if (!$loggedUser instanceof UserInterface)
return false;
if (!$this->parameterBag->get('crea_mailjet_sync_active') && in_array($attribute, [
self::CAMPAIGN_CREATE,
self::CAMPAIGN_UPDATE,
self::CAMPAIGN_DUPLICATE,
self::CAMPAIGN_SYNCHRONIZE,
self::CONTACT_LIST_SYNCHRONIZE,
])) {
return false;
}
if ($subject instanceof MailjetCampaignType && $attribute === self::CAMPAIGN_TYPE_REMOVE && $subject->getMailjetCampaigns()->count() > 0) {
return false;
}
if ($subject instanceof MailjetCampaign && $attribute === self::CAMPAIGN_UPDATE && $subject->getMailjetCampaignState() === MailjetCampaignRepository::MAILER_CAMPAIGN_STATE_MAILJET_SENT) {
return false;
}
if ($subject instanceof MailjetCampaign && $attribute === self::CAMPAIGN_STATISTICS && $subject->getMailjetStatistic() === null) {
return false;
}
if ($subject instanceof MailjetOperation && $attribute === self::OPERATION_STATISTICS && ($subject->getTotalCount() === 0 || $subject->getTotalCount() === null)) {
return false;
}
return in_array($attribute, $loggedUser->getRoles());
}
}