<?php
namespace App\Security\Voter;
use App\Entity\ChannelUserData\Cursus\AbstractCursus;
use App\Entity\ChannelUserData\Cursus\FileAbstractCursus;
use Nellapp\Bundle\SDKBundle\Permission\Enum\ChannelUserPermissionEnum;
use Nellapp\Bundle\SDKBundle\Permission\Security\Voter\UserOwnerVoter;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
class CursusDriverVoter extends Voter
{
public const VIEW = 'view';
public const DELETE = 'delete';
public const PUT = 'put';
public const POST = 'post';
public const DOWNLOAD = 'download';
public function __construct(
private Security $security,
) {}
protected function supports(string $attribute, $subject): bool
{
return ($subject instanceof AbstractCursus || $subject instanceof FileAbstractCursus) && in_array($attribute, [self::VIEW, self::DELETE, self::PUT, self::POST, self::DOWNLOAD]);
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
if ($subject instanceof AbstractCursus) {
$cursus = $subject;
$file = null;
} else {
$cursus = $subject->getAbstractCursus();
$file = $subject;
}
$channel = $cursus->getChannel();
$isFileOwner = $file !== null && $this->security->isGranted(UserOwnerVoter::USER_OWNER, $file);
$isDriveOwner = $this->security->isGranted(UserOwnerVoter::USER_OWNER, $cursus);
if ($attribute === self::VIEW) {
return
$this->security->isGranted(ChannelUserPermissionEnum::CHANNEL_USER_PERM_DSA_SHOW_DRIVE, $channel)
|| $isDriveOwner && (!($file !== null) || $file->isShare())
;
} else if ($attribute === self::DELETE) {
return
$this->security->isGranted(ChannelUserPermissionEnum::CHANNEL_USER_PERM_DRIVE_DELETE, $channel)
|| $isFileOwner
;
} else if ($attribute === self::PUT) {
return
$this->security->isGranted(ChannelUserPermissionEnum::CHANNEL_USER_PERM_DRIVE_UPDATE, $channel)
|| $isFileOwner
;
} else if ($attribute === self::POST) {
return
$this->security->isGranted(ChannelUserPermissionEnum::CHANNEL_USER_PERM_DRIVE_IMPORT, $channel)
|| $isDriveOwner
;
} else if ($attribute === self::DOWNLOAD) {
return
$this->security->isGranted(ChannelUserPermissionEnum::CHANNEL_USER_PERM_DRIVE_DOWNLOAD, $channel)
|| $isDriveOwner && $file?->isShare()
;
}
return false;
}
}