<?php
namespace Crea\EventBundle\Voter;
use Crea\EventBundle\Entity\EventCategory;
use Crea\EventBundle\Entity\EventModel;
use Crea\EventBundle\Provider\EventRightCodeProvider;
use Exception;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
use Crea\SecurityBundle\Entity\User;
class EventVoter extends Voter
{
protected EventRightCodeProvider $eventRightCodeProvider;
public function __construct(EventRightCodeProvider $eventRightCodeProvider)
{
$this->eventRightCodeProvider = $eventRightCodeProvider;
}
/**
* @inheritDoc
* @throws Exception
*/
protected function supports($attribute, $subject): bool
{
$attributes = [
$this->eventRightCodeProvider->getMainEventCategoryCreateRightCode(),
$this->eventRightCodeProvider::TYPE_CODE_LIST,
$this->eventRightCodeProvider::TYPE_CODE_CREATE,
$this->eventRightCodeProvider::TYPE_CODE_UPDATE,
$this->eventRightCodeProvider::TYPE_CODE_REMOVE,
$this->eventRightCodeProvider::LOG_CODE_LIST
];
if ($subject instanceof EventCategory) {
$attributes[] = $this->eventRightCodeProvider->getEventCategoryViewRightCode($subject);
$attributes[] = $this->eventRightCodeProvider->getEventCategoryCreateRightCode($subject);
$attributes[] = $this->eventRightCodeProvider->getEventCategoryUpdateRightCode($subject);
$attributes[] = $this->eventRightCodeProvider->getEventCategoryRemoveRightCode($subject);
$attributes[] = $this->eventRightCodeProvider->getEventModelCreateRightCode($subject);
}
if ($subject instanceof EventModel) {
$attributes[] = $this->eventRightCodeProvider->getEventModelUpdateRightCode($subject);
$attributes[] = $this->eventRightCodeProvider->getEventModelRemoveRightCode($subject);
}
return in_array($attribute, $attributes);
}
/**
* @inheritDoc
* @throws Exception
*/
protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool
{
/** @var User $loggedUser */
$loggedUser = $token->getUser();
if (!$loggedUser instanceof UserInterface) {
return false;
}
if ($attribute === $this->eventRightCodeProvider->getMainEventCategoryCreateRightCode()) {
return $this->voteOnMainEventCategoryCreate($loggedUser);
}
if ($attribute === $this->eventRightCodeProvider::LOG_CODE_LIST) {
return $this->voteOnEventLogList($loggedUser);
}
switch ($attribute) {
case $this->eventRightCodeProvider::TYPE_CODE_LIST:
return $this->voteOnEventTypeList($loggedUser);
case $this->eventRightCodeProvider::TYPE_CODE_CREATE:
return $this->voteOnEventTypeCreate($loggedUser);
case $this->eventRightCodeProvider::TYPE_CODE_UPDATE:
return $this->voteOnEventTypeUpdate($loggedUser);
case $this->eventRightCodeProvider::TYPE_CODE_REMOVE:
return $this->voteOnEventTypeRemove($loggedUser);
}
if ($subject instanceof EventCategory) {
switch ($attribute) {
case $this->eventRightCodeProvider->getEventCategoryViewRightCode($subject):
return $this->voteOnEventCategoryView($subject, $loggedUser);
case $this->eventRightCodeProvider->getEventCategoryCreateRightCode($subject):
return $this->voteOnEventCategoryCreate($subject, $loggedUser);
case $this->eventRightCodeProvider->getEventCategoryUpdateRightCode($subject):
return $this->voteOnEventCategoryUpdate($subject, $loggedUser);
case $this->eventRightCodeProvider->getEventCategoryRemoveRightCode($subject):
return $this->voteOnEventCategoryRemove($subject, $loggedUser);
case $this->eventRightCodeProvider->getEventModelCreateRightCode($subject):
return $this->voteOnEventModelCreate($subject, $loggedUser);
}
}
if ($subject instanceof EventModel) {
switch ($attribute) {
case $this->eventRightCodeProvider->getEventModelUpdateRightCode($subject):
return $this->voteOnEventModelUpdate($subject, $loggedUser);
case $this->eventRightCodeProvider->getEventModelRemoveRightCode($subject):
return $this->voteOnEventModelRemove($subject, $loggedUser);
}
}
return false;
}
private function voteOnEventLogList(UserInterface $loggedUser): bool
{
return in_array($this->eventRightCodeProvider::LOG_CODE_LIST, $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnEventTypeList(UserInterface $loggedUser): bool
{
return in_array($this->eventRightCodeProvider::TYPE_CODE_LIST, $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnEventTypeCreate(UserInterface $loggedUser): bool
{
return in_array($this->eventRightCodeProvider::TYPE_CODE_CREATE, $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnEventTypeUpdate(UserInterface $loggedUser): bool
{
return in_array($this->eventRightCodeProvider::TYPE_CODE_UPDATE, $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnEventTypeRemove(UserInterface $loggedUser): bool
{
return in_array($this->eventRightCodeProvider::TYPE_CODE_REMOVE, $loggedUser->getRoles());
}
private function voteOnMainEventCategoryCreate(UserInterface $loggedUser): bool
{
return in_array($this->eventRightCodeProvider->getMainEventCategoryCreateRightCode(), $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnEventCategoryView(EventCategory $eventCategory, UserInterface $loggedUser): bool
{
return in_array($this->eventRightCodeProvider->getEventCategoryViewRightCode($eventCategory), $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnEventCategoryCreate(EventCategory $eventCategory, UserInterface $loggedUser): bool
{
return in_array($this->eventRightCodeProvider->getEventCategoryCreateRightCode($eventCategory), $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnEventCategoryUpdate(EventCategory $eventCategory, UserInterface $loggedUser): bool
{
return in_array($this->eventRightCodeProvider->getEventCategoryUpdateRightCode($eventCategory), $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnEventCategoryRemove(EventCategory $eventCategory, UserInterface $loggedUser): bool
{
return in_array($this->eventRightCodeProvider->getEventCategoryRemoveRightCode($eventCategory), $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnEventModelCreate(EventCategory $eventCategory, UserInterface $loggedUser): bool
{
return in_array($this->eventRightCodeProvider->getEventModelCreateRightCode($eventCategory), $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnEventModelUpdate(EventModel $eventModel, UserInterface $loggedUser): bool
{
return in_array($this->eventRightCodeProvider->getEventModelUpdateRightCode($eventModel), $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnEventModelRemove(EventModel $eventModel, UserInterface $loggedUser): bool
{
return in_array($this->eventRightCodeProvider->getEventModelRemoveRightCode($eventModel), $loggedUser->getRoles());
}
}