Allow running tasks to be cancelled

[MAILPOET-5755]
This commit is contained in:
 Ján Mikláš
2024-06-18 22:26:46 +02:00
committed by Ján Mikláš
parent b8ca544596
commit ef2101ef46
2 changed files with 24 additions and 4 deletions

View File

@@ -21,6 +21,11 @@ use MailPoetVendor\Doctrine\ORM\Query\Expr\Join;
*/ */
class ScheduledTasksRepository extends Repository { class ScheduledTasksRepository extends Repository {
const TASK_BATCH_SIZE = 20; const TASK_BATCH_SIZE = 20;
const CANCELLABLE_STATUSES = [
ScheduledTaskEntity::STATUS_SCHEDULED,
ScheduledTaskEntity::VIRTUAL_STATUS_RUNNING,
null,
];
/** @var WPFunctions */ /** @var WPFunctions */
private $wp; private $wp;
@@ -345,8 +350,8 @@ class ScheduledTasksRepository extends Repository {
} }
public function cancelTask(ScheduledTaskEntity $task): void { public function cancelTask(ScheduledTaskEntity $task): void {
if ($task->getStatus() !== ScheduledTaskEntity::STATUS_SCHEDULED) { if (!in_array($task->getStatus(), self::CANCELLABLE_STATUSES)) {
throw new \Exception(__('Only scheduled tasks can be cancelled', 'mailpoet'), 400); throw new \Exception(__('Only scheduled and running tasks can be cancelled', 'mailpoet'), 400);
} }
$task->setStatus(ScheduledTaskEntity::STATUS_CANCELLED); $task->setStatus(ScheduledTaskEntity::STATUS_CANCELLED);
$task->setCancelledAt(Carbon::createFromTimestamp($this->wp->currentTime('timestamp'))); $task->setCancelledAt(Carbon::createFromTimestamp($this->wp->currentTime('timestamp')));

View File

@@ -51,7 +51,7 @@ class HelpTest extends \MailPoetTest {
$response = $this->endpoint->cancelTask(['id' => $task->getId()]); $response = $this->endpoint->cancelTask(['id' => $task->getId()]);
verify($response)->instanceOf('\MailPoet\API\JSON\ErrorResponse'); verify($response)->instanceOf('\MailPoet\API\JSON\ErrorResponse');
verify($response->status)->equals(400); verify($response->status)->equals(400);
verify($response->errors[0]['message'])->equals('Only scheduled tasks can be cancelled'); verify($response->errors[0]['message'])->equals('Only scheduled and running tasks can be cancelled');
} }
public function testItReturnsErrorWhenReschedulingCompletedTask() { public function testItReturnsErrorWhenReschedulingCompletedTask() {
@@ -62,7 +62,7 @@ class HelpTest extends \MailPoetTest {
verify($response->errors[0]['message'])->equals('Only cancelled tasks can be rescheduled'); verify($response->errors[0]['message'])->equals('Only cancelled tasks can be rescheduled');
} }
public function testItCanCancelTask() { public function testItCanCancelScheduledTask() {
$task = (new ScheduledTaskFactory())->create('sending', ScheduledTaskEntity::STATUS_SCHEDULED, new \DateTime()); $task = (new ScheduledTaskFactory())->create('sending', ScheduledTaskEntity::STATUS_SCHEDULED, new \DateTime());
$response = $this->endpoint->cancelTask(['id' => $task->getId()]); $response = $this->endpoint->cancelTask(['id' => $task->getId()]);
verify($response)->instanceOf(APIResponse::class); verify($response)->instanceOf(APIResponse::class);
@@ -77,6 +77,21 @@ class HelpTest extends \MailPoetTest {
} }
} }
public function testItCanCancelRunningTask() {
$task = (new ScheduledTaskFactory())->create('sending', null, new \DateTime());
$response = $this->endpoint->cancelTask(['id' => $task->getId()]);
verify($response)->instanceOf(APIResponse::class);
verify($response->status)->equals(200);
$task = $this->scheduledTasksRepository->findOneById($task->getId());
verify($task)->instanceOf(ScheduledTaskEntity::class);
if ($task) {
verify($task->getStatus())->equals(ScheduledTaskEntity::STATUS_CANCELLED);
verify($task->getCancelledAt())->notNull();
verify($task->getInProgress())->equals(0);
}
}
public function testItCanRescheduleTask() { public function testItCanRescheduleTask() {
$task = (new ScheduledTaskFactory())->create('sending', ScheduledTaskEntity::STATUS_CANCELLED, new \DateTime()); $task = (new ScheduledTaskFactory())->create('sending', ScheduledTaskEntity::STATUS_CANCELLED, new \DateTime());
$response = $this->endpoint->rescheduleTask(['id' => $task->getId()]); $response = $this->endpoint->rescheduleTask(['id' => $task->getId()]);