<?php
namespace App\Security\Voter;
use App\DBAL\Types\RoleEnumType;
use App\Entity\Lesson;
use App\Service\LessonAvailabilityCheckerService;
use App\Service\LessonWasReadBtnCheckerService;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
class LessonVoter extends Voter
{
const VIEW = 'view';
const VIEW_WAS_READ_BTN = 'view_was_read_btn';
const ADMIN_EDIT_MAIN = 'admin_edit_main';
const ADMIN_ADD_HOMEWORK = 'admin_add_homework';
const ADMIN_EDIT_HOMEWORK = 'admin_edit_homework';
const ADMIN_EDIT_ADDITINAL_LESSON_INFO = 'admin_edit_additinal_lesson_info';
private $checkerService;
private $btnCheckerService;
private Security $security;
public function __construct(
LessonAvailabilityCheckerService $checkerService,
LessonWasReadBtnCheckerService $btnCheckerService,
Security $security
) {
$this->checkerService = $checkerService;
$this->btnCheckerService = $btnCheckerService;
$this->security = $security;
}
// ROLE_ADMIN_WORK_EVALUATION_NEURO_CHECK_HOMEWORK_RESULT
protected function supports($attribute, $subject)
{
return in_array($attribute, [
self::VIEW, self::VIEW_WAS_READ_BTN,
self::ADMIN_EDIT_MAIN, self::ADMIN_ADD_HOMEWORK, self::ADMIN_EDIT_HOMEWORK, self::ADMIN_EDIT_ADDITINAL_LESSON_INFO,
])
&& $subject instanceof Lesson;
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
/** @var \App\Entity\User */
$user = $token->getUser();
switch ($attribute) {
case self::VIEW:
$state = $this->checkerService->check($subject, $token->getUser());
if (
in_array(
$state,
[
$this->checkerService::STATE_NOT_AVAILABLE,
$this->checkerService::STATE_CLOSE,
$this->checkerService::STATE_WILL_BE_OPEN,
]
)
) {
return false;
} else {
return true;
}
break;
case self::VIEW_WAS_READ_BTN:
return $this->btnCheckerService->check($subject, $token->getUser());
break;
case self::ADMIN_EDIT_MAIN:
return $this->security->isGranted('ROLE_ADMIN_LESSON_EDIT', $user)
&& !$user->hasRole(RoleEnumType::ROLE_ADMIN_LESSON_HOMEWORK_EDITOR)
|| $this->security->isGranted('ROLE_ADMIN_LESSON_EDITOR', $user)
;
case self::ADMIN_ADD_HOMEWORK:
return $this->security->isGranted('ROLE_ADMIN_LESSON_EDIT', $user)
&& !$user->hasRole(RoleEnumType::ROLE_ADMIN_LESSON_HOMEWORK_EDITOR)
|| $this->security->isGranted('ROLE_ADMIN_LESSON_EDITOR', $user)
;
case self::ADMIN_EDIT_ADDITINAL_LESSON_INFO:
return
$this->security->isGranted('ROLE_ADMIN_LESSON_EDIT', $user)
&& !$user->hasRole(RoleEnumType::ROLE_ADMIN_LESSON_HOMEWORK_EDITOR)
|| $this->security->isGranted('ROLE_ADMIN_LESSON_EDITOR', $user)
;
}
return false;
}
}