Ver código fonte

Merge branch 'feature/access-preference' into develop

Vincent 11 meses atrás
pai
commit
a0568581ad

+ 1 - 0
config/opentalent/products.yaml

@@ -3,6 +3,7 @@ parameters:
       Core:
         entities:
           - AccessProfile
+          - Preferences
           - Tips
           - Notification
           - NotificationUser

+ 17 - 0
src/ApiResources/Profile/AccessProfile.php

@@ -83,6 +83,9 @@ class AccessProfile implements ApiResourcesInterface
     #[Groups('access_profile_read')]
     private ?AccessProfile $originalAccess = null;
 
+    #[Groups('access_profile_read')]
+    private ?int $preferencesId = null;
+
     #[Pure]
     public function __construct()
     {
@@ -299,6 +302,7 @@ class AccessProfile implements ApiResourcesInterface
     }
 
     /**
+     * return required for PHP Stan
      * @return bool[]
      */
     public function getHistorical(): array
@@ -307,6 +311,7 @@ class AccessProfile implements ApiResourcesInterface
     }
 
     /**
+     * param require for PHP Stan
      * @param bool[] $historical
      *
      * @return $this
@@ -317,4 +322,16 @@ class AccessProfile implements ApiResourcesInterface
 
         return $this;
     }
+
+    public function getPreferencesId(): ?int
+    {
+        return $this->preferencesId;
+    }
+
+    public function setPreferencesId(?int $preferencesId): self
+    {
+        $this->preferencesId = $preferencesId;
+
+        return $this;
+    }
 }

+ 18 - 0
src/Entity/Access/Access.php

@@ -300,6 +300,9 @@ class Access implements UserInterface, PasswordAuthenticatedUserInterface
     #[ORM\InverseJoinColumn(name: 'tag_id', referencedColumnName: 'id')]
     private Collection $tags;
 
+    #[ORM\OneToOne(mappedBy: 'access', cascade: ['persist'], fetch: 'EAGER', orphanRemoval: true)]
+    private ?Preferences $preferences;
+
     #[Pure]
     public function __construct()
     {
@@ -2138,4 +2141,19 @@ class Access implements UserInterface, PasswordAuthenticatedUserInterface
 
         return $this;
     }
+
+    public function setPreferences(?Preferences $preferences = null): self
+    {
+        if (!is_null($preferences)) {
+            $preferences->setAccess($this);
+        }
+        $this->preferences = $preferences;
+
+        return $this;
+    }
+
+    public function getPreferences(): ?Preferences
+    {
+        return $this->preferences;
+    }
 }

+ 70 - 0
src/Entity/Access/Preferences.php

@@ -0,0 +1,70 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Entity\Access;
+
+// use DH\Auditor\Provider\Doctrine\Auditing\Annotation\Auditable;
+use ApiPlatform\Metadata\ApiResource;
+use ApiPlatform\Metadata\Get;
+use ApiPlatform\Metadata\Put;
+use Doctrine\ORM\Mapping as ORM;
+
+/**
+ * Préférence pour un Access.
+ */
+// #[Auditable]
+#[ORM\Entity]
+#[ApiResource(
+    operations: [
+        new Get(
+            security: 'object.getAccess().getId() == user.getId()'
+        ),
+        new Put(
+            security: 'object.getAccess().getId() == user.getId()'
+        ),
+    ]
+)]
+class Preferences
+{
+    #[ORM\Id]
+    #[ORM\Column]
+    #[ORM\GeneratedValue]
+    private ?int $id = null;
+
+    #[ORM\OneToOne(inversedBy: 'preferences', fetch: 'EAGER')]
+    #[ORM\JoinColumn(nullable: true)]
+    private Access $access;
+
+    #[ORM\Column(options: ['default' => true])]
+    private bool $messageReport = true;
+
+    public function getId(): ?int
+    {
+        return $this->id;
+    }
+
+    public function getAccess(): ?Access
+    {
+        return $this->access;
+    }
+
+    public function setAccess(?Access $access): self
+    {
+        $this->access = $access;
+
+        return $this;
+    }
+
+    public function getMessageReport(): ?bool
+    {
+        return $this->messageReport;
+    }
+
+    public function setMessageReport(bool $messageReport): self
+    {
+        $this->messageReport = $messageReport;
+
+        return $this;
+    }
+}

+ 2 - 0
src/Entity/Public/PublicEvent.php

@@ -352,6 +352,7 @@ class PublicEvent
     public function setStructureLongitude(?float $structureLongitude): self
     {
         $this->structureLongitude = $structureLongitude;
+
         return $this;
     }
 
