src/Security/Voter/AnnonceCommandVoter.php line 29

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * @author      Mehrez Labidi
  5.  */
  6. namespace App\Security\Voter;
  7. use App\Entity\Model\Annonces;
  8. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  9. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  10. use Symfony\Component\HttpFoundation\RequestStack;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use App\Entity\{
  13.     AnnoncesAcheteur,
  14.     AnnoncesVendeur,
  15.     DetailsCommande,
  16.     Commandes
  17. };
  18. /**
  19.  * Voter de sécurité pour l'accès aux annonces commandées par l'utilisateur.
  20.  *
  21.  * Vérifie que l'utilisateur connecté a bien passé une commande liée à l'annonce
  22.  * (acheteur ou vendeur) et que cette commande est dans un état valide
  23.  * (information transmise ou facture envoyée) avant d'autoriser l'accès.
  24.  */
  25. class AnnonceCommandVoter extends Voter {
  26.     public const ANNONCE_COMMANDE 'ANNONCE_COMMANDE';
  27.     private $requestStack;
  28.     private $em;
  29.     public function __construct(RequestStack $requestStackEntityManagerInterface $em) {
  30.         $this->requestStack $requestStack;
  31.         $this->em $em;
  32.     }
  33.     protected function supports(string $attribute$subject): bool {
  34.         $subject $this->transformArrayToFakeObjAnnonce($subject);
  35.         return $attribute === self::ANNONCE_COMMANDE && $subject instanceof Annonces;
  36.     }
  37.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool {
  38.         $request $this->requestStack->getCurrentRequest();
  39.         if (!$request || !$subject) {
  40.             return false;
  41.         }
  42.         $user $token->getUser();
  43.         if (!$user) {
  44.             return false;
  45.         }
  46.         $subject $this->transformArrayToFakeObjAnnonce($subject);
  47.         $idAnnonce $subject->getId();
  48.         $typeRapprochement $subject->getTypeRaprochement();
  49.         if (in_array($typeRapprochementAnnonces::$TYPE_RAPROCHEMENT_VENDEUR)) {
  50.             $qb $this->em->createQueryBuilder();
  51.             $result $qb->select('c.etat')
  52.                     ->from(AnnoncesVendeur::class, 'av')
  53.                     ->leftJoin(DetailsCommande::class, 'dc''WITH''av.id_annonce_vendeur = dc.id_annonce AND dc.type_annonce = :type_annonce')
  54.                     ->leftJoin(Commandes::class, 'c''WITH''c.id_commande = dc.id_commande')
  55.                     ->where('dc.id_cpte_utilisateur = :user')->setParameter('user'$user->getLogin())
  56.                     ->andWhere('av.id_annonce_vendeur = :idAnnonce')->setParameter('idAnnonce'$idAnnonce)
  57.                     ->setParameter('type_annonce''vendeur')
  58.                     ->setMaxResults(1)
  59.                     ->getQuery()
  60.                     ->getOneOrNullResult();
  61.             return $result !== null && !empty($result['etat']) && (in_array($result['etat'], ['information_transmise''facture_envoyee''cmde_valide']));
  62.         }
  63.         if (in_array($typeRapprochementAnnonces::$TYPE_RAPROCHEMENT_ACHETEUR)) {
  64.             $qb $this->em->createQueryBuilder();
  65.             $result $qb->select('c.etat')
  66.                     ->from(AnnoncesAcheteur::class, 'aa')
  67.                     ->leftJoin(DetailsCommande::class, 'dc''WITH''aa.id_annonce_acheteur = dc.id_annonce AND dc.type_annonce = :type_annonce')
  68.                     ->leftJoin(Commandes::class, 'c''WITH''c.id_commande = dc.id_commande')
  69.                     ->where('dc.id_cpte_utilisateur = :user')
  70.                     ->andWhere('aa.id_annonce_acheteur = :idAnnonce')->setParameter('idAnnonce'$idAnnonce)
  71.                     ->setParameter('type_annonce''acheteur')->setParameter('user'$user->getLogin())
  72.                     ->setMaxResults(1)
  73.                     ->getQuery()
  74.                     ->getOneOrNullResult();
  75.             return $result !== null && !empty($result['etat']) && (in_array($result['etat'], ['information_transmise''facture_envoyee''cmde_valide']));
  76.         }
  77.         return false;
  78.     }
  79.     /**
  80.      * Transforme un tableau associatif en objet factice d'annonce (AnnoncesVendeur ou AnnoncesAcheteur).
  81.      *
  82.      * @param array|mixed $subject Tableau contenant les données de l'annonce ou objet déjà existant.
  83.      * @return AnnoncesVendeur|AnnoncesAcheteur|mixed L'objet factice créé ou le sujet original si non transformable.
  84.      */
  85.     private function transformArrayToFakeObjAnnonce($subject) {
  86.         if (is_array($subject) && !empty($subject)) {
  87.             if (!empty($subject['type_annonce']) && $subject['type_annonce'] == 'vendeur') {
  88.                 $fakeObj = new AnnoncesVendeur();
  89.                 $fakeObj->_set("id_annonce_vendeur"$subject['id_annonce']);
  90.                 $fakeObj->_set("type_raprochement""cession");
  91.             }
  92.             if (!empty($subject['type_annonce']) && $subject['type_annonce'] == 'acheteur') {
  93.                 $fakeObj = new AnnoncesAcheteur();
  94.                 $fakeObj->_set("id_annonce_acheteur"$subject['id_annonce']);
  95.                 $fakeObj->_set("type_raprochement""acquisition");
  96.             }
  97.             return $fakeObj;
  98.         } else {
  99.             return $subject;
  100.         }
  101.     }
  102. }