<?php
namespace FMT\Application\Voter;
use EasyCorp\Bundle\EasyAdminBundle\Dto\MenuItemDto;
use EasyCorp\Bundle\EasyAdminBundle\Security\Permission;
use FMT\Data\Entity\User;
use FMT\Data\Enums\AdminPanelPermissions;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
class AdminPanelVoter extends Voter
{
/**
* @param $permissionName
* @param $subject
* @return bool
*/
protected function supports($permissionName, $subject): bool
{
return Permission::exists($permissionName);
}
/**
* @param $permissionName
* @param $subject
* @param TokenInterface $token
* @return bool
*/
protected function voteOnAttribute($permissionName, $subject, TokenInterface $token): bool
{
if (Permission::EA_VIEW_MENU_ITEM === $permissionName) {
return $this->voteOnViewMenuItemPermission($subject, $token);
}
return false;
}
/**
* @param MenuItemDto $menuItemDto
* @param TokenInterface $token
* @return bool
*/
private function voteOnViewMenuItemPermission(MenuItemDto $menuItemDto, TokenInterface $token): bool
{
/** @var User $user */
$user = $token->getUser();
if ($menuItemDto->getPermission() === AdminPanelPermissions::REPORT_VIEWER) {
return $user->hasRole(User::ROLE_MANAGER) || $user->hasRole(User::ROLE_SUPER_ADMIN);
}
if ($menuItemDto->getPermission() === AdminPanelPermissions::USER_SCHOOL_VIEWER) {
return $user->hasRole(User::ROLE_MANAGER) || $user->hasRole(User::ROLE_SUPER_ADMIN);
}
if ($menuItemDto->getPermission() === AdminPanelPermissions::EXTERNAL_USER_VIEWER) {
return $user->hasRole(User::ROLE_MANAGER) || $user->hasRole(User::ROLE_SUPER_ADMIN) || $user->hasRole(User::ROLE_SCHOOL_ADMIN);
}
if ($menuItemDto->getPermission() === AdminPanelPermissions::DONOR_USER_VIEWER) {
return $user->hasRole(User::ROLE_MANAGER) || $user->hasRole(User::ROLE_SUPER_ADMIN);
}
if ($menuItemDto->getPermission() === AdminPanelPermissions::STUDENT_USER_VIEWER) {
return $user->hasRole(User::ROLE_MANAGER) || $user->hasRole(User::ROLE_SUPER_ADMIN) || $user->hasRole(User::ROLE_SCHOOL_ADMIN);
}
return false;
}
}