container->get(NewslettersRepository::class); $newsletters = $newsletterRepository->findBy([ 'type' => NewsletterEntity::ACTIVABLE_EMAILS, 'status' => NewsletterEntity::STATUS_SENDING, ]); foreach ($newsletters as $newsletter) { $newsletter->setStatus(NewsletterEntity::STATUS_ACTIVE); // As a consequence of the bug, some tasks might be paused, we need to unpause them $this->updateTasks($newsletter); } } private function updateTasks(NewsletterEntity $newsletter): void { $oldTaskThreshold = (new Carbon())->subDays(30); $queues = $newsletter->getUnfinishedQueues(); foreach ($queues as $queue) { $task = $queue->getTask(); // Switch relatively new paused tasks to scheduled if ($task && ($task->getScheduledAt() > $oldTaskThreshold) && $task->getStatus() === ScheduledTaskEntity::STATUS_PAUSED) { $task->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED); $this->entityManager->flush(); continue; } // Switch old paused tasks to completed and mark scheduled task subscribers as failed // This will prevent sending outdated automatic emails. When marked as failed, the user still can resend them in Sending Status screen. if ($task && ($task->getScheduledAt() <= $oldTaskThreshold) && $task->getStatus() === ScheduledTaskEntity::STATUS_PAUSED) { $task->setStatus(ScheduledTaskEntity::STATUS_COMPLETED); $task->setProcessedAt(new Carbon()); $this->entityManager->flush(); $scheduledTaskSubscribersTable = $this->entityManager->getClassMetadata(ScheduledTaskSubscriberEntity::class)->getTableName(); $this->entityManager->getConnection()->executeQuery( "UPDATE $scheduledTaskSubscribersTable SET `processed` = :processed, `failed` = :failed, `error` = :error WHERE task_id = :task_id", [ 'processed' => ScheduledTaskSubscriberEntity::STATUS_PROCESSED, 'failed' => ScheduledTaskSubscriberEntity::FAIL_STATUS_FAILED, 'error' => 'Sending timed out for being paused too long.', 'task_id' => $task->getId(), ] ); $this->entityManager->refresh($task); } } $this->entityManager->flush(); } }