Disable send buttons and endpoints
[MAILPOET-2394]
This commit is contained in:
committed by
Jack Kitterhing
parent
856c870ae5
commit
c9052d71d4
@ -494,6 +494,7 @@ class NewsletterSend extends React.Component {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={this.handleResume}
|
onClick={this.handleResume}
|
||||||
value={MailPoet.I18n.t('resume')}
|
value={MailPoet.I18n.t('resume')}
|
||||||
|
disabled={window.mailpoet_subscribers_limit_reached}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
: (
|
: (
|
||||||
@ -503,6 +504,7 @@ class NewsletterSend extends React.Component {
|
|||||||
onClick={this.handleSend}
|
onClick={this.handleSend}
|
||||||
value={MailPoet.I18n.t('send')}
|
value={MailPoet.I18n.t('send')}
|
||||||
{...sendButtonOptions}
|
{...sendButtonOptions}
|
||||||
|
disabled={window.mailpoet_subscribers_limit_reached}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ namespace MailPoet\API\JSON\v1;
|
|||||||
use Carbon\Carbon;
|
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\API\JSON\Response;
|
||||||
use MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder;
|
use MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder;
|
||||||
use MailPoet\Config\AccessControl;
|
use MailPoet\Config\AccessControl;
|
||||||
use MailPoet\Cron\CronHelper;
|
use MailPoet\Cron\CronHelper;
|
||||||
@ -26,6 +27,7 @@ use MailPoet\Newsletter\Scheduler\Scheduler;
|
|||||||
use MailPoet\Newsletter\Url as NewsletterUrl;
|
use MailPoet\Newsletter\Url as NewsletterUrl;
|
||||||
use MailPoet\Services\AuthorizedEmailsController;
|
use MailPoet\Services\AuthorizedEmailsController;
|
||||||
use MailPoet\Settings\SettingsController;
|
use MailPoet\Settings\SettingsController;
|
||||||
|
use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
|
||||||
use MailPoet\WooCommerce\Helper as WCHelper;
|
use MailPoet\WooCommerce\Helper as WCHelper;
|
||||||
use MailPoet\WP\Emoji;
|
use MailPoet\WP\Emoji;
|
||||||
use MailPoet\WP\Functions as WPFunctions;
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
@ -75,6 +77,9 @@ class Newsletters extends APIEndpoint {
|
|||||||
/** @var MailerFactory */
|
/** @var MailerFactory */
|
||||||
private $mailer;
|
private $mailer;
|
||||||
|
|
||||||
|
/** @var SubscribersFeature */
|
||||||
|
private $subscribers_feature;
|
||||||
|
|
||||||
function __construct(
|
function __construct(
|
||||||
Listing\BulkActionController $bulk_action,
|
Listing\BulkActionController $bulk_action,
|
||||||
Listing\Handler $listing_handler,
|
Listing\Handler $listing_handler,
|
||||||
@ -88,7 +93,8 @@ class Newsletters extends APIEndpoint {
|
|||||||
PostNotificationScheduler $post_notification_scheduler,
|
PostNotificationScheduler $post_notification_scheduler,
|
||||||
MailerFactory $mailer,
|
MailerFactory $mailer,
|
||||||
MetaInfo $mailerMetaInfo,
|
MetaInfo $mailerMetaInfo,
|
||||||
Emoji $emoji
|
Emoji $emoji,
|
||||||
|
SubscribersFeature $subscribers_feature
|
||||||
) {
|
) {
|
||||||
$this->bulk_action = $bulk_action;
|
$this->bulk_action = $bulk_action;
|
||||||
$this->listing_handler = $listing_handler;
|
$this->listing_handler = $listing_handler;
|
||||||
@ -103,6 +109,7 @@ class Newsletters extends APIEndpoint {
|
|||||||
$this->mailer = $mailer;
|
$this->mailer = $mailer;
|
||||||
$this->mailerMetaInfo = $mailerMetaInfo;
|
$this->mailerMetaInfo = $mailerMetaInfo;
|
||||||
$this->emoji = $emoji;
|
$this->emoji = $emoji;
|
||||||
|
$this->subscribers_feature = $subscribers_feature;
|
||||||
}
|
}
|
||||||
|
|
||||||
function get($data = []) {
|
function get($data = []) {
|
||||||
@ -288,6 +295,12 @@ class Newsletters extends APIEndpoint {
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($status === Newsletter::STATUS_ACTIVE && $this->subscribers_feature->check()) {
|
||||||
|
return $this->errorResponse([
|
||||||
|
APIError::FORBIDDEN => WPFunctions::get()->__('Subscribers limit reached.', 'mailpoet'),
|
||||||
|
], [], Response::STATUS_FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
$id = (isset($data['id'])) ? (int)$data['id'] : false;
|
$id = (isset($data['id'])) ? (int)$data['id'] : false;
|
||||||
$newsletter = Newsletter::findOneWithOptions($id);
|
$newsletter = Newsletter::findOneWithOptions($id);
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ namespace MailPoet\API\JSON\v1;
|
|||||||
|
|
||||||
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\API\JSON\Response;
|
||||||
use MailPoet\Config\AccessControl;
|
use MailPoet\Config\AccessControl;
|
||||||
use MailPoet\Cron\Triggers\WordPress;
|
use MailPoet\Cron\Triggers\WordPress;
|
||||||
use MailPoet\Models\Newsletter;
|
use MailPoet\Models\Newsletter;
|
||||||
@ -11,6 +12,7 @@ use MailPoet\Models\SendingQueue as SendingQueueModel;
|
|||||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
use MailPoet\Newsletter\Scheduler\Scheduler;
|
||||||
use MailPoet\Segments\SubscribersFinder;
|
use MailPoet\Segments\SubscribersFinder;
|
||||||
use MailPoet\Tasks\Sending as SendingTask;
|
use MailPoet\Tasks\Sending as SendingTask;
|
||||||
|
use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
|
||||||
use MailPoet\WP\Functions as WPFunctions;
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
|
|
||||||
class SendingQueue extends APIEndpoint {
|
class SendingQueue extends APIEndpoint {
|
||||||
@ -18,7 +20,19 @@ class SendingQueue extends APIEndpoint {
|
|||||||
'global' => AccessControl::PERMISSION_MANAGE_EMAILS,
|
'global' => AccessControl::PERMISSION_MANAGE_EMAILS,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/** @var SubscribersFeature */
|
||||||
|
private $subscribers_feature;
|
||||||
|
|
||||||
|
function __construct(SubscribersFeature $subscribers_feature) {
|
||||||
|
$this->subscribers_feature = $subscribers_feature;
|
||||||
|
}
|
||||||
|
|
||||||
function add($data = []) {
|
function add($data = []) {
|
||||||
|
if ($this->subscribers_feature->check()) {
|
||||||
|
return $this->errorResponse([
|
||||||
|
APIError::FORBIDDEN => WPFunctions::get()->__('Subscribers limit reached.', 'mailpoet'),
|
||||||
|
], [], Response::STATUS_FORBIDDEN);
|
||||||
|
}
|
||||||
$newsletter_id = (isset($data['newsletter_id'])
|
$newsletter_id = (isset($data['newsletter_id'])
|
||||||
? (int)$data['newsletter_id']
|
? (int)$data['newsletter_id']
|
||||||
: false
|
: false
|
||||||
@ -131,6 +145,11 @@ class SendingQueue extends APIEndpoint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function resume($data = []) {
|
function resume($data = []) {
|
||||||
|
if ($this->subscribers_feature->check()) {
|
||||||
|
return $this->errorResponse([
|
||||||
|
APIError::FORBIDDEN => WPFunctions::get()->__('Subscribers limit reached.', 'mailpoet'),
|
||||||
|
], [], Response::STATUS_FORBIDDEN);
|
||||||
|
}
|
||||||
$newsletter_id = (isset($data['newsletter_id'])
|
$newsletter_id = (isset($data['newsletter_id'])
|
||||||
? (int)$data['newsletter_id']
|
? (int)$data['newsletter_id']
|
||||||
: false
|
: false
|
||||||
|
@ -34,6 +34,7 @@ use MailPoet\Services\AuthorizedEmailsController;
|
|||||||
use MailPoet\Settings\SettingsController;
|
use MailPoet\Settings\SettingsController;
|
||||||
use MailPoet\Subscription\SubscriptionUrlFactory;
|
use MailPoet\Subscription\SubscriptionUrlFactory;
|
||||||
use MailPoet\Tasks\Sending as SendingTask;
|
use MailPoet\Tasks\Sending as SendingTask;
|
||||||
|
use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
|
||||||
use MailPoet\WooCommerce\Helper as WCHelper;
|
use MailPoet\WooCommerce\Helper as WCHelper;
|
||||||
use MailPoet\WP\Emoji;
|
use MailPoet\WP\Emoji;
|
||||||
use MailPoet\WP\Functions as WPFunctions;
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
@ -150,7 +151,8 @@ class NewslettersTest extends \MailPoetTest {
|
|||||||
ContainerWrapper::getInstance()->get(PostNotificationScheduler::class),
|
ContainerWrapper::getInstance()->get(PostNotificationScheduler::class),
|
||||||
ContainerWrapper::getInstance()->get(Mailer::class),
|
ContainerWrapper::getInstance()->get(Mailer::class),
|
||||||
ContainerWrapper::getInstance()->get(MetaInfo::class),
|
ContainerWrapper::getInstance()->get(MetaInfo::class),
|
||||||
ContainerWrapper::getInstance()->get(Emoji::class)
|
ContainerWrapper::getInstance()->get(Emoji::class),
|
||||||
|
Stub::make(SubscribersFeature::class)
|
||||||
);
|
);
|
||||||
$response = $this->endpoint->get(['id' => $this->newsletter->id]);
|
$response = $this->endpoint->get(['id' => $this->newsletter->id]);
|
||||||
expect($response->status)->equals(APIResponse::STATUS_OK);
|
expect($response->status)->equals(APIResponse::STATUS_OK);
|
||||||
@ -206,7 +208,8 @@ class NewslettersTest extends \MailPoetTest {
|
|||||||
ContainerWrapper::getInstance()->get(PostNotificationScheduler::class),
|
ContainerWrapper::getInstance()->get(PostNotificationScheduler::class),
|
||||||
ContainerWrapper::getInstance()->get(Mailer::class),
|
ContainerWrapper::getInstance()->get(Mailer::class),
|
||||||
ContainerWrapper::getInstance()->get(MetaInfo::class),
|
ContainerWrapper::getInstance()->get(MetaInfo::class),
|
||||||
$emoji
|
$emoji,
|
||||||
|
Stub::make(SubscribersFeature::class)
|
||||||
);
|
);
|
||||||
|
|
||||||
$response = $this->endpoint->save($valid_data);
|
$response = $this->endpoint->save($valid_data);
|
||||||
@ -420,6 +423,30 @@ class NewslettersTest extends \MailPoetTest {
|
|||||||
expect($updated_newsletter->segments[0]['name'])->equals('Segment 1');
|
expect($updated_newsletter->segments[0]['name'])->equals('Segment 1');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testItReturnsErrorIfSubscribersLimitReached() {
|
||||||
|
$endpoint = new Newsletters(
|
||||||
|
ContainerWrapper::getInstance()->get(BulkActionController::class),
|
||||||
|
ContainerWrapper::getInstance()->get(Handler::class),
|
||||||
|
ContainerWrapper::getInstance()->get(WPFunctions::class),
|
||||||
|
$this->makeEmpty(WCHelper::class),
|
||||||
|
SettingsController::getInstance(),
|
||||||
|
$this->cron_helper,
|
||||||
|
$this->make(AuthorizedEmailsController::class),
|
||||||
|
ContainerWrapper::getInstance()->get(NewslettersRepository::class),
|
||||||
|
ContainerWrapper::getInstance()->get(NewslettersResponseBuilder::class),
|
||||||
|
ContainerWrapper::getInstance()->get(PostNotificationScheduler::class),
|
||||||
|
ContainerWrapper::getInstance()->get(Mailer::class),
|
||||||
|
ContainerWrapper::getInstance()->get(MetaInfo::class),
|
||||||
|
ContainerWrapper::getInstance()->get(Emoji::class),
|
||||||
|
Stub::make(SubscribersFeature::class, ['check' => true])
|
||||||
|
);
|
||||||
|
$res = $endpoint->setStatus([
|
||||||
|
'id' => $this->newsletter->id,
|
||||||
|
'status' => Newsletter::STATUS_ACTIVE,
|
||||||
|
]);
|
||||||
|
expect($res->status)->equals(APIResponse::STATUS_FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
function testItCanSetANewsletterStatus() {
|
function testItCanSetANewsletterStatus() {
|
||||||
// set status to sending
|
// set status to sending
|
||||||
$response = $this->endpoint->setStatus
|
$response = $this->endpoint->setStatus
|
||||||
@ -581,7 +608,8 @@ class NewslettersTest extends \MailPoetTest {
|
|||||||
ContainerWrapper::getInstance()->get(PostNotificationScheduler::class),
|
ContainerWrapper::getInstance()->get(PostNotificationScheduler::class),
|
||||||
ContainerWrapper::getInstance()->get(Mailer::class),
|
ContainerWrapper::getInstance()->get(Mailer::class),
|
||||||
ContainerWrapper::getInstance()->get(MetaInfo::class),
|
ContainerWrapper::getInstance()->get(MetaInfo::class),
|
||||||
ContainerWrapper::getInstance()->get(Emoji::class)
|
ContainerWrapper::getInstance()->get(Emoji::class),
|
||||||
|
Stub::make(SubscribersFeature::class)
|
||||||
);
|
);
|
||||||
|
|
||||||
$response = $this->endpoint->duplicate(['id' => $this->newsletter->id]);
|
$response = $this->endpoint->duplicate(['id' => $this->newsletter->id]);
|
||||||
@ -930,7 +958,8 @@ class NewslettersTest extends \MailPoetTest {
|
|||||||
ContainerWrapper::getInstance()->get(PostNotificationScheduler::class),
|
ContainerWrapper::getInstance()->get(PostNotificationScheduler::class),
|
||||||
ContainerWrapper::getInstance()->get(Mailer::class),
|
ContainerWrapper::getInstance()->get(Mailer::class),
|
||||||
ContainerWrapper::getInstance()->get(MetaInfo::class),
|
ContainerWrapper::getInstance()->get(MetaInfo::class),
|
||||||
$emoji
|
$emoji,
|
||||||
|
Stub::make(SubscribersFeature::class)
|
||||||
);
|
);
|
||||||
|
|
||||||
$response = $this->endpoint->showPreview($data);
|
$response = $this->endpoint->showPreview($data);
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
namespace MailPoet\Test\API\JSON\v1;
|
namespace MailPoet\Test\API\JSON\v1;
|
||||||
|
|
||||||
use Codeception\Util\Fixtures;
|
use Codeception\Util\Fixtures;
|
||||||
|
use Codeception\Util\Stub;
|
||||||
|
use MailPoet\API\JSON\Response as APIResponse;
|
||||||
use MailPoet\API\JSON\v1\SendingQueue as SendingQueueAPI;
|
use MailPoet\API\JSON\v1\SendingQueue as SendingQueueAPI;
|
||||||
use MailPoet\Models\Newsletter;
|
use MailPoet\Models\Newsletter;
|
||||||
use MailPoet\Models\NewsletterOption;
|
use MailPoet\Models\NewsletterOption;
|
||||||
@ -12,6 +14,7 @@ use MailPoet\Models\SendingQueue as SendingQueueModel;
|
|||||||
use MailPoet\Settings\SettingsController;
|
use MailPoet\Settings\SettingsController;
|
||||||
use MailPoet\Settings\SettingsRepository;
|
use MailPoet\Settings\SettingsRepository;
|
||||||
use MailPoet\Tasks\Sending;
|
use MailPoet\Tasks\Sending;
|
||||||
|
use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
|
||||||
use MailPoetVendor\Idiorm\ORM;
|
use MailPoetVendor\Idiorm\ORM;
|
||||||
|
|
||||||
class SendingQueueTest extends \MailPoetTest {
|
class SendingQueueTest extends \MailPoetTest {
|
||||||
@ -45,7 +48,7 @@ class SendingQueueTest extends \MailPoetTest {
|
|||||||
$newletter_options
|
$newletter_options
|
||||||
);
|
);
|
||||||
|
|
||||||
$sending_queue = new SendingQueueAPI();
|
$sending_queue = new SendingQueueAPI(Stub::make(SubscribersFeature::class));
|
||||||
$result = $sending_queue->add(['newsletter_id' => $newsletter->id]);
|
$result = $sending_queue->add(['newsletter_id' => $newsletter->id]);
|
||||||
$scheduled_task = ScheduledTask::findOne($result->data['task_id']);
|
$scheduled_task = ScheduledTask::findOne($result->data['task_id']);
|
||||||
expect($scheduled_task->status)->equals(ScheduledTask::STATUS_SCHEDULED);
|
expect($scheduled_task->status)->equals(ScheduledTask::STATUS_SCHEDULED);
|
||||||
@ -53,6 +56,16 @@ class SendingQueueTest extends \MailPoetTest {
|
|||||||
expect($scheduled_task->type)->equals(Sending::TASK_TYPE);
|
expect($scheduled_task->type)->equals(Sending::TASK_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testItReturnsErrorIfSubscribersLimitReached() {
|
||||||
|
$sending_queue = new SendingQueueAPI(Stub::make(SubscribersFeature::class, [
|
||||||
|
'check' => true,
|
||||||
|
]));
|
||||||
|
$res = $sending_queue->add(['newsletter_id' => $this->newsletter->id]);
|
||||||
|
expect($res->status)->equals(APIResponse::STATUS_FORBIDDEN);
|
||||||
|
$res = $sending_queue->resume(['newsletter_id' => $this->newsletter->id]);
|
||||||
|
expect($res->status)->equals(APIResponse::STATUS_FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
function testItReschedulesScheduledSendingQueueTask() {
|
function testItReschedulesScheduledSendingQueueTask() {
|
||||||
$newsletter = $this->newsletter;
|
$newsletter = $this->newsletter;
|
||||||
$newsletter->status = Newsletter::STATUS_SCHEDULED;
|
$newsletter->status = Newsletter::STATUS_SCHEDULED;
|
||||||
@ -66,7 +79,7 @@ class SendingQueueTest extends \MailPoetTest {
|
|||||||
Newsletter::TYPE_STANDARD,
|
Newsletter::TYPE_STANDARD,
|
||||||
$newletter_options
|
$newletter_options
|
||||||
);
|
);
|
||||||
$sending_queue = new SendingQueueAPI();
|
$sending_queue = new SendingQueueAPI(Stub::make(SubscribersFeature::class));
|
||||||
|
|
||||||
// add scheduled task
|
// add scheduled task
|
||||||
$result = $sending_queue->add(['newsletter_id' => $newsletter->id]);
|
$result = $sending_queue->add(['newsletter_id' => $newsletter->id]);
|
||||||
|
Reference in New Issue
Block a user