src/Entity/Identity/User.php line 62

  1. <?php
  2. namespace App\Entity\Identity;
  3. use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
  4. use ApiPlatform\Metadata\ApiFilter;
  5. use ApiPlatform\Metadata\ApiProperty;
  6. use ApiPlatform\Metadata\ApiResource;
  7. use ApiPlatform\Metadata\Get;
  8. use ApiPlatform\Metadata\GetCollection;
  9. use ApiPlatform\Metadata\Link;
  10. use ApiPlatform\Metadata\Post;
  11. use App\Dto\User\AccountVerificationInput;
  12. use App\Dto\User\SignupInput;
  13. use App\Dto\User\UserSettings;
  14. use App\Entity\Common\Blameable;
  15. use App\Entity\Common\Company;
  16. use App\Entity\Common\Trackable;
  17. use App\Processor\Identity\UserSettingsProcessor;
  18. use App\Processor\User\AccountVerificationInputProcessor;
  19. use App\Processor\User\SignupInputProcessor;
  20. use App\Provider\User\CurrentUserProvider;
  21. use App\Repository\Identity\UserRepository;
  22. use Doctrine\Common\Collections\ArrayCollection;
  23. use Doctrine\Common\Collections\Collection;
  24. use Doctrine\DBAL\Types\Types;
  25. use Doctrine\ORM\Mapping as ORM;
  26. use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
  27. use Symfony\Component\Security\Core\User\UserInterface;
  28. use Symfony\Component\Uid\Ulid;
  29. use Symfony\Component\Validator\Constraints as Assert;
  30. #[ORM\Table(name'`user`')]
  31. #[ORM\Index(columns: ['avatar_id'], name'user_avatar_id_idx')]
  32. #[ORM\Index(columns: ['company_id'], name'user_company_id_idx')]
  33. #[ORM\Index(columns: ['created_by'], name'user_created_by_idx')]
  34. #[ORM\Index(columns: ['updated_by'], name'user_updated_by_idx')]
  35. #[ORM\UniqueConstraint(name'user_identifier_key'columns: ['identifier'])]
  36. #[ORM\Entity(repositoryClassUserRepository::class)]
  37. #[ApiResource(security"is_granted('ROLE_ADMIN')")]
  38. #[ApiResource(
  39.     shortName'Identity',
  40.     operations: [
  41.         new Post(uriTemplate'/signup'inputSignupInput::class, processorSignupInputProcessor::class),
  42.         new Post(uriTemplate'/verify'inputAccountVerificationInput::class, processorAccountVerificationInputProcessor::class),
  43.         new Post(uriTemplate'/settings'inputUserSettings::class, processorUserSettingsProcessor::class),
  44.         new Get(uriTemplate'/me'providerCurrentUserProvider::class),
  45.     ]
  46. )]
  47. #[ApiResource(
  48.     uriTemplate'/companies/{slug}/users',
  49.     operations: [new GetCollection()],
  50.     uriVariables: [
  51.         'slug' => new Link(fromProperty'users'fromClassCompany::class),
  52.     ],
  53. )]
  54. #[ApiFilter(SearchFilter::class, properties: [
  55.     'firstName' => 'ipartial',
  56.     'lastName' => 'ipartial',
  57.     'passport.value' => 'ipartial',
  58. ])]
  59. class User extends Person implements UserInterfacePasswordAuthenticatedUserInterface
  60. {
  61.     use Authenticatable;
  62.     use PassportIdentifiable;
  63.     use Blameable;
  64.     use Trackable;
  65.     #[ORM\Id]
  66.     #[ORM\GeneratedValue(strategy'IDENTITY')]
  67.     #[ORM\SequenceGenerator(sequenceName'user_id_seq')]
  68.     #[ORM\Column(typeTypes::INTEGER)]
  69.     protected ?int $id null;
  70.     #[Assert\Ulid]
  71.     #[Assert\NotNull]
  72.     #[ORM\Column(type'ulid'uniquetrue)]
  73.     protected ?Ulid $identifier null;
  74.     #[ORM\Column(typeTypes::STRINGnullabletrue)]
  75.     protected ?string $position null;
  76.     #[ORM\ManyToOne(targetEntityCompany::class, inversedBy'users')]
  77.     #[ORM\JoinColumn(name'company_id')]
  78.     protected ?Company $company null;
  79.     /** @var Collection<int, Account> */
  80.     #[ORM\OneToMany(mappedBy'user'targetEntityAccount::class, cascade: ['persist''remove'], orphanRemovaltrue)]
  81.     protected Collection $accounts;
  82.     #[Assert\Valid]
  83.     #[Assert\Type(typeUserSettings::class)]
  84.     #[ORM\Column(type'json_document'options: ['jsonb' => true])]
  85.     protected UserSettings $settings;
  86.     #[ORM\ManyToOne(targetEntityUser::class)]
  87.     #[ORM\JoinColumn(name'created_by'nullabletrue)]
  88.     protected ?User $createdBy null;
  89.     public function __construct()
  90.     {
  91.         $this->identifier = new Ulid();
  92.         $this->settings = new UserSettings();
  93.         $this->accounts = new ArrayCollection();
  94.         $this->initIdentity();
  95.     }
  96.     public function getId(): ?int
  97.     {
  98.         return $this->id;
  99.     }
  100.     public function getIdentifier(): ?Ulid
  101.     {
  102.         return $this->identifier;
  103.     }
  104.     public function setIdentifier(?Ulid $slug): static
  105.     {
  106.         $this->identifier $slug;
  107.         return $this;
  108.     }
  109.     public function getUserIdentifier(): string
  110.     {
  111.         return $this->getIdentifier()?->toRfc4122();
  112.     }
  113.     public function getPosition(): ?string
  114.     {
  115.         return $this->position;
  116.     }
  117.     public function setPosition(?string $position): self
  118.     {
  119.         $this->position $position;
  120.         return $this;
  121.     }
  122.     public function getCompany(): ?Company
  123.     {
  124.         return $this->company;
  125.     }
  126.     public function setCompany(?Company $company): self
  127.     {
  128.         $this->company $company;
  129.         return $this;
  130.     }
  131.     public function getSettings(): UserSettings
  132.     {
  133.         return $this->settings;
  134.     }
  135.     public function setSettings(UserSettings $settings): self
  136.     {
  137.         $this->settings $settings;
  138.         return $this;
  139.     }
  140. }