Disable send buttons and endpoints

[MAILPOET-2394]
This commit is contained in:
Amine Ben hammou
2019-11-26 01:59:30 +01:00
committed by Jack Kitterhing
parent 856c870ae5
commit c9052d71d4
5 changed files with 83 additions and 7 deletions

View File

@ -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}
/> />
) )
} }

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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]);