<?php
namespace App\Infrastructure\Security;
use App\Domain\Common\Entity\User;
use App\Domain\Common\Enum\UserTypeEnum;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
class DiagnosticIntegrationVoter extends Voter
{
public const SHOW_DIAGNOSTIC_INTEGRATION_UNIT = 'SHOW_DIAGNOSTIC_INTEGRATION_UNIT';
public const SHOW_DIAGNOSTIC_INTEGRATION_BULK = 'SHOW_DIAGNOSTIC_INTEGRATION_BULK';
protected function supports(string $attribute, $subject): bool
{
if (!\in_array($attribute, [self::SHOW_DIAGNOSTIC_INTEGRATION_UNIT, self::SHOW_DIAGNOSTIC_INTEGRATION_BULK])) {
return false;
}
return true;
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
$user = $token->getUser();
if (!$user instanceof User) {
return false;
}
if (UserTypeEnum::TYPE_ADMIN === $user->getType()) {
return true;
}
if (self::SHOW_DIAGNOSTIC_INTEGRATION_UNIT === $attribute) {
return $this->canUseUnitIntegration($user);
}
if (self::SHOW_DIAGNOSTIC_INTEGRATION_BULK === $attribute) {
return $this->canUseBulkIntegration($user);
}
return false;
}
protected function canUseUnitIntegration(User $user): bool
{
return \in_array($user->getType(), [
UserTypeEnum::TYPE_DIAGNOSTIQUEUR,
UserTypeEnum::TYPE_OPAC_VALIDATEUR_N1,
UserTypeEnum::TYPE_OPAC_VALIDATEUR_N2,
]);
}
protected function canUseBulkIntegration(User $user): bool
{
return \in_array($user->getType(), [
UserTypeEnum::TYPE_DIAGNOSTIQUEUR,
UserTypeEnum::TYPE_OPAC_VALIDATEUR_N1,
UserTypeEnum::TYPE_OPAC_VALIDATEUR_N2,
]);
return UserTypeEnum::TYPE_DIAGNOSTIQUEUR === $user->getType();
}
}