src/Entity/User.php line 76

Open in your IDE?
  1. <?php
  2. /**
  3.  * @package BLUUE
  4.  * @author Thomas HERISSON (contact@scaledev.fr)
  5.  * @copyright 2021 - ScaleDEV SAS, 12 RUE CHARLES MORET, 10120 ST ANDRE LES VERGERS
  6.  * @license commercial
  7.  */
  8. declare(strict_types=1);
  9. namespace App\Entity;
  10. use ApiPlatform\Core\Annotation\ApiResource;
  11. use DateTime;
  12. use Symfony\Component\Uid\Uuid;
  13. use Doctrine\ORM\Mapping as ORM;
  14. use App\Repository\UserRepository;
  15. use Gedmo\Mapping\Annotation as Gedmo;
  16. use App\DoctrineExtensions\IsActiveEntity;
  17. use App\Entity\Traits\OpensslServiceEntity;
  18. use Doctrine\Common\Collections\Collection;
  19. use Doctrine\Common\Collections\ArrayCollection;
  20. use Symfony\Bridge\Doctrine\IdGenerator\UuidGenerator;
  21. use Symfony\Component\Validator\Constraints as Assert;
  22. use Symfony\Component\Security\Core\User\UserInterface;
  23. use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
  24. use App\DoctrineExtensions\Timestampable\Traits\UserTimestampableEntity;
  25. use App\DoctrineExtensions\SoftDeleteable\Traits\UserSoftDeleteableEntity;
  26. use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
  27. use Symfony\Component\Serializer\Annotation\Groups;
  28. /**
  29.  * @ApiResource(
  30.  *  formats={"json"},
  31.  *  security="is_granted('ROLE_USER')",
  32.  *  normalizationContext= {"groups"= {"get"}},
  33.  *  denormalizationContext={"groups"={"write"}},
  34.  *  collectionOperations={
  35.  *      "get"={
  36.  *          "security"="is_granted('ROLE_READ_ONLY')"
  37.  *      },
  38.  *      "post"={
  39.  *          "security"="is_granted('ROLE_SUPER_ADMIN')"
  40.  *      }
  41.  *  },
  42.  *  itemOperations={
  43.  *      "get",
  44.  *      "put"={
  45.  *          "security"="is_granted('ROLE_SUPER_ADMIN')"
  46.  *      },
  47.  *      "patch"={
  48.  *          "security"="is_granted('ROLE_SUPER_ADMIN')"
  49.  *      },
  50.  *      "delete"={
  51.  *          "security"="is_granted('ROLE_SUPER_ADMIN')"
  52.  *      }
  53.  *  }
  54.  * )
  55.  * @ORM\Entity(repositoryClass=UserRepository::class)
  56.  * @ORM\Table(name="user", indexes={
  57.  *     @ORM\Index(name="name", columns={"firstname", "lastname"}),
  58.  *     @ORM\Index(name="is_active", columns={"is_active"}),
  59.  *     @ORM\Index(name="deleted_at", columns={"deleted_at"}),
  60.  *     @ORM\Index(name="created_at", columns={"created_at"}),
  61.  *     @ORM\Index(name="updated_at", columns={"updated_at"})
  62.  * })
  63.  * @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false, hardDelete=false)
  64.  * @UniqueEntity(
  65.  *     fields={"email", "deletedAt"},
  66.  *     errorPath="email",
  67.  *     message="This email is already in use.",
  68.  *     ignoreNull=false
  69.  * )
  70.  */
  71. class User implements UserInterfacePasswordAuthenticatedUserInterface
  72. {
  73.     use UserTimestampableEntity;
  74.     use UserSoftDeleteableEntity;
  75.     use IsActiveEntity;
  76.     use OpensslServiceEntity;
  77.     /**
  78.      * @ORM\Id
  79.      * @ORM\Column(type="uuid")
  80.      * @ORM\GeneratedValue(strategy="CUSTOM")
  81.      * @ORM\CustomIdGenerator(class=UuidGenerator::class)
  82.      * @Groups({"get", "userSearch"})
  83.      */
  84.     private ?Uuid $id null;
  85.     /**
  86.      * @ORM\Column(type="string", length=32)
  87.      * @Groups({"get", "write"})
  88.      */
  89.     private string $firstname;
  90.     /**
  91.      * @ORM\Column(type="string", length=32, nullable=true)
  92.      * @Groups({"get", "write"})
  93.      */
  94.     private ?string $lastname null;
  95.     /**
  96.      * @ORM\Column(type="string", length=128)
  97.      * @Assert\Email
  98.      * @Groups({"get", "write"})
  99.      */
  100.     private string $email;
  101.     /**
  102.      * @ORM\Column(type="string", length=32, nullable=true)
  103.      * @Groups({"get", "write"})
  104.      */
  105.     private ?string $mobilePhone;
  106.     /**
  107.      * @var ?string The hashed password
  108.      * @ORM\Column(type="string", nullable=true)
  109.      */
  110.     private ?string $password null;
  111.     /**
  112.      * @ORM\Column(type="string", length=40, nullable=true)
  113.      */
  114.     private ?string $token;
  115.     /**
  116.      * @ORM\Column(type="datetime", nullable=true)
  117.      */
  118.     private ?DateTime $token_validity;
  119.     /**
  120.      * @ORM\Column(type="string", length=128, nullable=true)
  121.      * @Groups({"get"})
  122.      */
  123.     private ?string $loginName null;
  124.     /**
  125.      * @ORM\Column(type="string", length=20, nullable=true)
  126.      */
  127.     private ?string $apiPin null;
  128.     /**
  129.      * @ORM\Column(type="string", length=40, nullable=true)
  130.      */
  131.     private ?string $apiToken null;
  132.     /**
  133.      * @ORM\Column(type="datetime", nullable=true)
  134.      */
  135.     private ?DateTime $apiTokenValidity;
  136.     /**
  137.      * @ORM\Column(type="json", nullable=true)
  138.      * @Groups({"get"})
  139.      */
  140.     private array $config = [];
  141.     /**
  142.      * @ORM\ManyToOne(targetEntity=Profile::class, inversedBy="users")
  143.      * @Groups({"get"})
  144.      */
  145.     private ?Profile $profile;
  146.     /**
  147.      * @ORM\Column(type="text", nullable=true)
  148.      * @Groups({"get"})
  149.      */
  150.     private ?string $emailSignature null;
  151.     /**
  152.      * @ORM\OneToMany(targetEntity=UserLoginLog::class, mappedBy="user", fetch="EXTRA_LAZY")
  153.      */
  154.     private Collection $userLoginLogs;
  155.     /**
  156.      * @ORM\OneToMany(targetEntity=Notification::class, mappedBy="user", fetch="EXTRA_LAZY")
  157.      */
  158.     private Collection $notifications;
  159.     /**
  160.      * @ORM\OneToMany(targetEntity=UserContext::class, mappedBy="user", fetch="EXTRA_LAZY")
  161.      */
  162.     private Collection $userContexts;
  163.     /**
  164.      * @ORM\ManyToOne(targetEntity=Language::class, inversedBy="users")
  165.      * @Groups({"get"})
  166.      * #[ApiProperty(readableLink: false, writableLink: false)]
  167.      */
  168.     private ?Language $language null;
  169.     /**
  170.      * @ORM\Column(type="text", nullable=true)
  171.      * @Groups({"get"})
  172.      */
  173.     private ?string $note null;
  174.     /**
  175.      * @ORM\Column(type="boolean", options={"default" : "0"})
  176.      */
  177.     private bool $isSolo false;
  178.     /**
  179.      * @ORM\OneToMany(targetEntity=MailServer::class, mappedBy="user", fetch="EXTRA_LAZY")
  180.      */
  181.     private Collection $mail_servers;
  182.     /**
  183.      * @ORM\OneToMany(targetEntity=TeamUser::class, mappedBy="user", fetch="EXTRA_LAZY")
  184.      */
  185.     private Collection $teamUsers;
  186.     /**
  187.      * @ORM\OneToMany(targetEntity=UsersEstablishments::class, mappedBy="user")
  188.      */
  189.     private ?Collection $usersEstablishments;
  190.     public function __construct()
  191.     {
  192.         $this->userLoginLogs = new ArrayCollection();
  193.         $this->notifications = new ArrayCollection();
  194.         $this->userContexts = new ArrayCollection();
  195.         $this->mail_servers = new ArrayCollection();
  196.         $this->teamUsers = new ArrayCollection();
  197.         $this->usersEstablishments = new ArrayCollection();
  198.     }
  199.     /**
  200.      * @Groups({"get"})
  201.      * @return string
  202.      */
  203.     public function getUserIdentifier(): string
  204.     {
  205.         return $this->email;
  206.     }
  207.     /**
  208.      * @Groups({"get"})
  209.      * @return string
  210.      * @deprecated since symfony 5.3
  211.      */
  212.     public function getUsername(): string
  213.     {
  214.         return $this->getUserIdentifier();
  215.     }
  216.     /**
  217.      * @return Uuid|null
  218.      */
  219.     public function getId(): ?Uuid
  220.     {
  221.         return $this->id;
  222.     }
  223.     /**
  224.      * @return string|null
  225.      */
  226.     public function getFirstname(): ?string
  227.     {
  228.         return $this->firstname;
  229.     }
  230.     /**
  231.      * @return string|null
  232.      */
  233.     public function getLastname(): ?string
  234.     {
  235.         return $this->lastname;
  236.     }
  237.     /**
  238.      * @return string|null
  239.      */
  240.     public function getEmail(): ?string
  241.     {
  242.         return $this->email;
  243.     }
  244.     /**
  245.      * @return string|null
  246.      */
  247.     public function getMobilePhone(): ?string
  248.     {
  249.         return $this->mobilePhone;
  250.     }
  251.     /**
  252.      * @return string|null
  253.      */
  254.     public function getPassword(): ?string
  255.     {
  256.         return $this->password;
  257.     }
  258.     /**
  259.      * @return string|null
  260.      */
  261.     public function getToken(): ?string
  262.     {
  263.         return $this->token;
  264.     }
  265.     /**
  266.      * @return DateTime|null
  267.      */
  268.     public function getTokenValidity(): ?DateTime
  269.     {
  270.         return $this->token_validity;
  271.     }
  272.     /**
  273.      * @return string|null
  274.      */
  275.     public function getLoginName(): ?string
  276.     {
  277.         return $this->loginName;
  278.     }
  279.     /**
  280.      * @return string|null
  281.      */
  282.     public function getApiPin(): ?string
  283.     {
  284.         $apiPin $this->apiPin;
  285.         $apiPin $apiPin $this->openssl->decrypt($apiPin) : null;
  286.         return $apiPin;
  287.     }
  288.     /**
  289.      * @return string|null
  290.      */
  291.     public function getApiToken(): ?string
  292.     {
  293.         return $this->apiToken;
  294.     }
  295.     /**
  296.      * @return DateTime|null
  297.      */
  298.     public function getApiTokenValidity(): ?DateTime
  299.     {
  300.         return $this->apiTokenValidity;
  301.     }
  302.     /**
  303.      * @return array
  304.      */
  305.     public function getConfig(): array
  306.     {
  307.         return $this->config;
  308.     }
  309.     /**
  310.      * @param string $firstname
  311.      * @return $this
  312.      */
  313.     public function setFirstname(string $firstname): self
  314.     {
  315.         $this->firstname $firstname;
  316.         return $this;
  317.     }
  318.     /**
  319.      * @param string|null $lastname
  320.      * @return $this
  321.      */
  322.     public function setLastname(?string $lastname): self
  323.     {
  324.         $this->lastname $lastname;
  325.         return $this;
  326.     }
  327.     /**
  328.      * @param string $email
  329.      * @return $this
  330.      */
  331.     public function setEmail(string $email): self
  332.     {
  333.         $this->email $email;
  334.         return $this;
  335.     }
  336.     /**
  337.      * @param string|null $mobilePhone
  338.      * @return $this
  339.      */
  340.     public function setMobilePhone(?string $mobilePhone): self
  341.     {
  342.         $this->mobilePhone $mobilePhone;
  343.         return $this;
  344.     }
  345.     /**
  346.      * @param string|null $password
  347.      * @return $this
  348.      */
  349.     public function setPassword(?string $password null): self
  350.     {
  351.         $this->password $password;
  352.         return $this;
  353.     }
  354.     /**
  355.      * @param string|null $token
  356.      * @return $this
  357.      */
  358.     public function setToken(?string $token): self
  359.     {
  360.         $this->token $token;
  361.         return $this;
  362.     }
  363.     /**
  364.      * @param DateTime|null $token_validity
  365.      * @return $this
  366.      */
  367.     public function setTokenValidity(?DateTime $token_validity): self
  368.     {
  369.         $this->token_validity $token_validity;
  370.         return $this;
  371.     }
  372.     /**
  373.      * @param string|null $loginName
  374.      * @return $this
  375.      */
  376.     public function setLoginName(?string $loginName): self
  377.     {
  378.         $this->loginName $loginName;
  379.         return $this;
  380.     }
  381.     /**
  382.      * @param string|null $apiPin
  383.      * @return $this
  384.      */
  385.     public function setApiPin(?string $apiPin): self
  386.     {
  387.         $apiPin $apiPin $this->openssl->encrypt($apiPin) : null;
  388.         $this->apiPin $apiPin;
  389.         return $this;
  390.     }
  391.     /**
  392.      * @param string|null $apiToken
  393.      * @return $this
  394.      */
  395.     public function setApiToken(?string $apiToken): self
  396.     {
  397.         $this->apiToken $apiToken;
  398.         return $this;
  399.     }
  400.     /**
  401.      * @param DateTime|null $apiTokenValidity
  402.      * @return $this
  403.      */
  404.     public function setApiTokenValidity(?DateTime $apiTokenValidity): self
  405.     {
  406.         $this->apiTokenValidity $apiTokenValidity;
  407.         return $this;
  408.     }
  409.     /**
  410.      * @param array $config
  411.      * @return $this
  412.      */
  413.     public function setConfig(array $config): self
  414.     {
  415.         $this->config $config;
  416.         return $this;
  417.     }
  418.     /**
  419.      * @Groups({"get"})
  420.      * @return array
  421.      */
  422.     public function getRoles(): array
  423.     {
  424.         if ($this->profile) {
  425.             return $this->profile->getRoles();
  426.         }
  427.         return [];
  428.     }
  429.     /**
  430.      * @return Profile|null
  431.      */
  432.     public function getProfile(): ?Profile
  433.     {
  434.         return $this->profile;
  435.     }
  436.     /**
  437.      * @param Profile|null $profile
  438.      * @return $this
  439.      */
  440.     public function setProfile(?Profile $profile): self
  441.     {
  442.         $this->profile $profile;
  443.         return $this;
  444.     }
  445.     /**
  446.      * @return string|null
  447.      */
  448.     public function getEmailSignature(): ?string
  449.     {
  450.         return $this->emailSignature;
  451.     }
  452.     /**
  453.      * @param string|null $emailSignature
  454.      * @return User
  455.      */
  456.     public function setEmailSignature(?string $emailSignature): User
  457.     {
  458.         $this->emailSignature $emailSignature;
  459.         return $this;
  460.     }
  461.     /**
  462.      * Returning a salt is only needed, if you are not using a modern
  463.      * hashing algorithm (e.g. bcrypt or sodium) in your security.yaml.
  464.      *
  465.      * @see UserInterface
  466.      */
  467.     public function getSalt(): ?string
  468.     {
  469.         return null;
  470.     }
  471.     /**
  472.      * @see UserInterface
  473.      */
  474.     public function eraseCredentials()
  475.     {
  476.         // If you store any temporary, sensitive data on the user, clear it here
  477.         // $this->plainPassword = null;
  478.     }
  479.     /**
  480.      * @return Collection|UserLoginLog[]
  481.      */
  482.     public function getUserLoginLogs(): Collection
  483.     {
  484.         return $this->userLoginLogs;
  485.     }
  486.     /**
  487.      * @param UserLoginLog $userLoginLog
  488.      * @return $this
  489.      */
  490.     public function addUserLoginLog(UserLoginLog $userLoginLog): self
  491.     {
  492.         if (!$this->userLoginLogs->contains($userLoginLog)) {
  493.             $this->userLoginLogs[] = $userLoginLog;
  494.             $userLoginLog->setUser($this);
  495.         }
  496.         return $this;
  497.     }
  498.     /**
  499.      * @param UserLoginLog $userLoginLog
  500.      * @return $this
  501.      */
  502.     public function removeUserLoginLog(UserLoginLog $userLoginLog): self
  503.     {
  504.         if ($this->userLoginLogs->removeElement($userLoginLog)) {
  505.             if ($userLoginLog->getUser() === $this) {
  506.                 $userLoginLog->setUser(null);
  507.             }
  508.         }
  509.         return $this;
  510.     }
  511.     /**
  512.      * @return Collection|Notification[]
  513.      */
  514.     public function getNotifications(): Collection
  515.     {
  516.         return $this->notifications;
  517.     }
  518.     /**
  519.      * @param Notification $notification
  520.      * @return $this
  521.      */
  522.     public function addNotification(Notification $notification): self
  523.     {
  524.         if (!$this->notifications->contains($notification)) {
  525.             $this->notifications[] = $notification;
  526.             $notification->setUser($this);
  527.         }
  528.         return $this;
  529.     }
  530.     /**
  531.      * @param Notification $notification
  532.      * @return $this
  533.      */
  534.     public function removeNotification(Notification $notification): self
  535.     {
  536.         if ($this->notifications->removeElement($notification)) {
  537.             if ($notification->getUser() === $this) {
  538.                 $notification->setUser(null);
  539.             }
  540.         }
  541.         return $this;
  542.     }
  543.     /**
  544.      * @return Collection|UserContext[]
  545.      */
  546.     public function getUserContexts(): Collection
  547.     {
  548.         return $this->userContexts;
  549.     }
  550.     /**
  551.      * @Groups({"get"})
  552.      * @return string
  553.      */
  554.     public function getLocale(): string
  555.     {
  556.         return 'en';
  557.     }
  558.     /**
  559.      * @return Language|null
  560.      */
  561.     public function getLanguage(): ?Language
  562.     {
  563.         return $this->language;
  564.     }
  565.     /**
  566.      * @param Language|null $language
  567.      * @return $this
  568.      */
  569.     public function setLanguage(?Language $language): self
  570.     {
  571.         $this->language $language;
  572.         return $this;
  573.     }
  574.     /**
  575.      * @return string|null
  576.      */
  577.     public function getNote(): ?string
  578.     {
  579.         $note $this->note;
  580.         if ($note) {
  581.             $note $this->openssl->decrypt($note);
  582.         }
  583.         return $note;
  584.     }
  585.     /**
  586.      * @param string|null $note
  587.      * @return $this
  588.      */
  589.     public function setNote(?string $note): self
  590.     {
  591.         $this->note $note;
  592.         return $this;
  593.     }
  594.     /**
  595.      * @return bool|null
  596.      */
  597.     public function getIsSolo(): ?bool
  598.     {
  599.         return $this->isSolo;
  600.     }
  601.     /**
  602.      * @param bool $isSolo
  603.      * @return $this
  604.      */
  605.     public function setIsSolo(bool $isSolo): self
  606.     {
  607.         $this->isSolo $isSolo;
  608.         return $this;
  609.     }
  610.     /**
  611.      * @Groups({"get", "userSearch"})
  612.      * @return string
  613.      */
  614.     public function getName(): string
  615.     {
  616.         return $this->firstname ' ' $this->lastname;
  617.     }
  618.     /**
  619.      * @return Collection|MailServer[]
  620.      */
  621.     public function getMailServers(): Collection
  622.     {
  623.         return $this->mail_servers;
  624.     }
  625.     /**
  626.      * @return Collection|TeamUser[]
  627.      */
  628.     public function getTeamUsers(): Collection
  629.     {
  630.         return $this->teamUsers;
  631.     }
  632.     /**
  633.      * @Groups({"get"})
  634.      * @return string
  635.      */
  636.     public function getProfileName(): string
  637.     {
  638.         return $this->profile->getName();
  639.     }
  640.     /**
  641.      * @Groups({"get"})
  642.      * @return int
  643.      */
  644.     public function getLimitPerPage(): int
  645.     {
  646.         $userConfig $this->getConfig();
  647.         if (!isset($userConfig['core']['list']['limit']) || !$userConfig['core']['list']['limit']) {
  648.             $limit 25;
  649.         } else {
  650.             $limit = (int) $userConfig['core']['list']['limit'];
  651.         }
  652.         return $limit;
  653.     }
  654.     /**
  655.      * @return Collection<int, UsersEstablishments>
  656.      */
  657.     public function getUsersEstablishments(): Collection
  658.     {
  659.         return $this->usersEstablishments;
  660.     }
  661.     public function addUsersEstablishment(UsersEstablishments $usersEstablishment): self
  662.     {
  663.         if (!$this->usersEstablishments->contains($usersEstablishment)) {
  664.             $this->usersEstablishments[] = $usersEstablishment;
  665.             $usersEstablishment->setUser($this);
  666.         }
  667.         return $this;
  668.     }
  669.     public function removeUsersEstablishment(UsersEstablishments $usersEstablishment): self
  670.     {
  671.         if ($this->usersEstablishments->removeElement($usersEstablishment)) {
  672.             // set the owning side to null (unless already changed)
  673.             if ($usersEstablishment->getUser() === $this) {
  674.                 $usersEstablishment->setUser(null);
  675.             }
  676.         }
  677.         return $this;
  678.     }
  679. }