src/LawFirm/Security/ActivityCategoryVoter.php line 15

Open in your IDE?
  1. <?php
  2. namespace App\LawFirm\Security;
  3. use AppBundle\Entity\Category\AbstractCategoryPreset;
  4. use AppBundle\Entity\Category\TimeCategoryPreset;
  5. use AppBundle\Entity\User;
  6. use AppBundle\Enum\CategoryPreset\TimeCategoryPresetEnum;
  7. use AppBundle\Repository\ActivityEntryRepository;
  8. use AppBundle\Repository\ChronometerRepository;
  9. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  10. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  11. use Symfony\Contracts\Translation\TranslatorInterface;
  12. class ActivityCategoryVoter extends Voter
  13. {
  14.     public const REMOVE 'remove';
  15.     private ChronometerRepository $chronometerRepository;
  16.     private ActivityEntryRepository $activityRepository;
  17.     private TranslatorInterface $translator;
  18.     /**
  19.      * @param ChronometerRepository $chronometerRepository
  20.      * @param ActivityEntryRepository $activityRepository
  21.      * @param TranslatorInterface $translator
  22.      */
  23.     public function __construct(ChronometerRepository $chronometerRepositoryActivityEntryRepository $activityRepositoryTranslatorInterface $translator)
  24.     {
  25.         $this->chronometerRepository $chronometerRepository;
  26.         $this->activityRepository $activityRepository;
  27.         $this->translator $translator;
  28.     }
  29.     /**
  30.      * @inheritDoc
  31.      */
  32.     protected function supports($attribute$subject)
  33.     {
  34.         if (self::REMOVE === $attribute && $subject instanceof AbstractCategoryPreset) {
  35.             return true;
  36.         }
  37.         return false;
  38.     }
  39.     /**
  40.      * {@inheritdoc}
  41.      */
  42.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  43.     {
  44.         $user $token->getUser();
  45.         if (!$user instanceof User) {
  46.             return false;
  47.         }
  48.         $lawFirm $user->getLawFirm();
  49.         $usedByChronometer $this->chronometerRepository->count([
  50.             'lawFirm' => $lawFirm,
  51.             'timeCategory' => $subject,
  52.         ]) > 0;
  53.         $usedByActivity $this->activityRepository->count([
  54.             'lawFirm' => $lawFirm,
  55.             'category' => $subject,
  56.         ]) > 0;
  57.         $protectedPreset false;
  58.         if ($lawFirm && $subject instanceof TimeCategoryPreset) {
  59.             $mailLabel $this->translator->trans(TimeCategoryPresetEnum::getChoiceLabel(TimeCategoryPresetEnum::MAIL), [], null$lawFirm->getLanguage());
  60.             if ($subject->getLabel() === $mailLabel) {
  61.                 $protectedPreset true;
  62.             }
  63.         }
  64.         return !$protectedPreset && !$usedByChronometer && !$usedByActivity;
  65.     }
  66. }