Browse Source

admin access

Vincent GUFFON 3 years ago
parent
commit
b742985b38

+ 0 - 4
config/api_platform/Access/access.yaml

@@ -7,10 +7,6 @@ App\Entity\Access\Access:
       path: '/students'
       security: 'is_granted("ROLE_USERS_VIEW")'
 
-    cget_admin:
-      method: GET
-      path: '/admin'
-
     cget_access_person_ref:
       method: GET
       path: '/access_people'

+ 81 - 0
src/ApiResources/Access/AdminAccess.php

@@ -0,0 +1,81 @@
+<?php
+declare(strict_types=1);
+
+namespace App\ApiResources\Access;
+
+use ApiPlatform\Core\Annotation\ApiProperty;
+use ApiPlatform\Core\Annotation\ApiResource;
+use App\ApiResources\ApiResourcesInterface;
+use JetBrains\PhpStorm\Pure;
+use Symfony\Component\Validator\Constraints as Assert;
+
+/**
+ * Classe resource qui contient les champs d'un compte admin
+ */
+#[ApiResource(
+    collectionOperations:[],
+    itemOperations: [
+        'get' => [
+            'method' => 'GET',
+            'path' => '/admin/{id}',
+            'defaults' => ['id' => 0]
+        ],
+        'put' => [
+            'method' => 'PUT',
+            'path' => '/admin/{id}',
+            'defaults' => ['id' => 0]
+        ]
+    ]
+)]
+class AdminAccess implements ApiResourcesInterface
+{
+    #[ApiProperty(identifier: true)]
+    public ?int $id = null;
+
+    private ?string $username = null;
+
+    #[Assert\Email(message: 'invalid-email-format', mode: 'strict')]
+    private ?string $email = null;
+
+
+    #[Pure] public function __construct()
+    {
+    }
+
+    public function getId(): ?int
+    {
+        return $this->id;
+    }
+
+    public function setId(?int $id): self
+    {
+        $this->id = $id;
+
+        return $this;
+    }
+
+    public function getUsername(): ?string
+    {
+        return $this->username;
+    }
+
+    public function setUsername(?string $username): self
+    {
+        $this->username = $username;
+
+        return $this;
+    }
+
+
+    public function getEmail(): ?string
+    {
+        return $this->email;
+    }
+
+    public function setEmail(?string $email): self
+    {
+        $this->email = $email;
+
+        return $this;
+    }
+}

+ 58 - 0
src/DataPersister/Access/AdminAccessDataPersister.php

@@ -0,0 +1,58 @@
+<?php
+declare(strict_types=1);
+
+namespace App\DataPersister\Access;
+
+use ApiPlatform\Core\DataPersister\ContextAwareDataPersisterInterface;
+use App\Entity\Access\Access;
+use App\Service\Access\Utils;
+use App\Service\Core\ContactPointUtils;
+use Exception;
+use App\ApiResources\Access\AdminAccess;
+use Doctrine\ORM\EntityManagerInterface;
+use Symfony\Component\Security\Core\Security;
+
+
+/**
+ * Classe AdminAccessDataPersister qui est un custom dataPersister gérant la resource AdminAccess
+ */
+class AdminAccessDataPersister implements ContextAwareDataPersisterInterface
+{
+    public function __construct(
+        private Security $security,
+        private EntityManagerInterface $entityManager,
+        private Utils $accessUtils,
+        private ContactPointUtils $contactPointUtils
+    )
+    { }
+
+    public function supports($data, array $context = []): bool
+    {
+        return $data instanceof AdminAccess;
+    }
+
+    /**
+     * @param AdminAccess $data
+     * @param array $context
+     * @return void|null
+     */
+    public function persist($data, array $context = [])
+    {
+        /** @var Access $access */
+        $access = $this->security->getUser();
+
+        $administrator = $this->accessUtils->getAdminAccess($access->getOrganization());
+        if(!$administrator) return null;
+
+        $contactPoint = $this->contactPointUtils->getPersonContactPointPrincipal($administrator);
+        if(!$contactPoint) return null;
+
+        $contactPoint->setEmail($data->getEmail());
+        $this->entityManager->flush();
+    }
+
+    public function remove($data, array $context = [])
+    {
+        throw new Exception('not supported', 500);
+    }
+}

