Add inactive subscribers status job scheduling on settings change

[MAILPOET-2003]
This commit is contained in:
Rostislav Wolny
2019-04-24 16:26:10 +02:00
committed by M. Shull
parent f5d154d680
commit bfcc499b10
2 changed files with 44 additions and 0 deletions

View File

@ -2,9 +2,12 @@
namespace MailPoet\API\JSON\v1; namespace MailPoet\API\JSON\v1;
use Carbon\Carbon;
use MailPoet\API\JSON\Endpoint as APIEndpoint; use MailPoet\API\JSON\Endpoint as APIEndpoint;
use MailPoet\API\JSON\Error as APIError; use MailPoet\API\JSON\Error as APIError;
use MailPoet\Config\AccessControl; use MailPoet\Config\AccessControl;
use MailPoet\Cron\Workers\InactiveSubscribers;
use MailPoet\Models\ScheduledTask;
use MailPoet\Services\Bridge; use MailPoet\Services\Bridge;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
@ -36,12 +39,32 @@ class Settings extends APIEndpoint {
WPFunctions::get()->__('You have not specified any settings to be saved.', 'mailpoet') WPFunctions::get()->__('You have not specified any settings to be saved.', 'mailpoet')
)); ));
} else { } else {
$original_inactivation_interval = (int)$this->settings->get('deactivate_subscriber_after_inactive_days');
foreach ($settings as $name => $value) { foreach ($settings as $name => $value) {
$this->settings->set($name, $value); $this->settings->set($name, $value);
} }
if (isset($settings['deactivate_subscriber_after_inactive_days'])
&& $original_inactivation_interval !== (int)$settings['deactivate_subscriber_after_inactive_days']
) {
$this->onInactiveSubscribersIntervalChange();
}
$bridge = new Bridge(); $bridge = new Bridge();
$bridge->onSettingsSave($settings); $bridge->onSettingsSave($settings);
return $this->successResponse($this->settings->getAll()); return $this->successResponse($this->settings->getAll());
} }
} }
private function onInactiveSubscribersIntervalChange() {
$task = ScheduledTask::where('type', InactiveSubscribers::TASK_TYPE)
->whereRaw('status = ?', [ScheduledTask::STATUS_SCHEDULED])
->findOne();
if (!$task) {
$task = ScheduledTask::create();
$task->type = InactiveSubscribers::TASK_TYPE;
$task->status = ScheduledTask::STATUS_SCHEDULED;
}
$datetime = Carbon::createFromTimestamp(WPFunctions::get()->currentTime('timestamp'));
$task->scheduled_at = $datetime->subMinute();
$task->save();
}
} }

View File

@ -1,9 +1,12 @@
<?php <?php
namespace MailPoet\Test\API\JSON\v1; namespace MailPoet\Test\API\JSON\v1;
use Carbon\Carbon;
use MailPoet\API\JSON\Response as APIResponse; use MailPoet\API\JSON\Response as APIResponse;
use MailPoet\API\JSON\Error as APIError; use MailPoet\API\JSON\Error as APIError;
use MailPoet\API\JSON\v1\Settings; use MailPoet\API\JSON\v1\Settings;
use MailPoet\Cron\Workers\InactiveSubscribers;
use MailPoet\Models\ScheduledTask;
use MailPoet\Models\Setting; use MailPoet\Models\Setting;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
@ -17,6 +20,7 @@ class SettingsTest extends \MailPoetTest {
function _before() { function _before() {
parent::_before(); parent::_before();
\ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table);
$this->settings = new SettingsController(); $this->settings = new SettingsController();
$this->settings->set('some.setting.key', true); $this->settings->set('some.setting.key', true);
$this->endpoint = new Settings($this->settings); $this->endpoint = new Settings($this->settings);
@ -60,6 +64,23 @@ class SettingsTest extends \MailPoetTest {
expect($response->data['some']['new_setting'])->true(); expect($response->data['some']['new_setting'])->true();
} }
function testItSchedulesInactiveSubscribersCheckIfIntervalSettingChanges() {
$this->settings->set('deactivate_subscriber_after_inactive_days', 30);
$settings = ['deactivate_subscriber_after_inactive_days' => 30];
$this->endpoint->set($settings);
$task = ScheduledTask::where('type', InactiveSubscribers::TASK_TYPE)
->whereRaw('status = ?', [ScheduledTask::STATUS_SCHEDULED])
->findOne();
expect($task)->false();
$settings = ['deactivate_subscriber_after_inactive_days' => 0];
$this->endpoint->set($settings);
$task = ScheduledTask::where('type', InactiveSubscribers::TASK_TYPE)
->whereRaw('status = ?', [ScheduledTask::STATUS_SCHEDULED])
->findOne();
expect($task->scheduled_at)->lessThan(Carbon::now());
}
function _after() { function _after() {
\ORM::forTable(Setting::$_table)->deleteMany(); \ORM::forTable(Setting::$_table)->deleteMany();
} }