Prevent resending emails in case the email is not active

Automation email needs to be active in order to be sent.
If we allow resending to inactive emails, we would need to activate them first,
but this could be an unexpected side effect. And activating may cause sending other paused tasks as a side effect.
I expect the email to be active in the majority of cases, so users should not meet this notice very often.
[MAILPOET-6241]
This commit is contained in:
Rostislav Wolny
2024-11-28 12:41:43 +01:00
committed by Aschepikov
parent 79de8cc17c
commit 55f2d83abb
2 changed files with 38 additions and 4 deletions

View File

@ -4,6 +4,7 @@ namespace MailPoet\API\JSON\v1;
use MailPoet\API\JSON\Endpoint as APIEndpoint;
use MailPoet\API\JSON\Error as APIError;
use MailPoet\API\JSON\Response;
use MailPoet\API\JSON\ResponseBuilders\ScheduledTaskSubscriberResponseBuilder;
use MailPoet\Config\AccessControl;
use MailPoet\Cron\CronHelper;
@ -125,12 +126,17 @@ class SendingTaskSubscribers extends APIEndpoint {
]);
}
if ($newsletter->canBeSetActive() && $newsletter->getStatus() !== NewsletterEntity::STATUS_ACTIVE) {
return $this->errorResponse([
APIError::BAD_REQUEST => __('Failed to resend! The email is not active. Please activate it first.', 'mailpoet'),
], [], Response::STATUS_BAD_REQUEST);
}
$taskSubscriber->resetToUnprocessed();
$taskSubscriber->getTask()->setStatus(null);
$newsletter->setStatus(
$newsletter->canBeSetActive() ? NewsletterEntity::STATUS_ACTIVE : NewsletterEntity::STATUS_SENDING
);
if (!$newsletter->canBeSetActive()) {
$newsletter->setStatus(NewsletterEntity::STATUS_SENDING);
}
// Each repository flushes all changes
$this->scheduledTaskSubscribersRepository->flush();
return $this->successResponse([]);

View File

@ -244,4 +244,32 @@ class SendingTaskSubscribersTest extends \MailPoetTest {
verify($failedSubscriberTask->getProcessed())->equals(0);
verify($failedSubscriberTask->getFailed())->equals(0);
}
public function testItPreventResendingInactiveAutomationEmail() {
$newsletter = (new NewsletterFactory())->withSubject('My Automatic Newsletter')
->withType(NewsletterEntity::TYPE_AUTOMATION)
->withStatus(NewsletterEntity::STATUS_DRAFT)
->withBody(Fixtures::get('newsletter_body_template'))
->withSendingQueue()
->create();
$queue = $newsletter->getLatestQueue();
$task = $queue->getTask();
$failedSubscriber = $this->subscriberFactory
->withEmail('failed2@example.com')
->withFirstName('Failed')
->withLastName('Test')
->create();
$this->taskSubscriberFactory->createFailed($task, $failedSubscriber, 'Something went wrong!');
$res = $this->endpoint->resend([
'taskId' => $task->getId(),
'subscriberId' => $failedSubscriber->getId(),
]);
verify($res->status)->equals(APIResponse::STATUS_BAD_REQUEST);
verify($res->errors[0]['message'])
->equals('Failed to resend! The email is not active. Please activate it first.');
}
}