@@ -363,6 +364,7 @@ class PublicEvent
     public function setStructureLatitude(?float $structureLatitude): self
     {
         $this->structureLatitude = $structureLatitude;
+
         return $this;
     }
 

+ 22 - 2
src/Service/Access/AccessProfileCreator.php

@@ -6,9 +6,10 @@ namespace App\Service\Access;
 
 use App\ApiResources\Profile\AccessProfile;
 use App\Entity\Access\Access;
+use App\Entity\Access\Preferences;
 use App\Repository\Access\AccessRepository;
 use App\Service\Organization\OrganizationProfileCreator;
-use App\Test\Service\Access\AccessProfileCreatorTest;
+use Doctrine\ORM\EntityManagerInterface;
 use Symfony\Component\Security\Core\Exception\AuthenticationException;
 
 /**
@@ -20,6 +21,7 @@ class AccessProfileCreator
         private readonly OrganizationProfileCreator $organizationProfileCreator,
         private readonly AccessRepository $accessRepository,
         private readonly Utils $accessUtils,
+        private readonly EntityManagerInterface $entityManager,
     ) {
     }
 
@@ -37,6 +39,10 @@ class AccessProfileCreator
             throw new AuthenticationException('no_valid_access', 401);
         }
 
+        if (is_null($access->getPreferences())) {
+            $this->createPreferences($access);
+        }
+
         // L'Access en paramètre est celui de la connexion
         $mainAccessProfile = $this->createCompleteAccessProfile($access);
 
@@ -102,6 +108,20 @@ class AccessProfileCreator
             ->setIsSuperAdminAccess($access->getSuperAdminAccess())
             ->setOrganization(
                 $this->organizationProfileCreator->createLightOrganizationProfile($access->getOrganization())
-            );
+            )
+            ->setPreferencesId($access->getPreferences()->getId());
+    }
+
+    /**
+     * Créer l'entrée des Preferences en base.
+     *
+     * @see AccessProfileCreatorTest::testCreatePreferences()
+     *
+     * @return void
+     */
+    public function createPreferences(Access $access)
+    {
+        $access->setPreferences(new Preferences());
+        $this->entityManager->flush();
     }
 }

+ 42 - 5
tests/Unit/Service/Access/AccessProfileCreatorTest.php

@@ -5,6 +5,7 @@ namespace App\Tests\Unit\Service\Access;
 use App\ApiResources\Profile\AccessProfile;
 use App\ApiResources\Profile\OrganizationProfile;
 use App\Entity\Access\Access;
+use App\Entity\Access\Preferences;
 use App\Entity\Core\File;
 use App\Entity\Organization\Organization;
 use App\Entity\Person\Person;
@@ -15,6 +16,7 @@ use App\Service\Access\Utils as AccessUtils;
 use App\Service\Organization\OrganizationProfileCreator;
 use Doctrine\Common\Collections\ArrayCollection;
 use Doctrine\Common\Collections\Collection;
+use Doctrine\ORM\EntityManagerInterface;
 use PHPUnit\Framework\MockObject\MockObject;
 use PHPUnit\Framework\TestCase;
 use Symfony\Component\Security\Core\Exception\AuthenticationException;
@@ -31,12 +33,14 @@ class AccessProfileCreatorTest extends TestCase
     private MockObject|Organization $organization;
     private MockObject|Access $access;
     private MockObject|OrganizationProfile $organizationProfile;
