<?php
namespace App\Security\Voter;
use App\DBAL\Types\HomeworkResultStatusEnum;
use App\Entity\HomeworkResult;
use App\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class HomeworkResultVoter extends Voter
{
const CHECK = 'homework_check';
const CAN_HANDOVER = 'can_handover';
protected function supports($attribute, $subject)
{
return in_array($attribute, [self::CHECK, self::CAN_HANDOVER])
&& $subject instanceof HomeworkResult;
}
/**
* @param string $attribute
* @param HomeworkResult $subject
* @param TokenInterface $token
*
* @return bool
*/
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
$user = $token->getUser();
// if the user is anonymous, do not grant access
if (!$user instanceof UserInterface) {
return false;
}
// ... (check conditions and return true to grant permission) ...
switch ($attribute) {
case self::CHECK:
/** @var User $student */
$student = $subject->getStudent();
if($student->getCurator()->getId() == $user->getId()) {
return true;
}
return false;
break;
case self::CAN_HANDOVER:
if (
!$subject->getId()
|| (
$user == $subject->getStudent()
&& (
$subject->getHomework()->getAutocheck()
&& $subject->hasAttempts()
|| (
!$subject->hasAttempts()
&& HomeworkResultStatusEnum::STATUS_ON_REVIEW == $subject->getStatus()
)
)
|| (
!$subject->getHomework()->getAutocheck()
&& HomeworkResultStatusEnum::STATUS_DONE != $subject->getStatus()
)
)
) {
return true;
}
break;
}
return false;
}
}