Browse Source

Access Extension

Vincent GUFFON 4 years ago
parent
commit
c65ac7bddd

+ 7 - 4
src/Doctrine/Access/AccessExtension.php

@@ -17,23 +17,25 @@ use Symfony\Component\Security\Core\Security;
 final class AccessExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
 {
     private Security $security;
+    private HandleAccessExtension $handleAccessExtension;
 
-    public function __construct(Security $security)
+    public function __construct(Security $security, HandleAccessExtension $handleAccessExtension)
     {
         $this->security = $security;
+        $this->handleAccessExtension = $handleAccessExtension;
     }
 
     public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null): void
     {
-        $this->addWhere($queryBuilder, $resourceClass);
+        $this->addWhere($queryBuilder, $resourceClass, $operationName);
     }
 
     public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null, array $context = []): void
     {
-        $this->addWhere($queryBuilder, $resourceClass);
+        $this->addWhere($queryBuilder, $resourceClass, $operationName);
     }
 
-    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void
+    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass, string $operationName): void
     {
         if (Access::class !== $resourceClass) {
             return;
@@ -45,5 +47,6 @@ final class AccessExtension implements QueryCollectionExtensionInterface, QueryI
         $queryBuilder->andWhere(sprintf('%s.organization = :current_organization', $rootAlias));
         $queryBuilder->setParameter('current_organization', $currentUser->getOrganization());
 
+        $this->handleAccessExtension->addWhere($queryBuilder, $operationName);
     }
 }

+ 11 - 0
src/Doctrine/Access/AccessExtensionInterface.php

@@ -0,0 +1,11 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Doctrine\Access;
+
+use Doctrine\ORM\QueryBuilder;
+
+interface AccessExtensionInterface{
+    public function support(string $name);
+    public function addWhere(QueryBuilder $queryBuilder);
+}

+ 21 - 0
src/Doctrine/Access/Extensions/AdminExtension.php

@@ -0,0 +1,21 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Doctrine\Access\Extensions;
+
+use App\Doctrine\Access\AccessExtensionInterface;
+use Doctrine\ORM\QueryBuilder;
+
+class AdminExtension implements AccessExtensionInterface {
+    public function support(string $name)
+    {
+        return $name === 'cget_admin';
+    }
+
+    public function addWhere(QueryBuilder $queryBuilder)
+    {
+        $rootAlias = $queryBuilder->getRootAliases()[0];
+        $queryBuilder->andWhere(sprintf('%s.adminAccess = :adminAccess', $rootAlias));
+        $queryBuilder->setParameter('adminAccess', true);
+    }
+}

+ 19 - 0
src/Doctrine/Access/Extensions/StudentsExtension.php

@@ -0,0 +1,19 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Doctrine\Access\Extensions;
+
+use App\Doctrine\Access\AccessExtensionInterface;
+use Doctrine\ORM\QueryBuilder;
+
+class StudentsExtension implements AccessExtensionInterface {
+    public function support(string $name)
+    {
+        return $name === 'cget_students';
+    }
+
+    public function addWhere(QueryBuilder $queryBuilder)
+    {
+        dd('ok');
+    }
+}

+ 24 - 0
src/Doctrine/Access/HandleAccessExtension.php

@@ -0,0 +1,24 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Doctrine\Access;
+
+use Doctrine\ORM\QueryBuilder;
+
+class HandleAccessExtension{
+    /** @var iterable<AccessExtensionInterface>  */
+    private iterable $extension;
+
+    public function __construct(iterable $extensions)
+    {
+        $this->extension = $extensions;
+    }
+
+    public function addWhere(QueryBuilder $queryBuilder, $operationName){
+        /** @var AccessExtensionInterface $extension */
+        foreach ($this->extension as $extension){
+            if($extension->support($operationName))
+                return $extension->addWhere($queryBuilder);
+        }
+    }
+}