['me:read']], ), new Get( normalizationContext: ['groups' => ['user:list']], ), new GetCollection( normalizationContext: ['groups' => ['user:list']], ), new Post(security: "is_granted('ROLE_ADMIN')", processor: UserPasswordHasherProcessor::class), new Patch(security: "is_granted('ROLE_ADMIN')", processor: UserPasswordHasherProcessor::class), new Delete(security: "is_granted('ROLE_ADMIN')"), ], denormalizationContext: ['groups' => ['user:write']], )] #[ORM\Entity(repositoryClass: UserRepository::class)] #[ORM\Table(name: '`user`')] class User implements UserInterface, PasswordAuthenticatedUserInterface { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column] #[Groups(['me:read', 'task:read', 'user:list', 'time_entry:read', 'client_ticket:read'])] private ?int $id = null; #[ORM\Column(length: 180, unique: true)] #[Groups(['me:read', 'task:read', 'user:list', 'user:write', 'time_entry:read', 'client_ticket:read'])] private ?string $username = null; /** @var list */ #[ORM\Column] #[Groups(['me:read', 'user:list', 'user:write'])] private array $roles = []; #[ORM\Column] private ?string $password = null; #[Groups(['user:write'])] private ?string $plainPassword = null; #[ORM\Column(type: Types::DATETIME_IMMUTABLE)] private ?DateTimeImmutable $createdAt = null; #[ORM\Column(length: 64, unique: true, nullable: true)] #[Groups(['me:read'])] private ?string $apiToken = null; #[ORM\Column(length: 255, nullable: true)] private ?string $avatarFileName = null; #[ORM\ManyToOne(targetEntity: Client::class)] #[ORM\JoinColumn(nullable: true, onDelete: 'SET NULL')] #[Groups(['me:read', 'user:list', 'user:write'])] private ?Client $client = null; /** @var Collection */ #[ORM\ManyToMany(targetEntity: Project::class)] #[ORM\JoinTable(name: 'user_allowed_projects')] #[Groups(['me:read', 'user:list', 'user:write'])] private Collection $allowedProjects; public function __construct() { $this->createdAt = new DateTimeImmutable(); $this->allowedProjects = new ArrayCollection(); } public function getId(): ?int { return $this->id; } public function getUsername(): ?string { return $this->username; } public function setUsername(string $username): static { $this->username = $username; return $this; } public function getUserIdentifier(): string { return (string) $this->username; } /** @return list */ public function getRoles(): array { $roles = $this->roles; if (!in_array('ROLE_CLIENT', $roles, true)) { $roles[] = 'ROLE_USER'; } return array_values(array_unique($roles)); } /** @param list $roles */ public function setRoles(array $roles): static { $this->roles = $roles; return $this; } public function getPassword(): ?string { return $this->password; } public function setPassword(string $password): static { $this->password = $password; return $this; } public function getCreatedAt(): ?DateTimeImmutable { return $this->createdAt; } public function setCreatedAt(DateTimeImmutable $createdAt): static { $this->createdAt = $createdAt; return $this; } public function getClient(): ?Client { return $this->client; } public function setClient(?Client $client): static { $this->client = $client; return $this; } /** @return Collection */ public function getAllowedProjects(): Collection { return $this->allowedProjects; } public function addAllowedProject(Project $project): static { if (!$this->allowedProjects->contains($project)) { $this->allowedProjects->add($project); } return $this; } public function removeAllowedProject(Project $project): static { $this->allowedProjects->removeElement($project); return $this; } public function getApiToken(): ?string { return $this->apiToken; } public function setApiToken(?string $apiToken): static { $this->apiToken = $apiToken; return $this; } public function getAvatarFileName(): ?string { return $this->avatarFileName; } public function setAvatarFileName(?string $avatarFileName): static { $this->avatarFileName = $avatarFileName; return $this; } #[Groups(['me:read', 'task:read', 'user:list', 'time_entry:read', 'client_ticket:read'])] public function getAvatarUrl(): ?string { if (null === $this->avatarFileName) { return null; } return '/api/users/'.$this->id.'/avatar'; } public function getPlainPassword(): ?string { return $this->plainPassword; } public function setPlainPassword(?string $plainPassword): static { $this->plainPassword = $plainPassword; return $this; } public function eraseCredentials(): void { $this->plainPassword = null; } }