<?php
namespace App\Entity\Account;
use App\Entity\ChannelUserData\ChannelUserData;
use App\Entity\Common\Contact;
use App\Enum\Serialization\ActivitySerializationGroups;
use App\Enum\Serialization\OpportunitySerializationGroups;
use App\Enum\Serialization\DriveFileSerializationGroups;
use App\Enum\Serialization\FileSerializationGroups;
use App\Enum\Serialization\UserSerializationGroups;
use App\Repository\Account\UserRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Nellapp\Bundle\SDKBundle\Auth\Entity\Token;
use Nellapp\Bundle\SDKBundle\Auth\Entity\UserInterface;
use Nellapp\Bundle\SDKBundle\Auth\Entity\UserMethodTrait;
use Nellapp\Bundle\SDKBundle\Auth\Entity\UserWithContact\UserWithContactInterface;
use Nellapp\Bundle\SDKBundle\Auth\Entity\UserWithContact\UserWithContactTrait;
use Symfony\Component\Serializer\Annotation as Serial;
#[ORM\Entity(repositoryClass: UserRepository::class),
ORM\Index(columns: ['email'], flags: ['fulltext']),
ORM\Index(columns: ['first_name', 'last_name'], flags: ['fulltext']),
ORM\Table(name: 'account_users'),]
class User implements UserInterface, UserWithContactInterface
{
use UserMethodTrait;
use UserWithContactTrait;
#[ORM\Id, ORM\Column(type: 'string')]
#[Serial\Groups([
UserSerializationGroups::COLLECTION,
UserSerializationGroups::DETAIL,
OpportunitySerializationGroups::API_COLLECTION,
ActivitySerializationGroups::GET,
FileSerializationGroups::COLLECTION,
FileSerializationGroups::DETAIL,
DriveFileSerializationGroups::COLLECTION,
DriveFileSerializationGroups::DETAIL,
])]
private ?string $id = null;
#[ORM\Column(type: 'string', length: 180, unique: true)]
#[Serial\Groups([
UserSerializationGroups::COLLECTION,
UserSerializationGroups::DETAIL,
OpportunitySerializationGroups::API_COLLECTION,
ActivitySerializationGroups::GET,
FileSerializationGroups::COLLECTION,
FileSerializationGroups::DETAIL,
DriveFileSerializationGroups::COLLECTION,
DriveFileSerializationGroups::DETAIL,
])]
private ?string $email = null;
/**
* @var string[]
*/
#[ORM\Column(type: 'json')]
private array $roles = [];
#[ORM\Column(type: 'string', nullable: true)]
#[Serial\Groups([
UserSerializationGroups::COLLECTION,
UserSerializationGroups::DETAIL,
OpportunitySerializationGroups::API_COLLECTION,
ActivitySerializationGroups::GET,
FileSerializationGroups::COLLECTION,
FileSerializationGroups::DETAIL,
DriveFileSerializationGroups::COLLECTION,
DriveFileSerializationGroups::DETAIL,
])]
private ?string $firstName = null;
#[ORM\Column(type: 'string', nullable: true)]
#[Serial\Groups([
UserSerializationGroups::COLLECTION,
UserSerializationGroups::DETAIL,
OpportunitySerializationGroups::API_COLLECTION,
ActivitySerializationGroups::GET,
FileSerializationGroups::COLLECTION,
FileSerializationGroups::DETAIL,
DriveFileSerializationGroups::COLLECTION,
DriveFileSerializationGroups::DETAIL,
])]
private ?string $lastName = null;
#[ORM\Column(type: 'text', nullable: true)]
private ?string $description = null;
#[ORM\Column(type: 'boolean', nullable: true)]
private ?bool $avatar = null;
#[ORM\Embedded(class: Token::class)]
private ?Token $token = null;
#[ORM\Column(type: 'text', nullable: true)]
#[Serial\Groups([
UserSerializationGroups::DETAIL,
OpportunitySerializationGroups::API_COLLECTION,
ActivitySerializationGroups::GET,
FileSerializationGroups::COLLECTION,
FileSerializationGroups::DETAIL,
DriveFileSerializationGroups::COLLECTION,
DriveFileSerializationGroups::DETAIL,
])]
private ?string $avatarPath = null;
#[ORM\OneToOne(targetEntity: Contact::class, cascade: ['persist'])]
#[ORM\JoinColumn(nullable: true, onDelete: 'SET NULL')]
private ?Contact $contact = null;
#[ORM\Column(type: 'datetime', nullable: true)]
private ?\DateTime $signingLimitDate = null;
#[ORM\OneToMany(mappedBy: 'user', targetEntity: ChannelUserData::class)]
private ?Collection $channelUserDatas;
public function __construct()
{
$this->channelUserDatas = new ArrayCollection();
}
#[Serial\Groups([
UserSerializationGroups::COLLECTION,
UserSerializationGroups::DETAIL,
ActivitySerializationGroups::GET,
DriveFileSerializationGroups::COLLECTION,
DriveFileSerializationGroups::DETAIL,
FileSerializationGroups::COLLECTION,
FileSerializationGroups::DETAIL,
])]
public function getFullName(): string
{
return trim(($this->getFirstName() ?? '') . ' ' . ($this->getLastName() ?? ''));
}
#[Serial\Groups([
UserSerializationGroups::COLLECTION,
UserSerializationGroups::DETAIL,
ActivitySerializationGroups::GET,
DriveFileSerializationGroups::COLLECTION,
DriveFileSerializationGroups::DETAIL,
FileSerializationGroups::COLLECTION,
FileSerializationGroups::DETAIL,
])]
public function getUsername(): string
{
return $this->getFullName();
}
#[Serial\Groups([
UserSerializationGroups::COLLECTION,
UserSerializationGroups::DETAIL,
])]
public function getFullNameWithEmail(): string
{
return trim($this->getFullName() . ' <' . $this->getEmail() . '>');
}
#[Serial\Groups([
UserSerializationGroups::COLLECTION,
UserSerializationGroups::DETAIL,
ActivitySerializationGroups::GET,
])]
public function getPhoneNumber(): ?string
{
return $this->getContact()?->getPhoneNumber();
}
}