From 1af5802030a809ca94d8235fc8cb40a764c5f955 Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Fri, 11 May 2018 11:40:41 +0100 Subject: [PATCH] Add subscriber source [MAILPOET-1377] --- lib/Config/Migrator.php | 1 + lib/Models/Subscriber.php | 5 ++++ lib/Subscribers/Source.php | 37 +++++++++++++++++++++++++ tests/unit/Subscribers/SourceTest.php | 39 +++++++++++++++++++++++++++ 4 files changed, 82 insertions(+) create mode 100644 lib/Subscribers/Source.php create mode 100644 tests/unit/Subscribers/SourceTest.php diff --git a/lib/Config/Migrator.php b/lib/Config/Migrator.php index d1d771dd94..cfcdd923f0 100644 --- a/lib/Config/Migrator.php +++ b/lib/Config/Migrator.php @@ -171,6 +171,7 @@ class Migrator { 'updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,', 'deleted_at TIMESTAMP NULL,', 'unconfirmed_data longtext,', + 'source ENUM("form", "imported", "administrator", "api", "wordpress_user", "unknown") DEFAULT "unknown",', 'PRIMARY KEY (id),', 'UNIQUE KEY email (email),', 'KEY wp_user_id (wp_user_id),', diff --git a/lib/Models/Subscriber.php b/lib/Models/Subscriber.php index d706455c54..632596b9ac 100644 --- a/lib/Models/Subscriber.php +++ b/lib/Models/Subscriber.php @@ -2,6 +2,7 @@ namespace MailPoet\Models; use MailPoet\Mailer\Mailer; use MailPoet\Newsletter\Scheduler\Scheduler; +use MailPoet\Subscribers\Source; use MailPoet\Util\Helpers; use MailPoet\Subscription; @@ -182,6 +183,8 @@ class Subscriber extends Model { // create new subscriber or update if no confirmation is required $subscriber = self::createOrUpdate($subscriber_data); if($subscriber->getErrors() !== false) { + $subscriber = Source::setSource($subscriber, Source::FORM); + $subscriber->save(); return $subscriber; } @@ -206,6 +209,8 @@ class Subscriber extends Model { } } + $subscriber = Source::setSource($subscriber, Source::FORM); + if($subscriber->save()) { // link subscriber to segments SubscriberSegment::subscribeToSegments($subscriber, $segment_ids); diff --git a/lib/Subscribers/Source.php b/lib/Subscribers/Source.php new file mode 100644 index 0000000000..b19b606486 --- /dev/null +++ b/lib/Subscribers/Source.php @@ -0,0 +1,37 @@ +source)) && ($subscriber->source !== Source::UNKNOWN)) { + // we don't want to override source + return $subscriber; + } + if(!in_array($source, Source::$allowed_sources)) { + throw new \InvalidArgumentException('Invalid source "' . $source . '""'); + } + $subscriber->set('source', $source); + return $subscriber; + } + +} \ No newline at end of file diff --git a/tests/unit/Subscribers/SourceTest.php b/tests/unit/Subscribers/SourceTest.php new file mode 100644 index 0000000000..867101b747 --- /dev/null +++ b/tests/unit/Subscribers/SourceTest.php @@ -0,0 +1,39 @@ + Source::FORM, + )); + $updated_subscriber = Source::setSource($subscriber, Source::API); + expect($updated_subscriber->source)->equals(Source::FORM); + } + + function testItDoesntAllowInvalidSource() { + $subscriber = Subscriber::createOrUpdate(array( + 'source' => Source::UNKNOWN, + )); + $this->setExpectedException('\InvalidArgumentException'); + Source::setSource($subscriber, 'invalid source'); + } + + function testItWorksWhenNoSourceIsSet() { + $subscriber = Subscriber::createOrUpdate(array()); + $updated_subscriber = Source::setSource($subscriber, Source::FORM); + expect($updated_subscriber->source)->equals(Source::FORM); + } + + function testItWorks() { + $subscriber = Subscriber::createOrUpdate(array( + 'source' => Source::UNKNOWN, + )); + $updated_subscriber = Source::setSource($subscriber, Source::FORM); + expect($updated_subscriber->source)->equals(Source::FORM); + } + +}