| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468 |
- <?php
- namespace MailPoet\Entities;
- if (!defined('ABSPATH')) exit;
- use DateTimeInterface;
- use MailPoet\Doctrine\EntityTraits\AutoincrementedIdTrait;
- use MailPoet\Doctrine\EntityTraits\CreatedAtTrait;
- use MailPoet\Doctrine\EntityTraits\DeletedAtTrait;
- use MailPoet\Doctrine\EntityTraits\UpdatedAtTrait;
- use MailPoet\Util\Helpers;
- use MailPoetVendor\Doctrine\Common\Collections\ArrayCollection;
- use MailPoetVendor\Doctrine\Common\Collections\Collection;
- use MailPoetVendor\Doctrine\ORM\Mapping as ORM;
- use MailPoetVendor\Symfony\Component\Validator\Constraints as Assert;
- /**
- * @ORM\Entity()
- * @ORM\Table(name="subscribers")
- * @ORM\HasLifecycleCallbacks
- */
- class SubscriberEntity {
- // statuses
- const STATUS_BOUNCED = 'bounced';
- const STATUS_INACTIVE = 'inactive';
- const STATUS_SUBSCRIBED = 'subscribed';
- const STATUS_UNCONFIRMED = 'unconfirmed';
- const STATUS_UNSUBSCRIBED = 'unsubscribed';
- public const OBSOLETE_LINK_TOKEN_LENGTH = 6;
- public const LINK_TOKEN_LENGTH = 32;
- use AutoincrementedIdTrait;
- use CreatedAtTrait;
- use UpdatedAtTrait;
- use DeletedAtTrait;
- /**
- * @ORM\Column(type="bigint", nullable=true)
- * @var string|null
- */
- private $wpUserId;
- /**
- * @ORM\Column(type="boolean")
- * @var bool
- */
- private $isWoocommerceUser = false;
- /**
- * @ORM\Column(type="string")
- * @var string
- */
- private $firstName = '';
- /**
- * @ORM\Column(type="string")
- * @var string
- */
- private $lastName = '';
- /**
- * @ORM\Column(type="string")
- * @Assert\Email()
- * @Assert\NotBlank()
- * @var string
- */
- private $email;
- /**
- * @ORM\Column(type="string")
- * @var string
- */
- private $status = self::STATUS_UNCONFIRMED;
- /**
- * @ORM\Column(type="string", nullable=true)
- * @var string|null
- */
- private $subscribedIp;
- /**
- * @ORM\Column(type="string", nullable=true)
- * @var string|null
- */
- private $confirmedIp;
- /**
- * @ORM\Column(type="datetimetz", nullable=true)
- * @var DateTimeInterface|null
- */
- private $confirmedAt;
- /**
- * @ORM\Column(type="datetimetz", nullable=true)
- * @var DateTimeInterface|null
- */
- private $lastSubscribedAt;
- /**
- * @ORM\Column(type="text", nullable=true)
- * @var string|null
- */
- private $unconfirmedData;
- /**
- * @ORM\Column(type="string")
- * @var string
- */
- private $source = 'unknown';
- /**
- * @ORM\Column(type="integer")
- * @var int
- */
- private $countConfirmations = 0;
- /**
- * @ORM\Column(type="string", nullable=true)
- * @var string|null
- */
- private $unsubscribeToken;
- /**
- * @ORM\Column(type="string", nullable=true)
- * @var string|null
- */
- private $linkToken;
- /**
- * @ORM\Column(type="float", nullable=true)
- * @var float|null
- */
- private $engagementScore;
- /**
- * @ORM\Column(type="datetimetz", nullable=true)
- * @var DateTimeInterface|null
- */
- private $engagementScoreUpdatedAt;
- /**
- * @ORM\Column(type="datetimetz", nullable=true)
- * @var DateTimeInterface|null
- */
- private $lastEngagementAt;
- /**
- * @ORM\OneToMany(targetEntity="MailPoet\Entities\SubscriberSegmentEntity", mappedBy="subscriber", orphanRemoval=true)
- * @var Collection<int, SubscriberSegmentEntity>
- */
- private $subscriberSegments;
- public function __construct() {
- $this->subscriberSegments = new ArrayCollection();
- }
- /**
- * @deprecated This is here only for backward compatibility with custom shortcodes https://kb.mailpoet.com/article/160-create-a-custom-shortcode
- * This can be removed after 2021-08-01
- */
- public function __get($key) {
- $getterName = 'get' . Helpers::underscoreToCamelCase($key, $capitaliseFirstChar = true);
- $callable = [$this, $getterName];
- if (is_callable($callable)) {
- return call_user_func($callable);
- }
- }
- /**
- * @return int|null
- */
- public function getWpUserId() {
- return $this->wpUserId ? (int)$this->wpUserId : null;
- }
- /**
- * @param int|null $wpUserId
- */
- public function setWpUserId($wpUserId) {
- $this->wpUserId = $wpUserId ? (string)$wpUserId : null;
- }
- public function isWPUser(): bool {
- return $this->getWpUserId() > 0;
- }
- /**
- * @return bool
- */
- public function getIsWoocommerceUser() {
- return $this->isWoocommerceUser;
- }
- /**
- * @param bool $isWoocommerceUser
- */
- public function setIsWoocommerceUser($isWoocommerceUser) {
- $this->isWoocommerceUser = $isWoocommerceUser;
- }
- /**
- * @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;
- }
- /**
- * @return string
- */
- public function getEmail() {
- return $this->email;
- }
- /**
- * @param string $email
- */
- public function setEmail($email) {
- $this->email = $email;
- }
- /**
- * @return string
- */
- public function getStatus() {
- return $this->status;
- }
- /**
- * @param string $status
- */
- public function setStatus($status) {
- if (!in_array($status, [
- self::STATUS_BOUNCED,
- self::STATUS_INACTIVE,
- self::STATUS_SUBSCRIBED,
- self::STATUS_UNCONFIRMED,
- self::STATUS_UNSUBSCRIBED,
- ])) {
- throw new \InvalidArgumentException("Invalid status '{$status}' given to subscriber!");
- }
- $this->status = $status;
- }
- /**
- * @return string|null
- */
- public function getSubscribedIp() {
- return $this->subscribedIp;
- }
- /**
- * @param string $subscribedIp
- */
- public function setSubscribedIp($subscribedIp) {
- $this->subscribedIp = $subscribedIp;
- }
- /**
- * @return string|null
- */
- public function getConfirmedIp() {
- return $this->confirmedIp;
- }
- /**
- * @param string|null $confirmedIp
- */
- public function setConfirmedIp($confirmedIp) {
- $this->confirmedIp = $confirmedIp;
- }
- /**
- * @return DateTimeInterface|null
- */
- public function getConfirmedAt() {
- return $this->confirmedAt;
- }
- /**
- * @param DateTimeInterface|null $confirmedAt
- */
- public function setConfirmedAt($confirmedAt) {
- $this->confirmedAt = $confirmedAt;
- }
- /**
- * @return DateTimeInterface|null
- */
- public function getLastSubscribedAt() {
- return $this->lastSubscribedAt;
- }
- /**
- * @param DateTimeInterface|null $lastSubscribedAt
- */
- public function setLastSubscribedAt($lastSubscribedAt) {
- $this->lastSubscribedAt = $lastSubscribedAt;
- }
- /**
- * @return string|null
- */
- public function getUnconfirmedData() {
- return $this->unconfirmedData;
- }
- /**
- * @param string|null $unconfirmedData
- */
- public function setUnconfirmedData($unconfirmedData) {
- $this->unconfirmedData = $unconfirmedData;
- }
- /**
- * @return string
- */
- public function getSource() {
- return $this->source;
- }
- /**
- * @param string $source
- */
- public function setSource($source) {
- if (!in_array($source, [
- 'api',
- 'form',
- 'unknown',
- 'imported',
- 'administrator',
- 'wordpress_user',
- 'woocommerce_user',
- 'woocommerce_checkout',
- ])) {
- throw new \InvalidArgumentException("Invalid source '{$source}' given to subscriber!");
- }
- $this->source = $source;
- }
- /**
- * @return int
- */
- public function getConfirmationsCount() {
- return $this->countConfirmations;
- }
- /**
- * @param int $countConfirmations
- */
- public function setConfirmationsCount($countConfirmations) {
- $this->countConfirmations = $countConfirmations;
- }
- /**
- * @return string|null
- */
- public function getUnsubscribeToken() {
- return $this->unsubscribeToken;
- }
- /**
- * @param string|null $unsubscribeToken
- */
- public function setUnsubscribeToken($unsubscribeToken) {
- $this->unsubscribeToken = $unsubscribeToken;
- }
- /**
- * @return string|null
- */
- public function getLinkToken() {
- return $this->linkToken;
- }
- /**
- * @param string|null $linkToken
- */
- public function setLinkToken($linkToken) {
- $this->linkToken = $linkToken;
- }
- /**
- * @return Collection<int, SubscriberSegmentEntity>
- */
- public function getSubscriberSegments() {
- return $this->subscriberSegments;
- }
- public function getSegments() {
- return $this->subscriberSegments->map(function (SubscriberSegmentEntity $subscriberSegment) {
- return $subscriberSegment->getSegment();
- })->filter(function ($segment) {
- return $segment !== null;
- });
- }
- /**
- * @return float|null
- */
- public function getEngagementScore(): ?float {
- return $this->engagementScore;
- }
- /**
- * @param float|null $engagementScore
- */
- public function setEngagementScore(?float $engagementScore): void {
- $this->engagementScore = $engagementScore;
- }
- /**
- * @return DateTimeInterface|null
- */
- public function getEngagementScoreUpdatedAt(): ?DateTimeInterface {
- return $this->engagementScoreUpdatedAt;
- }
- /**
- * @param DateTimeInterface|null $engagementScoreUpdatedAt
- */
- public function setEngagementScoreUpdatedAt(?DateTimeInterface $engagementScoreUpdatedAt): void {
- $this->engagementScoreUpdatedAt = $engagementScoreUpdatedAt;
- }
- public function getLastEngagementAt(): ?DateTimeInterface {
- return $this->lastEngagementAt;
- }
- public function setLastEngagementAt(DateTimeInterface $lastEngagementAt): void {
- $this->lastEngagementAt = $lastEngagementAt;
- }
- /** @ORM\PreFlush */
- public function cleanupSubscriberSegments(): void {
- // Delete old orphan SubscriberSegments to avoid errors on update
- $this->subscriberSegments->map(function (SubscriberSegmentEntity $subscriberSegment) {
- if ($subscriberSegment->getSegment() === null) {
- $this->subscriberSegments->removeElement($subscriberSegment);
- }
- });
- }
- }
|