Add subscriber source

[MAILPOET-1377]
This commit is contained in:
Pavel Dohnal
2018-05-11 11:40:41 +01:00
parent 2627ea865a
commit 1af5802030
4 changed files with 82 additions and 0 deletions

View File

@ -171,6 +171,7 @@ class Migrator {
'updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,', 'updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,',
'deleted_at TIMESTAMP NULL,', 'deleted_at TIMESTAMP NULL,',
'unconfirmed_data longtext,', 'unconfirmed_data longtext,',
'source ENUM("form", "imported", "administrator", "api", "wordpress_user", "unknown") DEFAULT "unknown",',
'PRIMARY KEY (id),', 'PRIMARY KEY (id),',
'UNIQUE KEY email (email),', 'UNIQUE KEY email (email),',
'KEY wp_user_id (wp_user_id),', 'KEY wp_user_id (wp_user_id),',

View File

@ -2,6 +2,7 @@
namespace MailPoet\Models; namespace MailPoet\Models;
use MailPoet\Mailer\Mailer; use MailPoet\Mailer\Mailer;
use MailPoet\Newsletter\Scheduler\Scheduler; use MailPoet\Newsletter\Scheduler\Scheduler;
use MailPoet\Subscribers\Source;
use MailPoet\Util\Helpers; use MailPoet\Util\Helpers;
use MailPoet\Subscription; use MailPoet\Subscription;
@ -182,6 +183,8 @@ class Subscriber extends Model {
// create new subscriber or update if no confirmation is required // create new subscriber or update if no confirmation is required
$subscriber = self::createOrUpdate($subscriber_data); $subscriber = self::createOrUpdate($subscriber_data);
if($subscriber->getErrors() !== false) { if($subscriber->getErrors() !== false) {
$subscriber = Source::setSource($subscriber, Source::FORM);
$subscriber->save();
return $subscriber; return $subscriber;
} }
@ -206,6 +209,8 @@ class Subscriber extends Model {
} }
} }
$subscriber = Source::setSource($subscriber, Source::FORM);
if($subscriber->save()) { if($subscriber->save()) {
// link subscriber to segments // link subscriber to segments
SubscriberSegment::subscribeToSegments($subscriber, $segment_ids); SubscriberSegment::subscribeToSegments($subscriber, $segment_ids);

View File

@ -0,0 +1,37 @@
<?php
namespace MailPoet\Subscribers;
use MailPoet\Models\Subscriber;
class Source {
const FORM = 'form';
const IMPORTED = 'imported';
const ADMINISTRATOR = 'administrator';
const API = 'api';
const WORDPRESS_USER = 'wordpress_user';
const UNKNOWN = 'unknown';
private static $allowed_sources = array(
Source::FORM,
Source::IMPORTED,
Source::ADMINISTRATOR,
Source::API,
Source::WORDPRESS_USER,
Source::UNKNOWN,
);
static function setSource(Subscriber $subscriber, $source) {
if((isset($subscriber->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;
}
}

View File

@ -0,0 +1,39 @@
<?php
namespace MailPoet\Subscribers;
use MailPoet\Models\Subscriber;
class SourceTest extends \MailPoetTest {
function testItDoesntOverrideSource() {
$subscriber = Subscriber::createOrUpdate(array(
'source' => 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);
}
}