<?php
namespace App\ApiPlatform\Voter;
use App\Entity\Affectation;
use App\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
class AffectationVoter extends Voter
{
public const CREATE = 'CREATE';
public const EDIT = 'EDIT';
public const DELETE = 'DELETE';
public function __construct(private readonly Security $security)
{
}
protected function supports(string $attribute, $subject): bool
{
if (!$subject instanceof Affectation) {
return false;
}
return in_array($attribute, [self::CREATE, self::EDIT, self::DELETE]);
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
$user = $token->getUser();
if (!$user instanceof User) {
return false;
}
if ($user->isMasterAdmin()) {
return true;
}
switch ($attribute) {
case self::CREATE:
return $this->canCreate($user, $subject);
case self::EDIT:
case self::DELETE:
return $this->canEditOrDelete($user, $subject);
}
return false;
}
private function canCreate(User $user, Affectation $affectation): bool
{
if (!$affectation->getSite()) {
return false;
}
$siteId = $affectation->getSite()->getId();
$userHasAccess = false;
foreach ($user->getUserSites() as $userSite) {
if ($userSite->getSite()->getId() === $siteId) {
$userHasAccess = true;
break;
}
}
return $userHasAccess;
}
private function canEditOrDelete(User $user, Affectation $affectation): bool
{
if (!$affectation->getSite()) {
return false;
}
$siteId = $affectation->getSite()->getId();
$userHasAccess = false;
foreach ($user->getUserSites() as $userSite) {
if ($userSite->getSite()->getId() === $siteId) {
$userHasAccess = true;
break;
}
}
return $userHasAccess;
}
}