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_PAGE, self::VALIDATE_DIAGNOSTIC]);
  20. }
  21. protected function voteOnAttribute(string $attribute, $subject, TokenInterface $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 $enregistrementDiagnostic, User $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 $enregistrementDiagnostic, User $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. }