Allow running tasks to be cancelled
[MAILPOET-5755]
This commit is contained in:
committed by
Ján Mikláš
parent
b8ca544596
commit
ef2101ef46
@@ -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')));
|
||||||
|
@@ -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()]);
|
||||||
|
Reference in New Issue
Block a user