<?php
declare(strict_types=1);
namespace App\Security\Doctrine\Entity;
use App\Notification\Doctrine\Entity\Notifier;
use App\Security\Doctrine\Repository\UserRepository;
use App\Security\Security\Store\Roles;
use App\Security\Security\User\UserStatusInterface;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\GeneratedValue;
use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\Table;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Uid\AbstractUid;
use Symfony\Component\Validator\Constraints\Count as ArrayCount;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\NotBlank;
#[Entity(repositoryClass: UserRepository::class)]
#[Table(name: '`user`')]
#[UniqueEntity(fields: ['email'])]
class User implements UserInterface, PasswordAuthenticatedUserInterface, UserStatusInterface
{
use Notifier;
#[Id]
#[Column(type: 'integer')]
#[GeneratedValue]
private ?int $id = null;
#[Column(unique: true)]
#[NotBlank]
#[Email]
private string $email = '';
#[Column]
private string $password = '';
#[NotBlank(groups: ['reset-password', 'create'])]
private ?string $plainPassword = null;
#[Column]
#[NotBlank]
private string $firstName = '';
#[Column]
#[NotBlank]
private string $lastName = '';
#[Column(type: 'uuid', nullable: true)]
private ?AbstractUid $forgottenPasswordToken = null;
#[Column(type: 'boolean')]
private bool $suspended = false;
/**
* @var array<array-key, string> $roles
*/
#[Column(type: 'array')]
#[ArrayCount(min: 1)]
private array $roles = [];
public function getId(): ?int
{
return $this->id;
}
public function getEmail(): string
{
return $this->email;
}
public function setEmail(string $email): void
{
$this->email = $email;
}
public function getPlainPassword(): ?string
{
return $this->plainPassword;
}
public function setPlainPassword(?string $plainPassword): void
{
$this->plainPassword = $plainPassword;
}
public function getFirstName(): string
{
return $this->firstName;
}
public function setFirstName(string $firstName): void
{
$this->firstName = $firstName;
}
public function getLastName(): string
{
return $this->lastName;
}
public function setLastName(string $lastName): void
{
$this->lastName = $lastName;
}
public function getForgottenPasswordToken(): ?AbstractUid
{
return $this->forgottenPasswordToken;
}
public function setForgottenPasswordToken(?AbstractUid $forgottenPasswordToken): void
{
$this->forgottenPasswordToken = $forgottenPasswordToken;
}
public function isSuspended(): bool
{
return $this->suspended;
}
public function setSuspended(bool $suspended): void
{
$this->suspended = $suspended;
}
/**
* @return array<array-key, string>
*/
public function getRoles(): array
{
$roles = array_merge($this->roles, [Roles::ROLE_USER]);
sort($roles);
return $roles;
}
/**
* @param array<array-key, string> $roles
*/
public function setRoles(array $roles): void
{
$this->roles = $roles;
}
public function getPassword(): string
{
return $this->password;
}
public function setPassword(string $password): void
{
$this->password = $password;
}
public function getSalt(): ?string
{
return null;
}
public function eraseCredentials(): void
{
$this->plainPassword = null;
}
public function getUsername(): string
{
return $this->email;
}
public function getFullName(): string
{
return sprintf('%s %s', $this->firstName, $this->lastName);
}
public function getUserIdentifier(): string
{
return $this->email;
}
}