<?php
namespace App\LawFirm\Security;
use AppBundle\Entity\Category\AbstractCategoryPreset;
use AppBundle\Entity\Category\TimeCategoryPreset;
use AppBundle\Entity\User;
use AppBundle\Enum\CategoryPreset\TimeCategoryPresetEnum;
use AppBundle\Repository\ActivityEntryRepository;
use AppBundle\Repository\ChronometerRepository;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Contracts\Translation\TranslatorInterface;
class ActivityCategoryVoter extends Voter
{
public const REMOVE = 'remove';
private ChronometerRepository $chronometerRepository;
private ActivityEntryRepository $activityRepository;
private TranslatorInterface $translator;
/**
* @param ChronometerRepository $chronometerRepository
* @param ActivityEntryRepository $activityRepository
* @param TranslatorInterface $translator
*/
public function __construct(ChronometerRepository $chronometerRepository, ActivityEntryRepository $activityRepository, TranslatorInterface $translator)
{
$this->chronometerRepository = $chronometerRepository;
$this->activityRepository = $activityRepository;
$this->translator = $translator;
}
/**
* @inheritDoc
*/
protected function supports($attribute, $subject)
{
if (self::REMOVE === $attribute && $subject instanceof AbstractCategoryPreset) {
return true;
}
return false;
}
/**
* {@inheritdoc}
*/
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
$user = $token->getUser();
if (!$user instanceof User) {
return false;
}
$lawFirm = $user->getLawFirm();
$usedByChronometer = $this->chronometerRepository->count([
'lawFirm' => $lawFirm,
'timeCategory' => $subject,
]) > 0;
$usedByActivity = $this->activityRepository->count([
'lawFirm' => $lawFirm,
'category' => $subject,
]) > 0;
$protectedPreset = false;
if ($lawFirm && $subject instanceof TimeCategoryPreset) {
$mailLabel = $this->translator->trans(TimeCategoryPresetEnum::getChoiceLabel(TimeCategoryPresetEnum::MAIL), [], null, $lawFirm->getLanguage());
if ($subject->getLabel() === $mailLabel) {
$protectedPreset = true;
}
}
return !$protectedPreset && !$usedByChronometer && !$usedByActivity;
}
}