<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\JoinColumn;
use Doctrine\ORM\Mapping\ManyToOne;
use Doctrine\ORM\Mapping\OneToOne;
use Frivol\Common\Dict\AccountStatus;
use JMS\Serializer\Annotation\Exclude;
use JMS\Serializer\Annotation\Groups;
/**
* @ORM\Table("Account")
*
* @ORM\Entity(repositoryClass="App\Repository\AccountRepository")
*
* @ORM\HasLifecycleCallbacks()
*/
class Account
{
public const CONFIRMATION_TOKEN_SALT = '-thizzzIZZZmyyyyyZzzzzecret!';
/**
* @Groups({"commonids", "conversationdetail", "conversationmessageindex", "spamindex", "messageindex", "grouplist", "trafficindex", "adminindex", "amateurupgradeindex", "waitrating", "operatorindex", "contentdetail", "mediaindex"})
*
* @ORM\Id()
*
* @ORM\GeneratedValue()
*
* @ORM\Column(type="integer")
*/
private $id;
/**
* @Exclude()
*
* @ORM\Column(type="string", length=64, nullable=true)
*/
private $password;
/**
* @Exclude()
*
* @ORM\Column(type="string", length=32, nullable=true)
*/
private $salt;
/**
* @Groups({"accountindex", "adminindex", "webmasterindex", "amateurupgradeindex"})
*
* @ORM\Column(type="string", length=255, unique=true)
*/
private $email;
/**
* @Groups({"accountindex"})
*
* @ORM\Column(type="string", length=6, nullable=true)
*/
private $email_token;
/**
* @Groups({"accountstatus", "webmasterindex", "amateurindex", "admindetails", "mediaindex"})
*
* @ORM\Column(type="smallint", length=6)
*/
private $status = AccountStatus::NEW;
/**
* @Groups({"accountindex", "adminindex"})
*
* @ORM\Column(type="string", length=2)
*/
private $locale = 'de';
/**
* @Groups({"adminindex", "amateurupgradeindex", "logindetails"})
*
* @OneToOne(targetEntity="Member", inversedBy="account", cascade={"persist"})
*
* @JoinColumn(name="member_id", referencedColumnName="id", onDelete="SET NULL")
*/
protected $member;
/**
* @Groups({"adminindex"})
*
* @OneToOne(targetEntity="Webmaster", inversedBy="account", cascade={"persist"})
*
* @JoinColumn(name="webmaster_id", referencedColumnName="id", onDelete="SET NULL")
*/
protected $webmaster;
/**
* @Groups({"accountindex"})
*
* @ManyToOne(targetEntity="Webmaster", cascade={"persist"})
*
* @JoinColumn(name="advertised_by", referencedColumnName="id", onDelete="SET NULL")
*/
protected $advertised_by;
/**
* @Groups({"webmasterstats", "accountindex"})
*
* @ORM\Column(type="integer", nullable=true)
*/
private $advertised_campaign_id;
/**
* @Groups({"accountindex", "adminindex"})
*
* @ORM\Column(type="datetime")
*/
private $created_at;
/**
* @ORM\Column(type="datetime")
*/
private $updated_at;
/**
* @Exclude()
*
* @Groups({"accountindex"})
*
* @ManyToOne(targetEntity="Member", cascade={"persist"})
*
* @JoinColumn(name="advertised_by_member", referencedColumnName="id", onDelete="SET NULL")
*/
private $advertised_by_member;
/**
* @Exclude()
*
* @Groups({"accountindex"})
*
* @ManyToOne(targetEntity="Content", cascade={"persist"})
*
* @JoinColumn(name="advertised_by_content", referencedColumnName="id", onDelete="SET NULL")
*/
private $advertised_by_content;
/**
*
* @Groups({"accountindex"})
*
* @ManyToOne(targetEntity="MailProvider", cascade={"persist"})
*
* @JoinColumn(name="mailProvider", referencedColumnName="id", onDelete="SET NULL", nullable=true)
*/
private $mailProvider;
/**
* @Groups({"webmasterstats"})
*
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $advertised_by_tracking_id;
/**
* @ORM\OneToOne(targetEntity="App\Entity\Admin", mappedBy="account", cascade={"persist", "remove"})
*/
private $admin;
/**
* @Exclude()
*
* @ORM\Column(type="json", nullable=true)
*/
private ?array $meta = null;
/**
* @ORM\PrePersist()
*/
public function prePersist()
{
if (!$this->getCreatedAt()) {
$this->setCreatedAt(new \DateTime());
}
if (!$this->getUpdatedAt()) {
$this->setUpdatedAt(new \DateTime());
}
}
public function generateEmailToken(): self
{
$this->setEmailToken(random_int(1000, 9999));
return $this;
}
public function getId()
{
return $this->id;
}
public function getPassword(): ?string
{
return $this->password;
}
public function setPassword(?string $password): self
{
$this->password = $password;
return $this;
}
public function getSalt(): ?string
{
return $this->salt;
}
public function setSalt(?string $salt): self
{
$this->salt = $salt;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(string $email): self
{
$this->email = trim(strtolower($email));
return $this;
}
public function getEmailToken(): ?string
{
return $this->email_token;
}
public function setEmailToken(?string $email_token): self
{
$this->email_token = $email_token;
return $this;
}
public function removeEmailToken(): self
{
$this->email_token = null;
return $this;
}
public function getStatus(): ?int
{
return $this->status;
}
public function setStatus(int $status): self
{
$this->status = $status;
return $this;
}
public function getLocale(): ?string
{
return $this->locale;
}
public function setLocale(string $locale): self
{
$this->locale = $locale;
return $this;
}
public function getAdvertisedCampaignId(): ?int
{
return $this->advertised_campaign_id;
}
public function setAdvertisedCampaignId(?int $advertised_campaign_id): self
{
$this->advertised_campaign_id = $advertised_campaign_id;
return $this;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->created_at;
}
public function setCreatedAt(\DateTimeInterface $created_at): self
{
$this->created_at = $created_at;
return $this;
}
public function getUpdatedAt(): ?\DateTimeInterface
{
return $this->updated_at;
}
public function setUpdatedAt(\DateTimeInterface $updated_at): self
{
$this->updated_at = $updated_at;
return $this;
}
public function getAdvertisedByMember(): ?Member
{
return $this->advertised_by_member;
}
public function setAdvertisedByMember(?Member $member): self
{
$this->advertised_by_member = $member;
return $this;
}
public function getAdvertisedByContent(): ?Content
{
return $this->advertised_by_content;
}
public function setAdvertisedByContent(?Content $advertised_by_content): self
{
$this->advertised_by_content = $advertised_by_content;
return $this;
}
public function getAdvertisedByTrackingId(): ?int
{
return $this->advertised_by_tracking_id;
}
public function setAdvertisedByTrackingId(?string $advertised_by_tracking_id): self
{
$this->advertised_by_tracking_id = $advertised_by_tracking_id;
return $this;
}
public function setAdvertisedBy(?Webmaster $advertised_by): self
{
$this->advertised_by = $advertised_by;
return $this;
}
public function getAdvertisedBy(): ?Webmaster
{
return $this->advertised_by;
}
public function hasWebmaster(): bool
{
return null !== $this->getWebmaster();
}
public function setWebmaster(?Webmaster $webmaster): self
{
$this->webmaster = $webmaster;
return $this;
}
public function getWebmaster(): ?Webmaster
{
return $this->webmaster;
}
public function hasMember(): bool
{
return null != $this->getMember();
}
public function getMember(): ?Member
{
return $this->member;
}
public function setMember(?Member $member): self
{
$this->member = $member;
return $this;
}
public function isAdmin(): bool
{
return $this->admin instanceof Admin;
}
public function getAdmin(): ?Admin
{
return $this->admin;
}
public function setAdmin(Admin $admin): self
{
$this->admin = $admin;
// set the owning side of the relation if necessary
if ($this !== $admin->getAccount()) {
$admin->setAccount($this);
}
return $this;
}
public function isActive(): bool
{
return AccountStatus::ACTIVE === $this->status;
}
public function isNew(): bool
{
return AccountStatus::NEW === $this->status;
}
public function isBlocked(): bool
{
return AccountStatus::BLOCKED === $this->status;
}
public function isDeleted(): bool
{
return AccountStatus::DELETED === $this->status;
}
public function isConfirmed(): bool
{
return $this->member instanceof Member && $this->member->getIsActive();
}
public function setNextPassword(string $newHash, string $newSalt): self
{
$this->meta['nextPasswordHash'] = $newHash;
$this->meta['nextPasswordSalt'] = $newSalt;
$this->generateEmailToken();
return $this;
}
public function applyNextPassword(): bool
{
if (!$this->hasNextPasswordHash() || !$this->hasNextPasswordSalt()) {
return false;
}
$this->password = $this->getNextPasswordHash();
$this->salt = $this->getNextPasswordSalt();
$this->removeNextPassword();
$this->removeEmailToken();
return true;
}
public function getConfirmationToken(): ?string
{
if (empty($this->email_token)) {
return null;
}
return sha1($this->email.$this->email_token.self::CONFIRMATION_TOKEN_SALT);
}
private function hasNextPasswordHash(): bool
{
return isset($this->meta['nextPasswordHash']) && !empty($this->meta['nextPasswordHash']);
}
private function hasNextPasswordSalt(): bool
{
return isset($this->meta['nextPasswordSalt']) && !empty($this->meta['nextPasswordSalt']);
}
private function getNextPasswordHash(): ?string
{
return $this->meta['nextPasswordHash'] ?? null;
}
private function getNextPasswordSalt(): ?string
{
return $this->meta['nextPasswordSalt'] ?? null;
}
private function removeNextPassword(): self
{
unset($this->meta['nextPasswordHash'], $this->meta['nextPasswordSalt']);
return $this;
}
public function setNextEmail(string $nextEmail): self
{
$this->meta['nextEmail'] = $nextEmail;
$this->generateEmailToken();
return $this;
}
public function getNextEmail(): ?string
{
return $this->meta['nextEmail'] ?? null;
}
private function hasNextEmail(): bool
{
return isset($this->meta['nextEmail']) && !empty($this->meta['nextEmail']);
}
private function removeNextEmail(): self
{
unset($this->meta['nextEmail']);
$this->removeEmailToken();
return $this;
}
public function applyNextEmail(): bool
{
if (!$this->hasNextEmail()) {
return false;
}
$this->email = $this->getNextEmail();
$this->removeNextEmail();
return true;
}
public function activate(): self
{
$this->setStatus(AccountStatus::ACTIVE);
$this->removeEmailToken();
return $this;
}
/**
* @return mixed
*/
public function getMailProvider(): ?MailProvider {
return $this->mailProvider;
}
/**
* @param mixed $mailProvider
* @return self
*/
public function setMailProvider(?MailProvider $mailProvider): self {
$this->mailProvider = $mailProvider;
return $this;
}
}