<?php
namespace Crea\HRBundle\Voter;
use Crea\HRBundle\Entity\PlanningComment;
use Crea\HRBundle\Entity\PlanningEvent;
use Crea\HRBundle\Entity\PlanningLeave;
use Crea\HRBundle\Provider\HRRightCodeProvider;
use Exception;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
use Crea\SecurityBundle\Entity\User;
class HRVoter extends Voter
{
/**
* @inheritDoc
* @throws Exception
*/
protected function supports($attribute, $subject): bool
{
$attributes = [
HRRightCodeProvider::PLANNING_LEAVE_LIST,
HRRightCodeProvider::PLANNING_LEAVE_CREATE,
HRRightCodeProvider::PLANNING_EVENT_LIST,
HRRightCodeProvider::PLANNING_EVENT_CREATE,
HRRightCodeProvider::PLANNING_COMMENT_LIST,
HRRightCodeProvider::PLANNING_COMMENT_CREATE
];
if ($subject instanceof PlanningLeave) {
$attributes[] = HRRightCodeProvider::PLANNING_LEAVE_UPDATE;
$attributes[] = HRRightCodeProvider::PLANNING_LEAVE_REMOVE;
}
if ($subject instanceof PlanningEvent) {
$attributes[] = HRRightCodeProvider::PLANNING_EVENT_UPDATE;
$attributes[] = HRRightCodeProvider::PLANNING_EVENT_REMOVE;
}
if ($subject instanceof PlanningComment) {
$attributes[] = HRRightCodeProvider::PLANNING_COMMENT_UPDATE;
$attributes[] = HRRightCodeProvider::PLANNING_COMMENT_REMOVE;
}
return in_array($attribute, $attributes);
}
/**
* @inheritDoc
* @throws Exception
*/
protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool
{
/** @var User $loggedUser */
$loggedUser = $token->getUser();
if (!$loggedUser instanceof UserInterface) {
return false;
}
switch ($attribute) {
case HRRightCodeProvider::PLANNING_LEAVE_LIST:
return $this->voteOnPlanningLeaveList($loggedUser);
case HRRightCodeProvider::PLANNING_LEAVE_CREATE:
return $this->voteOnPlanningLeaveCreate($loggedUser);
case HRRightCodeProvider::PLANNING_EVENT_LIST:
return $this->voteOnPlanningEventList($loggedUser);
case HRRightCodeProvider::PLANNING_EVENT_CREATE:
return $this->voteOnPlanningEventCreate($loggedUser);
case HRRightCodeProvider::PLANNING_COMMENT_LIST:
return $this->voteOnPlanningCommentList($loggedUser);
case HRRightCodeProvider::PLANNING_COMMENT_CREATE:
return $this->voteOnPlanningCommentCreate($loggedUser);
}
if ($subject instanceof PlanningLeave) {
switch ($attribute) {
case HRRightCodeProvider::PLANNING_LEAVE_UPDATE:
return $this->voteOnPlanningLeaveUpdate($loggedUser);
case HRRightCodeProvider::PLANNING_LEAVE_REMOVE:
return $this->voteOnPlanningLeaveRemove($loggedUser);
}
}
if ($subject instanceof PlanningEvent) {
switch ($attribute) {
case HRRightCodeProvider::PLANNING_EVENT_UPDATE:
return $this->voteOnPlanningEventUpdate($loggedUser);
case HRRightCodeProvider::PLANNING_EVENT_REMOVE:
return $this->voteOnPlanningEventRemove($loggedUser);
}
}
if ($subject instanceof PlanningComment) {
switch ($attribute) {
case HRRightCodeProvider::PLANNING_COMMENT_UPDATE:
return $this->voteOnPlanningCommentUpdate($loggedUser);
case HRRightCodeProvider::PLANNING_COMMENT_REMOVE:
return $this->voteOnPlanningCommentRemove($loggedUser);
}
}
return false;
}
/**
* @throws Exception
*/
private function voteOnPlanningLeaveList(UserInterface $loggedUser): bool
{
return in_array(HRRightCodeProvider::PLANNING_LEAVE_LIST, $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnPlanningLeaveCreate(UserInterface $loggedUser): bool
{
return in_array(HRRightCodeProvider::PLANNING_LEAVE_CREATE, $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnPlanningLeaveUpdate(UserInterface $loggedUser): bool
{
return in_array(HRRightCodeProvider::PLANNING_LEAVE_UPDATE, $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnPlanningLeaveRemove(UserInterface $loggedUser): bool
{
return in_array(HRRightCodeProvider::PLANNING_LEAVE_REMOVE, $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnPlanningEventList(UserInterface $loggedUser): bool
{
return in_array(HRRightCodeProvider::PLANNING_EVENT_LIST, $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnPlanningEventCreate(UserInterface $loggedUser): bool
{
return in_array(HRRightCodeProvider::PLANNING_EVENT_CREATE, $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnPlanningEventUpdate(UserInterface $loggedUser): bool
{
return in_array(HRRightCodeProvider::PLANNING_EVENT_UPDATE, $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnPlanningEventRemove(UserInterface $loggedUser): bool
{
return in_array(HRRightCodeProvider::PLANNING_EVENT_REMOVE, $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnPlanningCommentList(UserInterface $loggedUser): bool
{
return in_array(HRRightCodeProvider::PLANNING_COMMENT_LIST, $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnPlanningCommentCreate(UserInterface $loggedUser): bool
{
return in_array(HRRightCodeProvider::PLANNING_COMMENT_CREATE, $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnPlanningCommentUpdate(UserInterface $loggedUser): bool
{
return in_array(HRRightCodeProvider::PLANNING_COMMENT_UPDATE, $loggedUser->getRoles());
}
/**
* @throws Exception
*/
private function voteOnPlanningCommentRemove(UserInterface $loggedUser): bool
{
return in_array(HRRightCodeProvider::PLANNING_COMMENT_REMOVE, $loggedUser->getRoles());
}
}