<?php
namespace App\Security\Voter;
use App\Entity\Payment;
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 PaymentVoter extends Voter
{
/**
* @var UserPermissionLookup
*/
private $userPermissionLookup;
public function __construct(UserPermissionLookup $userPermissionLookup)
{
$this->userPermissionLookup = $userPermissionLookup;
}
protected function supports($attribute, $subject)
{
$arrayPermissions = [
PermissionEnum::PAYMENT_VIEW,
PermissionEnum::PAYMENT_EDIT,
PermissionEnum::PAYMENT_CREATE,
PermissionEnum::PAYMENT_DELETE,
PermissionEnum::PAYMENT_CANCEL,
PermissionEnum::PAYMENT_EXPORT_EXCEL_DETAIL,
PermissionEnum::PAYMENT_EXPORT_EXCEL_BALANCE,
];
if (!\in_array($attribute, $arrayPermissions, true)) {
return false;
}
if (!$subject instanceof Payment) {
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::PAYMENT_EDIT:
return $this->canEdit($user);
case PermissionEnum::PAYMENT_CREATE:
return $this->canCreate($user);
case PermissionEnum::PAYMENT_DELETE:
return $this->canDelete($user);
case PermissionEnum::PAYMENT_VIEW:
return $this->canView($user);
case PermissionEnum::PAYMENT_EXPORT_EXCEL_DETAIL:
return $this->canExportExcelDetail($user);
case PermissionEnum::PAYMENT_EXPORT_EXCEL_BALANCE:
return $this->canExportExcelBalance($user);
case PermissionEnum::PAYMENT_CANCEL:
return $this->canCancel($user);
}
return false;
}
private function canView(User $user)
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::PAYMENT_VIEW, $permissions, true)) {
return true;
}
return false;
}
private function canEdit(User $user)
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::PAYMENT_EDIT, $permissions, true)) {
return true;
}
return false;
}
private function canCreate(User $user)
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::PAYMENT_CREATE, $permissions, true)) {
return true;
}
return false;
}
private function canDelete(User $user)
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::PAYMENT_DELETE, $permissions, true)) {
return true;
}
return false;
}
private function canCancel(User $user)
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::PAYMENT_CANCEL, $permissions, true)) {
return true;
}
return false;
}
private function canExportExcelBalance(User $user)
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::PAYMENT_EXPORT_EXCEL_BALANCE, $permissions, true)) {
return true;
}
return false;
}
private function canExportExcelDetail(User $user)
{
$permissions = $this->userPermissionLookup->findAllByUser($user);
if (\in_array(PermissionEnum::PAYMENT_EXPORT_EXCEL_DETAIL, $permissions, true)) {
return true;
}
return false;
}
}