<?php
declare(strict_types=1);
namespace App\Security\Voter\Procedure;
use App\Model\User\Entity\User\Role\Permission;
use App\Model\User\Entity\User\Role\RoleConstants;
use App\Model\Work\Procedure\Entity\Status;
use App\ReadModel\Profile\ProfileFetcher;
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;
//TODO: Воутер не доделан!
class ProcedureOldVoter extends Voter
{
public const PROCEDURE_LIST = 'procedure_list';
public const PROCEDURE_LIST_OWNER = 'procedure_list_owner';
public const PROCEDURE_SHOW = 'procedure_show_old';
public const PROCEDURE_CREATE = 'procedure_create';
public const PROCEDURE_EDIT = 'procedure_edit';
public const PROCEDURE_RECALL = 'procedure_recall';
public const PROCEDURE_SIGN_XML = 'procedure_sign_xml';
public const PROCEDURE_UPLOAD_FILE_TO = 'procedure_upload_file_to';
public const PROCEDURE_CREATE_PROTOCOL = 'procedure_create_protocol';
public const PROCEDURE_DELETE_FILE_TO = 'procedure_delete_file_to';
private $security;
private $profileFetcher;
public function __construct(Security $security, ProfileFetcher $profileFetcher)
{
$this->security = $security;
$this->profileFetcher = $profileFetcher;
}
protected function supports(string $attribute, $subject): bool
{
return in_array($attribute, [self::PROCEDURE_LIST, self::PROCEDURE_LIST_OWNER, self::PROCEDURE_SHOW, self::PROCEDURE_CREATE, self::PROCEDURE_EDIT, self::PROCEDURE_RECALL, self::PROCEDURE_SIGN_XML, self::PROCEDURE_UPLOAD_FILE_TO, self::PROCEDURE_CREATE_PROTOCOL, self::PROCEDURE_DELETE_FILE_TO], true);
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
if ($this->security->isGranted(RoleConstants::moderator()->getValue())) {
return true;
}
if ($this->security->isGranted(RoleConstants::acceptor()->getValue())) {
return true;
}
$user = $token->getUser();
if (!$user instanceof UserIdentity) {
return false;
}
if ($this->security->isGranted(RoleConstants::organizerCustomer()->getValue())) {
return true;
}
$profile = $this->profileFetcher->find($user->getProfileId());
switch ($attribute) {
case self::PROCEDURE_LIST:
return $user->isPermission(Permission::PROCEDURE_LIST);
break;
case self::PROCEDURE_LIST_OWNER:
return $user->isPermission(Permission::PROCEDURE_LIST_OWNER);
break;
case self::PROCEDURE_SHOW:
if ($profile !== null) {
if ($profile->isParticipant()) {
return $subject->status != Status::new()->getName();
}
}
return $user->isPermission(Permission::PROCEDURE_SHOW);
break;
case self::PROCEDURE_CREATE:
return $user->isPermission(Permission::PROCEDURE_CREATE);
break;
case self::PROCEDURE_EDIT:
return $user->isPermission(Permission::PROCEDURE_EDIT);
break;
case self::PROCEDURE_RECALL:
return $user->isPermission(Permission::PROCEDURE_RECALL);
break;
case self::PROCEDURE_SIGN_XML:
return $user->isPermission(Permission::PROCEDURE_SIGN_XML);
break;
case self::PROCEDURE_UPLOAD_FILE_TO:
return $user->isPermission(Permission::PROCEDURE_UPLOAD_FILE_TO);
break;
case self::PROCEDURE_DELETE_FILE_TO:
return $user->isPermission(Permission::PROCEDURE_DELETE_FILE_TO);
break;
case self::PROCEDURE_CREATE_PROTOCOL:
return $user->isPermission(Permission::PROCEDURE_CREATE_PROTOCOL);
break;
}
return false;
}
}