+ 37 - 0
src/DataProvider/Access/AdminAccessDataProvider.php

@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\DataProvider\Access;
+
+use ApiPlatform\Core\DataProvider\ItemDataProviderInterface;
+use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
+use App\ApiResources\Access\AdminAccess;
+use App\Entity\Access\Access;
+use App\Service\Access\AdminAccessUtils;
+use Symfony\Component\Security\Core\Security;
+
+/**
+ * Class AccessProfileDataProvider : custom provider pour la resource AdminAccess
+ * @package App\DataProvider\Access
+ */
+final class AdminAccessDataProvider implements ItemDataProviderInterface, RestrictedDataProviderInterface
+{
+    public function __construct(
+        private Security $security,
+        private AdminAccessUtils $adminAccessUtils
+    )
+    { }
+
+    public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
+    {
+        return AdminAccess::class === $resourceClass;
+    }
+
+    public function getItem(string $resourceClass, $id, string $operationName = null, array $context = []): ?AdminAccess
+    {
+        /** @var Access $access */
+        $access = $this->security->getUser();
+        return $this->adminAccessUtils->getAdminAccess($access->getOrganization());
+    }
+}

+ 44 - 0
src/Service/Access/AdminAccessUtils.php

@@ -0,0 +1,44 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Service\Access;
+
+use App\ApiResources\Access\AdminAccess;
+use App\Entity\Organization\Organization;
+use App\Service\Core\ContactPointUtils;
+use App\Test\Service\Access\AdminAccessUtilsTest;
+
+/**
+ * Class AdminAccessUtils : Service contenant les manipulations associés à la ressource AdminAccess
+ * @package App\Service\Access
+ */
+class AdminAccessUtils
+{
+    public function __construct(
+        private Utils $accessUtils,
+        private ContactPointUtils $contactPointUtils
+    )
+    { }
+
+    /**
+     * Renvoi l'objet AdminAccess initialisé par rapport à l'organization passée en paramètre
+     * @param Organization $organization
+     * @return AdminAccess|null
+     * @see AdminAccessUtilsTest::testGetAdminAccess()
+     */
+    public function getAdminAccess(Organization $organization): AdminAccess | null{
+        $administrator = $this->accessUtils->getAdminAccess($organization);
+        if(!$administrator) return null;
+
+        $contactPoint = $this->contactPointUtils->getPersonContactPointPrincipal($administrator);
+        if(!$contactPoint) return null;
+
+        $adminAccess = new AdminAccess();
+        $adminAccess
+            ->setId($administrator->getId())
+            ->setUsername($administrator->getPerson()->getUsername())
+            ->setEmail($contactPoint->getEmail())
+        ;
+        return $adminAccess;
+    }
+}

+ 32 - 0
src/Service/Core/ContactPointUtils.php

@@ -0,0 +1,32 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Service\Core;
+
+use App\Entity\Access\Access;
+use App\Entity\Core\ContactPoint;
+use App\Enum\Core\ContactPointTypeEnum;
+use App\Repository\Core\ContactPointRepository;
+use App\Test\Service\Access\ContactPointUtilsTest;
+
+
+/**
+ * Classe ContactPointUtils qui possédant les fonctions utils à l'entité ContactPoint
+ */
+class ContactPointUtils
+{
+    public function __construct(private ContactPointRepository $contactPointRepository){
+    }
+
+    /**
+     * Renvoie le point de contact principal de l'Access passé en paramètre
+     * @param Access $access
+     * @return array|null
+     * @see ContactPointUtilsTest::testGetPersonContactPointPrincipal()
+     */
+    public function getPersonContactPointPrincipal(Access $access): ContactPoint | null{
+        $contactPoint = $this->contactPointRepository->getByTypeAndPerson(ContactPointTypeEnum::PRINCIPAL()->getValue(), $access->getPerson());
+        if(count($contactPoint) !== 1) return null;
+        else return $contactPoint[0];
+    }
+}