<?php
namespace Nen\Bundle\QuestionnaireBundle\Security\Voter;
use App\Entity\Questionnaire;
use App\Entity\User;
use Nen\Bundle\QuestionnaireBundle\Factory\QuestionnaireRespondentServiceFactory;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class QuestionnaireVoter extends Voter
{
private QuestionnaireRespondentServiceFactory $questionnaireRespondentServiceFactory;
public function __construct(QuestionnaireRespondentServiceFactory $questionnaireRespondentServiceFactory)
{
$this->questionnaireRespondentServiceFactory = $questionnaireRespondentServiceFactory;
}
protected function supports(string $attribute, $subject): bool
{
return $subject instanceof Questionnaire;
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
/** @var Questionnaire $questionnaire */
$questionnaire = $subject;
/** @var User $user */
$user = $token->getUser();
if (!$user instanceof UserInterface) {
return false;
}
switch ($attribute) {
case 'record':
return $this->record($questionnaire, $user);
case 'respond':
return $this->respond($questionnaire, $user);
}
return false;
}
private function record(Questionnaire $questionnaire, User $user): bool
{
return $questionnaire->getCompany()->getId() === $user->getCompany()->getId();
}
private function respond(Questionnaire $questionnaire, User $user): bool
{
$service = $this->questionnaireRespondentServiceFactory->build($questionnaire);
$respondent = $service->getRespondent();
return $respondent !== null;
}
}