src/Infrastructure/Security/DiagnosticValidationVoter.php line 13

Open in your IDE?
  1. <?php
  2. namespace App\Infrastructure\Security;
  3. use App\Domain\Common\Entity\EnregistrementDiagnostic;
  4. use App\Domain\Common\Entity\User;
  5. use App\Domain\Common\Enum\EnregistrementDiagnosticStateEnum;
  6. use App\Domain\Common\Enum\EntrepriseValidationTypeEnum;
  7. use App\Domain\Common\Enum\UserTypeEnum;
  8. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  9. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  10. class DiagnosticValidationVoter extends Voter
  11. {
  12.     public const SHOW_VALIDATION_PAGE 'SHOW_VALIDATION_PAGE';
  13.     public const VALIDATE_DIAGNOSTIC 'VALIDATE_DIAGNOSTIC';
  14.     protected function supports(string $attribute$subject): bool
  15.     {
  16.         if (!$subject instanceof EnregistrementDiagnostic) {
  17.             return false;
  18.         }
  19.         return \in_array($attribute, [self::SHOW_VALIDATION_PAGEself::VALIDATE_DIAGNOSTIC]);
  20.     }
  21.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  22.     {
  23.         $user $token->getUser();
  24.         if (!$user instanceof User) {
  25.             return false;
  26.         }
  27.         /** @var EnregistrementDiagnostic $enregistrementDiagnostic */
  28.         $enregistrementDiagnostic $subject;
  29.         return match ($attribute) {
  30.             self::SHOW_VALIDATION_PAGE => $this->canShowValidationPage($enregistrementDiagnostic$user),
  31.             self::VALIDATE_DIAGNOSTIC => $this->canValidate($enregistrementDiagnostic$user),
  32.             default => false,
  33.         };
  34.     }
  35.     private function canShowValidationPage(EnregistrementDiagnostic $enregistrementDiagnosticUser $user): bool
  36.     {
  37.         $grantedUserTypes = [
  38.             UserTypeEnum::TYPE_ADMIN,
  39.             UserTypeEnum::TYPE_OPAC_VALIDATEUR_N1,
  40.             UserTypeEnum::TYPE_OPAC_VALIDATEUR_N2,
  41.             UserTypeEnum::TYPE_DIAGNOSTIQUEUR,
  42.         ];
  43.         return \in_array($user->getType(), $grantedUserTypes);
  44.     }
  45.     private function canValidate(EnregistrementDiagnostic $enregistrementDiagnosticUser $user): bool
  46.     {
  47.         $grantedUserTypes = [
  48.             UserTypeEnum::TYPE_ADMIN,
  49.             UserTypeEnum::TYPE_OPAC_VALIDATEUR_N1,
  50.             UserTypeEnum::TYPE_OPAC_VALIDATEUR_N2,
  51.         ];
  52.         if (EnregistrementDiagnosticStateEnum::STATE_WAITING_VALIDATION_N1 !== $enregistrementDiagnostic->getState()
  53.             && EnregistrementDiagnosticStateEnum::STATE_WAITING_VALIDATION_N2 !== $enregistrementDiagnostic->getState()) {
  54.             return false;
  55.         }
  56.         if (UserTypeEnum::TYPE_OPAC_VALIDATEUR_N1 === $user->getType()
  57.             && EnregistrementDiagnosticStateEnum::STATE_WAITING_VALIDATION_N2 === $enregistrementDiagnostic->getState()) {
  58.             return false;
  59.         }
  60.         if (UserTypeEnum::TYPE_OPAC_VALIDATEUR_N2 === $user->getType()
  61.             && EnregistrementDiagnosticStateEnum::STATE_WAITING_VALIDATION_N1 === $enregistrementDiagnostic->getState()
  62.             && EntrepriseValidationTypeEnum::VALIDATION_TYPE_1_STEP !== $enregistrementDiagnostic->getEntreprise()->getValidationType()) {
  63.             return false;
  64.         }
  65.         return \in_array($user->getType(), $grantedUserTypes);
  66.     }
  67. }