<?php
namespace Roothirsch\CoreBundle\Entity;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\BooleanFilter;
use Roothirsch\CoreBundle\Entity\Traits\TimetrackedTrait;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Roothirsch\CoreBundle\API\Filter\OrSearchFilter;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Serializer\Annotation\MaxDepth;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass="Roothirsch\CoreBundle\Repository\UserRepository")
* @ORM\Table(name="user")
* @ApiResource(
* collectionOperations={
* "get"={
* "normalization_context"={"groups"={"list"}}
* },
* "post"
* },
* itemOperations={
* "register"={"method"="PUT", "path"="/users/{id}/register", "requirements"={"id"=".+"}},
* "reset-password"={"method"="PUT", "path"="/users/{id}/reset-password", "requirements"={"id"=".+"}},
* "change-password"={"method"="PUT", "path"="/users/{id}/change-password", "requirements"={"id"=".+"}},
* "get"={"method"="GET", "path"="/users/{id}"},
* "current"={"method"="GET", "path"="/users/current", "normalization_context"={"groups"={"list"}}},
* "put",
* "delete"
* },
* attributes={
* "normalization_context"={"groups"={"read"}, "enable_max_depth"=true},
* "denormalization_context"={"groups"={"write"}},
* "order"={"lastName": "ASC"}
* }
* )
* @ApiResource
* @ApiFilter(BooleanFilter::class, properties={"active"})
* @ApiFilter(OrSearchFilter::class, properties={
* "username": "partial",
* "email": "partial",
* "firstName": "partial",
* "lastName": "partial",
* "company.name": "partial"
* })
*/
class User implements UserInterface
{
use TimetrackedTrait;
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({"list", "read"})
*/
private $id;
/**
* @ORM\Column(type="string", unique=true)
* @Groups({"list", "read", "write", "company_read", "js_minimal_read"})
*/
private $username;
/**
* @ORM\Column(type="string", unique=true)
* @Assert\NotBlank()
* @Assert\Email(message="email")
* @Groups({"list", "read", "write", "company_read", "js_minimal_read"})
*/
private $email;
/**
* @ORM\Column(type="string", nullable=true)
* @Groups({"write"})
*/
private $password;
/**
* @Groups({"write"})
*/
private $plaintextPassword;
/**
* @ORM\Column(type="string", nullable=true)
* @Assert\NotBlank(message="blank")
* @Groups({"list", "read", "write", "company_read", "js_minimal_read"})
*/
private $firstName;
/**
* @ORM\Column(type="string", nullable=true)
* @Assert\NotBlank(message="blank")
* @Groups({"list", "read", "write", "company_read", "js_minimal_read"})
*/
private $lastName;
/**
* @ORM\Column(type="string", unique=true, nullable=true)
*/
private $registrationToken;
/**
* Random token to verify the e-mail and password-reset.
*
* @var string
* @ORM\Column(type="string", unique=true, nullable=true)
*/
protected $securityToken;
/**
* @var bool
* @ORM\Column(type="boolean")
* @Groups({"list", "read", "write", "company_read"})
*/
private $active = true;
/**
* @var bool
* @ORM\Column(type="boolean")
* @Groups({"list", "read", "write"})
*/
private $admin = true;
/**
* @var string
* @Orm\Column(type="string", nullable=true)
* @Groups({"list", "read", "write", "company_read"})
*/
private $phone;
/**
* @var string
* @Orm\Column(type="string", nullable=true)
* @Groups({"list", "read", "write", "company_read"})
*/
private $fax;
/**
* @var string
* @Orm\Column(type="string", nullable=true)
* @Groups({"list", "read", "write", "company_read"})
*/
private $mobile;
/**
* @ORM\ManyToOne(targetEntity="Company", inversedBy="employees", cascade={"persist"}, fetch="EAGER")
* @ORM\JoinColumn(name="employee_of", referencedColumnName="id", onDelete="SET NULL")
* @Groups({"list", "read", "write"})
* @MaxDepth(1)
*/
private $company;
/**
* @var ContactValidation
* @ORM\OneToOne(targetEntity="ContactValidation",cascade={"persist","remove"}, mappedBy="user")
* @Groups({"read", "write"})
*/
private $contactValidation;
/**
* @ORM\ManyToOne(targetEntity="ContactPerson", inversedBy="users", cascade={"persist"}, fetch="EAGER")
* @ORM\JoinColumn(name="contact_through", referencedColumnName="id")
* @Groups({"read", "write", "list"})
* @MaxDepth(1)
*/
private $contact;
/**
* @Orm\Column(type="string", nullable=true)
* @Groups({"list", "read", "write"})
*/
private $erpReference;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $newsReadOn;
/**
* @var array
* @Groups({"read"})
*/
private $features = [];
/**
* @ORM\ManyToMany(targetEntity=Group::class, inversedBy="users")
*/
private $groups;
/**
* @Groups({"list", "read", "write", "js_minimal_read"})
*/
private $roles = [];
public function __toString()
{
return $this->getFullName();
}
public function getFullName()
{
return $this->getFirstName() . ' ' . $this->getLastName();
}
public function getGravatar()
{
return 'https://www.gravatar.com/avatar/' . md5(strtolower(trim($this->getEmail())));
}
/**
* @return mixed
*/
public function getId()
{
return $this->id;
}
/**
* @param mixed $id
*/
public function setId($id)
{
$this->id = $id;
}
/**
* @return string
*/
public function getFirstName()
{
return $this->firstName;
}
/**
* @param string $firstName
*/
public function setFirstName($firstName)
{
$this->firstName = $firstName;
}
/**
* @return string
*/
public function getLastName()
{
return $this->lastName;
}
/**
* @param string $lastName
*/
public function setLastName($lastName)
{
$this->lastName = $lastName;
}
/**
* {@inheritdoc}
*/
public function getUsername()
{
return $this->username;
}
/**
* {@inheritdoc}
*/
public function getPassword()
{
return $this->password;
}
/**
* {@inheritdoc}
*/
public function getRegistrationToken()
{
return $this->registrationToken;
}
/**
* {@inheritdoc}
*/
public function getRoles()
{
$roles = [];
foreach ($this->groups as $group) {
$roles[] = $group->getName();
}
if ($this->company instanceof Company) {
foreach ($this->company->getGroups() as $group) {
$roles[] = $group->getName();
}
}
// guarantees that a user always has at least one role for security
if (empty($roles) || !array_search('ROLE_USER', $roles)) {
$roles[] = 'ROLE_USER';
}
return $roles;
}
/**
* {@inheritdoc}
*/
public function getSalt()
{
}
/**
* {@inheritdoc}
*/
public function eraseCredentials()
{
}
/**
* @return mixed
*/
public function getEmail()
{
return $this->email;
}
/**
* @param mixed $email
*/
public function setEmail($email)
{
$this->email = $email;
$this->username = $email;
}
/**
* @return string
*/
public function getSecurityToken()
{
return $this->securityToken;
}
/**
* @param string $securityToken
*/
public function setSecurityToken($securityToken)
{
$this->securityToken = $securityToken;
}
/**
* @return mixed
*/
public function getActive()
{
return $this->active;
}
/**
* @param mixed $active
*/
public function setActive($active)
{
$this->active = $active;
}
/**
* @return mixed
*/
public function getAdmin()
{
return $this->admin;
}
/**
* @param mixed $admin
*/
public function setAdmin($admin)
{
$this->admin = $admin;
}
/**
* @param mixed $username
*/
public function setUsername($username)
{
$this->username = $username;
}
/**
* @param mixed $password
*/
public function setPassword($password)
{
$this->password = $password;
}
/**
* @param string $registrationToken
*/
public function setRegistrationToken($registrationToken)
{
$this->registrationToken = $registrationToken;
if (empty($this->registrationToken)) {
$this->registrationToken = null;
}
}
/**
* @return Company
*/
public function getCompany()
{
return $this->company;
}
public function getCompanyName()
{
if ($this->company) {
return $this->company->getName();
}
}
/**
* @param Company $company
*/
public function setCompany($company)
{
$this->company = $company;
}
/**
* @return string
*/
public function getPhone(): string
{
return is_null($this->phone) ? '' : $this->phone;
}
/**
* @param string $phone
*/
public function setPhone($phone)
{
$this->phone = $phone;
}
/**
* @return string
*/
public function getFax(): string
{
return is_null($this->fax) ? '' : $this->fax;
}
/**
* @param string $fax
*/
public function setFax($fax)
{
$this->fax = $fax;
}
/**
* @return string
*/
public function getMobile(): string
{
return is_null($this->mobile) ? '' : $this->mobile;
}
/**
* @param string $mobile
*/
public function setMobile($mobile)
{
$this->mobile = $mobile;
}
/**
* @return ContactValidation
*/
public function getContactValidation()
{
return $this->contactValidation;
}
/**
* @param ContactValidation $contactValidation
*/
public function setContactValidation($contactValidation)
{
$this->contactValidation = $contactValidation;
}
/**
* @return mixed
*/
public function getContact(): ?ContactPerson
{
return $this->contact;
}
/**
* @param mixed $contact
*/
public function setContact($contact)
{
$this->contact = $contact;
}
/**
* @return mixed
*/
public function getPlaintextPassword()
{
return $this->plaintextPassword;
}
/**
* @param mixed $plaintextPassword
*/
public function setPlaintextPassword($plaintextPassword)
{
$this->updatedAt = new \DateTime();
$this->plaintextPassword = $plaintextPassword;
}
/**
* @return mixed
*/
public function getErpReference()
{
return $this->erpReference;
}
/**
* @param mixed $erpReference
*/
public function setErpReference($erpReference)
{
$this->erpReference = $erpReference;
}
/**
* @return mixed
*/
public function getNewsReadOn()
{
return $this->newsReadOn;
}
/**
* @param mixed $newsReadOn
*/
public function setNewsReadOn($newsReadOn)
{
$this->newsReadOn = $newsReadOn;
}
/**
* @return array
*/
public function getFeatures()
{
return $this->features;
}
/**
* @param array $features
*/
public function setFeatures($features)
{
$this->features = $features;
}
/**
* @return ArrayCollection
*/
public function getGroups($includeCompanyGroups = false)
{
if ($includeCompanyGroups === false || ! $this->company instanceof Company) {
return $this->groups;
}
return array_merge($this->groups->toArray(), $this->company->getGroups()->toArray());
}
public function hasGroup($groupName, $includeCompanyGroups = false)
{
$groups = $this->getGroups($includeCompanyGroups);
foreach ($groups as $group) {
/** @var Group $group */
if ($group->getName() === $groupName) {
return true;
}
}
return false;
}
public function hasRole($groupName)
{
$groups = [];
foreach($this->getGroups() as $group) {
$groups[] = $group->getName();
}
return array_search($groupName, $groups) !== false;
}
public function __construct()
{
$this->groups = new ArrayCollection();
}
public function addGroup(Group $group): self
{
if (!$this->groups->contains($group)) {
$this->groups[] = $group;
}
return $this;
}
public function removeGroup(Group $group): self
{
$this->groups->removeElement($group);
return $this;
}
public function getDiscount() {
if (is_object($this->company)) {
return $this->company->getDiscount();
}
return 0;
}
}