<?php
declare(strict_types=1);
namespace App\Security\Voter\Template;
use App\Model\User\Entity\Profile\Template\Status;
use App\Model\User\Entity\User\Role\Permission;
use App\Security\UserIdentity;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
class TemplateVoter extends Voter
{
public const TEMPLATE_CREATE = 'template_create';
public const TEMPLATE_EDIT = 'template_edit';
public const TEMPLATE_DELETE = 'template_delete';
public const TEMPLATE_INDEX = 'template_index';
public const TEMPLATE_SHOW = 'template_show';
public const TEMPLATE_GENERATE = 'template_generate';
public const TEMPLATE_DUPLICATE = 'template_duplicate';
private $security;
public function __construct(Security $security)
{
$this->security = $security;
}
protected function supports(string $attribute, $subject): bool
{
return in_array($attribute, [
self::TEMPLATE_CREATE,
self::TEMPLATE_EDIT,
self::TEMPLATE_INDEX,
self::TEMPLATE_SHOW ,
self::TEMPLATE_GENERATE,
self::TEMPLATE_DELETE,
self::TEMPLATE_DUPLICATE
], true);
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
$user = $token->getUser();
if (!$user instanceof UserIdentity) {
return false;
}
if ($attribute === self::TEMPLATE_CREATE) {
return $user->isPermission(Permission::TEMPLATE_CREATE);
}
if ($subject->is_public and (new Status($subject->status))->isStandard()) {
if ($attribute === self::TEMPLATE_SHOW) {
return $user->isPermission(Permission::TEMPLATE_SHOW);
}
if ($attribute === self::TEMPLATE_GENERATE) {
return $user->isPermission(Permission::TEMPLATE_GENERATE);
}
if ($attribute === self::TEMPLATE_DUPLICATE) {
return $user->isPermission(Permission::TEMPLATE_DUPLICATE);
}
}
if ($user->getProfileId() !== $subject->profile_id) {
return false;
}
switch ($attribute) {
case self::TEMPLATE_INDEX:
return $user->isPermission(Permission::TEMPLATE_INDEX);
break;
case self::TEMPLATE_EDIT:
return $user->isPermission(Permission::TEMPLATE_EDIT);
break;
case self::TEMPLATE_CREATE:
return $user->isPermission(Permission::TEMPLATE_CREATE);
break;
case self::TEMPLATE_SHOW:
return $user->isPermission(Permission::TEMPLATE_SHOW);
break;
case self::TEMPLATE_GENERATE:
return $user->isPermission(Permission::TEMPLATE_GENERATE);
break;
case self::TEMPLATE_DELETE:
return $user->isPermission(Permission::TEMPLATE_DELETE);
break;
case self::TEMPLATE_DUPLICATE:
return $user->isPermission(Permission::TEMPLATE_DUPLICATE);
break;
}
return false;
}
}