+    private MockObject|EntityManagerInterface $entityManager;
 
     public function setUp(): void
     {
         $this->organizationProfileCreator = $this->getMockBuilder(OrganizationProfileCreator::class)->disableOriginalConstructor()->getMock();
         $this->accessRepository = $this->getMockBuilder(AccessRepository::class)->disableOriginalConstructor()->getMock();
         $this->accessUtils = $this->getMockBuilder(AccessUtils::class)->disableOriginalConstructor()->getMock();
+        $this->entityManager = $this->getMockBuilder(EntityManagerInterface::class)->disableOriginalConstructor()->getMock();
 
         $this->emptyCollection = $this->getMockBuilder(Collection::class)->getMock();
         $this->emptyCollection->method('isEmpty')->willReturn(true);
@@ -57,7 +61,7 @@ class AccessProfileCreatorTest extends TestCase
     {
         $this->accessProfileCreator = $this
             ->getMockBuilder(AccessProfileCreator::class)
-            ->setConstructorArgs([$this->organizationProfileCreator, $this->accessRepository, $this->accessUtils])
+            ->setConstructorArgs([$this->organizationProfileCreator, $this->accessRepository, $this->accessUtils, $this->entityManager])
             ->setMethodsExcept(['getAccessProfile'])
             ->getMock();
 
@@ -79,7 +83,7 @@ class AccessProfileCreatorTest extends TestCase
     {
         $accessProfileCreator = $this
             ->getMockBuilder(AccessProfileCreator::class)
-            ->setConstructorArgs([$this->organizationProfileCreator, $this->accessRepository, $this->accessUtils])
+            ->setConstructorArgs([$this->organizationProfileCreator, $this->accessRepository, $this->accessUtils, $this->entityManager])
             ->setMethodsExcept(['getAccessProfile'])
             ->getMock();
 
@@ -92,6 +96,17 @@ class AccessProfileCreatorTest extends TestCase
             ->with($this->access)
             ->willReturn([$this->access, $otherAccess1, $otherAccess2]);
 
+        // Find valid accesses
+        $this->access
+            ->method('getPreferences')
+            ->willReturn(null);
+
+        // create the profile
+        $accessProfileCreator
+            ->expects(self::once())
+            ->method('createPreferences')
+            ->with($this->access);
+
         // create the profile
         $accessProfileCreator
             ->expects(self::once())
@@ -169,7 +184,7 @@ class AccessProfileCreatorTest extends TestCase
     {
         $accessProfileCreator = $this
             ->getMockBuilder(AccessProfileCreator::class)
-            ->setConstructorArgs([$this->organizationProfileCreator, $this->accessRepository, $this->accessUtils])
+            ->setConstructorArgs([$this->organizationProfileCreator, $this->accessRepository, $this->accessUtils, $this->entityManager])
             ->setMethodsExcept(['getAccessProfile'])
             ->getMock();
 
@@ -215,7 +230,7 @@ class AccessProfileCreatorTest extends TestCase
     {
         $this->accessProfileCreator = $this
             ->getMockBuilder(AccessProfileCreator::class)
-            ->setConstructorArgs([$this->organizationProfileCreator, $this->accessRepository, $this->accessUtils])
+            ->setConstructorArgs([$this->organizationProfileCreator, $this->accessRepository, $this->accessUtils, $this->entityManager])
             ->setMethodsExcept(['createCompleteAccessProfile'])
             ->getMock();
 
@@ -352,7 +367,7 @@ class AccessProfileCreatorTest extends TestCase
     {
         $accessProfileCreator = $this
             ->getMockBuilder(AccessProfileCreator::class)
-            ->setConstructorArgs([$this->organizationProfileCreator, $this->accessRepository, $this->accessUtils])
+            ->setConstructorArgs([$this->organizationProfileCreator, $this->accessRepository, $this->accessUtils, $this->entityManager])
             ->setMethodsExcept(['createLightAccessProfile'])
             ->getMock();
 
@@ -365,9 +380,13 @@ class AccessProfileCreatorTest extends TestCase
         $person->expects(self::once())->method('getGender')->willReturn(GenderEnum::MISTER);
         $person->expects(self::once())->method('getImage')->willReturn($image);
 
+        $preferences = $this->getMockBuilder(Preferences::class)->getMock();
+        $preferences->expects(self::once())->method('getId')->willReturn(1);
+
         $this->access->expects(self::once())->method('getId')->willReturn(1);
         $this->access->method('getOrganization')->willReturn($this->organization);
         $this->access->method('getPerson')->willReturn($person);
+        $this->access->expects(self::once())->method('getPreferences')->willReturn($preferences);
         $this->access->expects(self::once())->method('getActivityYear')->willReturn(2020);
         $this->access->expects(self::once())->method('getSuperAdminAccess')->willReturn(false);
 
@@ -387,5 +406,23 @@ class AccessProfileCreatorTest extends TestCase
         $this->assertEquals(123, $accessProfile->getAvatarId());
         $this->assertFalse($accessProfile->getIsSuperAdminAccess());
         $this->assertEquals($this->organizationProfile, $accessProfile->getOrganization());
+        $this->assertEquals(1, $accessProfile->getPreferencesId());
+    }
+
+    /**
+     * @see AccessProfileCreator::createPreferences()
+     */
+    public function testCreatePreferences(): void
+    {
+        $accessProfileCreator = $this
+            ->getMockBuilder(AccessProfileCreator::class)
+            ->setConstructorArgs([$this->organizationProfileCreator, $this->accessRepository, $this->accessUtils, $this->entityManager])
+            ->setMethodsExcept(['createPreferences'])
+            ->getMock();
+
+        $this->access->expects(self::once())->method('setPreferences');
+        $this->entityManager->expects(self::once())->method('flush')->with($this->access);
+
+        $accessProfileCreator->createPreferences($this->access);
     }
 }