From 3f7b809bd4f960cdc5a731c978d1e21ae923738c Mon Sep 17 00:00:00 2001 From: wxa Date: Wed, 3 Mar 2021 11:54:11 +0300 Subject: [PATCH] Delete tasks without queues when fetching sending tasks [MAILPOET-3379] --- lib/Tasks/Sending.php | 12 ++++++++++++ tests/integration/Tasks/SendingTest.php | 7 +++++++ 2 files changed, 19 insertions(+) diff --git a/lib/Tasks/Sending.php b/lib/Tasks/Sending.php index fe081fb5b9..344e8efb31 100644 --- a/lib/Tasks/Sending.php +++ b/lib/Tasks/Sending.php @@ -2,6 +2,7 @@ namespace MailPoet\Tasks; +use MailPoet\Logging\LoggerFactory; use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTaskSubscriber; use MailPoet\Models\SendingQueue; @@ -97,11 +98,22 @@ class Sending { foreach ($tasks as $task) { if (!empty($queuesIndex[$task->id])) { $result[] = self::create($task, $queuesIndex[$task->id]); + } else { + static::handleInvalidTask($task); } } return $result; } + public static function handleInvalidTask(ScheduledTask $task) { + $loggerFactory = LoggerFactory::getInstance(); + $loggerFactory->getLogger(LoggerFactory::TOPIC_NEWSLETTERS)->addError( + 'invalid sending task found, deleting', + ['task_id' => $task->id] + ); + $task->delete(); + } + public static function createFromScheduledTask(ScheduledTask $task) { $queue = SendingQueue::where('task_id', $task->id)->findOne(); if (!$queue) { diff --git a/tests/integration/Tasks/SendingTest.php b/tests/integration/Tasks/SendingTest.php index 6997e306ca..d614f04111 100644 --- a/tests/integration/Tasks/SendingTest.php +++ b/tests/integration/Tasks/SendingTest.php @@ -58,6 +58,13 @@ class SendingTest extends \MailPoetTest { expect($queue->taskId)->equals($this->task->id); } + public function testItDeletesInvalidTasksWhenCreatingManyFromTasks() { + $this->queue->delete(); + $sendings = SendingTask::createManyFromTasks([$this->task]); + expect($sendings)->isEmpty(); + expect(ScheduledTask::findOne($this->task->id))->equals(false); + } + public function testItCanBeCreatedFromScheduledTask() { $sending = SendingTask::createFromScheduledTask($this->task); $queue = $sending->queue();