<?php
declare(strict_types=1);
namespace Bdm\BackofficeBundle\Security\Authorization\Voter;
use Bdm\OAuth2Bundle\Entity\AccessToken;
use Bdm\PublicApiBundle\Entity\Salerecord;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
class SalerecordVoter extends Voter
{
const VIEW = 'VIEW';
/**
* @param EntityManager $oEntityManager entity manager
*/
public function __construct(
private readonly EntityManager $oEntityManager
) {
}
/**
* @param string $sAttribute attribute
* @param mixed $oSubject subject
* @return bool
*/
public function supports($sAttribute, $oSubject)
{
if (!in_array($sAttribute, [self::VIEW])) {
return false;
}
if (!$oSubject instanceof Salerecord) {
return false;
}
return true;
}
/**
* @param string $sAttribute attribute
* @param Salerecord $oSalerecord Salerecord
* @param TokenInterface $oToken token
*
* @return bool
*/
public function voteOnAttribute($sAttribute, $oSalerecord, TokenInterface $oToken)
{
$oAccessToken = $this->oEntityManager
->getRepository(AccessToken::class)
->findOneBy(['token' => $oToken->getToken()]);
$oMerchant = $oAccessToken->getClient()->getMerchant();
return $oMerchant == $oSalerecord->getSeller()->getApplication()->getMerchant();
}
}