src/Entity/AdminGroup.php line 57

  1. <?php
  2. namespace App\Entity;
  3. use Doctrine\ORM\Mapping as ORM,
  4.     Doctrine\DBAL\Types\Types,
  5.     Doctrine\Common\Collections\Collection,
  6.     Doctrine\Common\Collections\ArrayCollection;
  7. use Symfony\Component\Serializer\Annotation\Groups,
  8.     Symfony\Component\Validator\Constraints as Assert;
  9. use ApiPlatform\Metadata\ApiResource,
  10.     ApiPlatform\Metadata\ApiProperty,
  11.     ApiPlatform\Metadata\Get,
  12.     ApiPlatform\Metadata\GetCollection,
  13.     ApiPlatform\Metadata\Post,
  14.     ApiPlatform\Metadata\Put,
  15.     ApiPlatform\Metadata\Delete,
  16.     ApiPlatform\Metadata\ApiFilter,
  17.     ApiPlatform\Doctrine\Orm\Filter\SearchFilter,
  18.     ApiPlatform\Doctrine\Orm\Filter\BooleanFilter,
  19.     ApiPlatform\Doctrine\Orm\Filter\OrderFilter;
  20. use App\Entity\Trait\IdTrait,
  21.     App\Entity\Trait\UuidTrait,
  22.     App\Entity\Trait\OrdStatTrait,
  23.     App\Entity\Trait\TimestampableTrait,
  24.     App\Entity\Interface\SimpleEntityInterface,
  25.     App\Entity\Interface\OrdStatableInterface,
  26.     App\Repository\AdminGroupRepository;
  27. use App\StateProvider\AdminGroupCollectionProvider,
  28.     App\Validator\Constraints\AdminGroup as CustomAssert;
  29. use App\Lib\Actions;
  30. use App\Lib\ModuleRoles;
  31. #[ApiResource(
  32.     description'Administration groups',
  33.     normalizationContext: ['groups' => ['read''read:' self::class]],
  34.     denormalizationContext: ['groups' => ['write']],
  35.     security'is_granted("' Admin::class . '")',
  36.     order: ['ord' => 'desc'],
  37.     operations: [
  38.         new GetCollection(providerAdminGroupCollectionProvider::class),
  39.         new Post(),
  40.         new Get(securityPostDenormalize'is_granted("' Actions::VIEW '", object)',),
  41.         new Put(securityPostDenormalize'is_granted("' Actions::EDIT '", object)',),
  42.         new Delete(securityPostDenormalize'is_granted("' Actions::DELETE '", object)',),
  43.     ],
  44.     extraProperties: ['standard_put' => false],
  45. )]
  46. #[ApiFilter(SearchFilter::class, properties: ['title' => 'partial'])]
  47. #[ApiFilter(BooleanFilter::class, properties: ['isSuperAdmin''stat'])]
  48. #[ApiFilter(OrderFilter::class, properties: ['title''isSuperAdmin''ord''stat''createdAt''updatedAt'])]
  49. #[ORM\Entity(repositoryClassAdminGroupRepository::class)]
  50. class AdminGroup implements SimpleEntityInterfaceOrdStatableInterface
  51. {
  52.     use IdTrait,
  53.         UuidTrait,
  54.         OrdStatTrait,
  55.         TimestampableTrait;
  56.     #[ApiProperty(description'Title')]
  57.     #[Groups(['read''write'])]
  58.     #[Assert\NotBlank]
  59.     #[ORM\Column(typeTypes::STRINGlength191uniquetrue)]
  60.     private string $title;
  61.     #[ApiProperty(description'Resources to which this group has access')]
  62.     #[Groups(['write'])]
  63.     #[CustomAssert\ValidResourceAccess]
  64.     #[ORM\Column(typeTypes::JSON)]
  65.     private array $resourceAccess = [];
  66.     #[ApiProperty(description'Is super admin')]
  67.     #[Groups(['read''write'])]
  68.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => false])]
  69.     private bool $isSuperAdmin false;
  70.     #[ApiProperty(description'Is openform')]
  71.     #[Groups(['openform'])]
  72.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => false])]
  73.     private bool $isOpenform false;
  74.     #[ApiProperty(description'Members of group')]
  75.     #[ORM\OneToMany(targetEntityAdmin::class, mappedBy'group')]
  76.     private Collection $members;
  77.     public function __construct(string $title)
  78.     {
  79.         $this->setUuid();
  80.         $this->title $title;
  81.         $this->members = new ArrayCollection();
  82.         $this->createdAt = new \DateTimeImmutable();
  83.         $this->updatedAt = new \DateTimeImmutable();
  84.     }
  85.     public function getTitle(): string
  86.     {
  87.         return $this->title;
  88.     }
  89.     public function setTitle(string $title): self
  90.     {
  91.         $this->title $title;
  92.         return $this;
  93.     }
  94.     public function getFullyQualifiedResourceAccess(): array
  95.     {
  96.         return $this->resourceAccess;
  97.     }
  98.     #[Groups(['read'])]
  99.     public function getResourceAccess(): array
  100.     {
  101.         return array_map(
  102.             function (string $resourceFqcn) {
  103.                 switch(true) {
  104.                     case defined(ModuleRoles::class . '::ROLE_MODULE_' strtoupper($resourceFqcn)):
  105.                         return $resourceFqcn;
  106.                     case class_exists($resourceFqcn):
  107.                         return lcfirst(short_class_name($resourceFqcn));
  108.                     default:
  109.                         throw new \Exception('Resource access is invalid.');
  110.                 }
  111.             },
  112.             $this->resourceAccess
  113.         );
  114.     }
  115.     public function setResourceAccess(array $resourceAccess): self
  116.     {
  117.         $this->resourceAccess array_map(
  118.             function (string $resourceScn) {
  119.                 switch(true) {
  120.                     case defined(ModuleRoles::class . '::ROLE_MODULE_' strtoupper($resourceScn)):
  121.                         return strtolower($resourceScn);
  122.                     case class_exists($fqcn __NAMESPACE__ '\\' ucfirst($resourceScn)):
  123.                         return $fqcn;
  124.                     default:
  125.                         throw new \Exception('Resource access is invalid.');
  126.                 }
  127.             },
  128.             $resourceAccess
  129.         );
  130.         return $this;
  131.     }
  132.     public function getIsSuperAdmin(): bool
  133.     {
  134.         return $this->isSuperAdmin;
  135.     }
  136.     public function setIsSuperAdmin(bool $isSuperAdmin): self
  137.     {
  138.         $this->isSuperAdmin $isSuperAdmin;
  139.         return $this;
  140.     }
  141.     public function getIsOpenform(): bool
  142.     {
  143.         return $this->isOpenform;
  144.     }
  145.     public function setIsOpenform(bool $isOpenform): self
  146.     {
  147.         $this->isOpenform $isOpenform;
  148.         return $this;
  149.     }
  150.     public function getMembers(): Collection
  151.     {
  152.         return $this->members;
  153.     }
  154.     public function addMember(Admin $member): self
  155.     {
  156.         if ($this->members->contains($member)) {
  157.             return $this;
  158.         }
  159.         $this->members[] = $member;
  160.         $member->setGroup($this);
  161.         return $this;
  162.     }
  163.     public function removeMember(Admin $member): self
  164.     {
  165.         $this->members->removeElement($member);
  166.         $member->setGroup(null);
  167.         return $this;
  168.     }
  169. }