<?php
namespace App\Security\Voter;
use App\Entity\User;
use App\Enum\PermissionEnum;
use App\Service\UserPermissionLookup;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class UserVoter extends Voter
{
/**
* @var UserPermissionLookup
*/
private $userPermissionLookup;
public function __construct(UserPermissionLookup $userPermissionLookup)
{
$this->userPermissionLookup = $userPermissionLookup;
}
protected function supports($attribute, $subject)
{
$arrayPermissions = [
PermissionEnum::EMPLOYEE_VIEW,
PermissionEnum::EMPLOYEE_EDIT,
PermissionEnum::EMPLOYEE_CREATE,
PermissionEnum::EMPLOYEE_DELETE,
PermissionEnum::CUSTOMER_VIEW,
PermissionEnum::CUSTOMER_EDIT,
PermissionEnum::CUSTOMER_CREATE,
PermissionEnum::CUSTOMER_DELETE,
PermissionEnum::CUSTOMER_LANDING_PAGE,
PermissionEnum::ASSIGNMENT_FINISH,
PermissionEnum::DOWNLOAD_FILE,
PermissionEnum::DASHBOARD_VIEW_ADMIN,
PermissionEnum::CUSTOMER_ALLOW_DELIVERY,
];
if (!\in_array($attribute, $arrayPermissions, true)) {
return false;
}
if (!$subject instanceof User) {
return false;
}
return true;
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
/** @var User $user */
$user = $token->getUser();
if (!$user instanceof UserInterface) {
return false;
}
switch ($attribute) {
case PermissionEnum::EMPLOYEE_EDIT:
return $this->employeeCanEdit($user);
case PermissionEnum::EMPLOYEE_VIEW:
return $this->employeeCanView($user);
case PermissionEnum::EMPLOYEE_CREATE:
return $this->employeeCanCreate($user);
case PermissionEnum::EMPLOYEE_DELETE:
return $this->employeeCanDelete($user);
case PermissionEnum::CUSTOMER_EDIT:
return $this->customerCanEdit($user);
case PermissionEnum::CUSTOMER_CREATE:
return $this->customerCanCreate($user);
case PermissionEnum::CUSTOMER_DELETE:
return $this->customerCanDelete($user);
case PermissionEnum::CUSTOMER_VIEW:
return $this->customerCanView($user);
case PermissionEnum::ASSIGNMENT_FINISH:
return $this->canViewFinishAssignment($user);
case PermissionEnum::CUSTOMER_LANDING_PAGE:
return $this->customerLandingPageCanView($user);
case PermissionEnum::DOWNLOAD_FILE:
return $this->canViewDownloadFile($user);
case PermissionEnum::DASHBOARD_VIEW_ADMIN:
return $this->canViewDashBoardAdmin($user);
case PermissionEnum::CUSTOMER_ALLOW_DELIVERY:
return $this->canAllowDelivery($user);
}
return false;
}
private function canViewDashBoardAdmin(User $user): bool
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::DASHBOARD_VIEW_ADMIN, $permissions, true)) {
return true;
}
return false;
}
private function customerCanView(User $user): bool
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::CUSTOMER_VIEW, $permissions, true)) {
return true;
}
return false;
}
private function customerCanEdit(User $user): bool
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::CUSTOMER_EDIT, $permissions, true)) {
return true;
}
return false;
}
private function customerCanCreate(User $user): bool
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::CUSTOMER_CREATE, $permissions, true)) {
return true;
}
return false;
}
private function customerCanDelete(User $user): bool
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::CUSTOMER_DELETE, $permissions, true)) {
return true;
}
return false;
}
private function employeeCanView(User $user): bool
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::EMPLOYEE_VIEW, $permissions, true)) {
return true;
}
return false;
}
private function employeeCanEdit(User $user): bool
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::EMPLOYEE_EDIT, $permissions, true)) {
return true;
}
return false;
}
private function employeeCanCreate(User $user): bool
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::EMPLOYEE_CREATE, $permissions, true)) {
return true;
}
return false;
}
private function employeeCanDelete(User $user): bool
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::EMPLOYEE_DELETE, $permissions, true)) {
return true;
}
return false;
}
private function canViewFinishAssignment(User $user): bool
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::ASSIGNMENT_FINISH, $permissions, true)) {
return true;
}
return false;
}
private function customerLandingPageCanView(User $user): bool
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::CUSTOMER_LANDING_PAGE, $permissions, true)) {
return true;
}
return false;
}
private function canViewDownloadFile(User $user): bool
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::DOWNLOAD_FILE, $permissions, true)) {
return true;
}
return false;
}
private function canAllowDelivery(User $user): bool
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::CUSTOMER_ALLOW_DELIVERY, $permissions, true)) {
return true;
}
return false;
}
}