Update last_subscribed_at on a change

[MAILPOET-1993]
This commit is contained in:
Rostislav Wolny
2019-07-22 16:40:22 +02:00
committed by M. Shull
parent 2456c2de7d
commit 55b4635051
2 changed files with 34 additions and 0 deletions

View File

@ -412,6 +412,11 @@ class Subscriber extends Model {
$new_status = $subscriber->status;
}
// Update last_subscribed_at when status changes to subscribed
if ($old_status !== self::STATUS_SUBSCRIBED && $subscriber->status === self::STATUS_SUBSCRIBED) {
$subscriber->set('last_subscribed_at', WPFunctions::get()->currentTime('mysql'));
}
if ($subscriber->save()) {
if (!empty($custom_fields)) {
$subscriber->saveCustomFields($custom_fields);

View File

@ -129,6 +129,35 @@ class SubscriberTest extends \MailPoetTest {
expect($subscriber_updated->status)->equals(Subscriber::STATUS_SUBSCRIBED);
}
function testItUpdateLastSubscribedAtCorrectly() {
$subscriber = Subscriber::where('email', $this->test_data['email'])->findOne();
$subscriber->status = Subscriber::STATUS_UNCONFIRMED;
$subscriber->last_subscribed_at = null;
$subscriber->save();
$subscriber_updated = Subscriber::where('email', $this->test_data['email'])
->findOne();
expect($subscriber_updated->last_subscribed_at)->null();
// Change to subscribed updates last_updated_at
$subscriber->status = Subscriber::STATUS_SUBSCRIBED;
$subscriber->save();
$subscriber_updated = Subscriber::where('email', $this->test_data['email'])
->findOne();
$last_subscribed_at = new Carbon($subscriber_updated->last_updated_at);
expect($last_subscribed_at)->lessThan((new Carbon())->addSeconds(2));
expect($last_subscribed_at)->greaterThan((new Carbon())->subSeconds(2));
// Change to other status keeps last_updated_at
$last_subscribed_at = (new Carbon())->subHour();
$subscriber->last_subscribed_at = $last_subscribed_at;
$subscriber->save();
$subscriber->status = Subscriber::STATUS_INACTIVE;
$subscriber->save();
$subscriber_updated = Subscriber::where('email', $this->test_data['email'])
->findOne();
expect($subscriber_updated->last_subscribed_at)->equals($last_subscribed_at->toDateTimeString());
}
function testItHasSearchFilter() {
$subscriber = Subscriber::filter('search', 'john')
->findOne();