diff --git a/lib/Cron/CronWorkerScheduler.php b/lib/Cron/CronWorkerScheduler.php index 7343a67dcb..8cc6afe700 100644 --- a/lib/Cron/CronWorkerScheduler.php +++ b/lib/Cron/CronWorkerScheduler.php @@ -2,7 +2,9 @@ namespace MailPoet\Cron; +use MailPoet\Entities\ScheduledTaskEntity; use MailPoet\Models\ScheduledTask; +use MailPoet\Newsletter\Sending\ScheduledTasksRepository; use MailPoet\WP\Functions as WPFunctions; use MailPoetVendor\Carbon\Carbon; @@ -10,24 +12,29 @@ class CronWorkerScheduler { /** @var WPFunctions */ private $wp; - public function __construct(WPFunctions $wp) { + /** @var ScheduledTasksRepository */ + private $scheduledTaskRepository; + + public function __construct( + WPFunctions $wp, + ScheduledTasksRepository $scheduledTaskRepository + ) { $this->wp = $wp; + $this->scheduledTaskRepository = $scheduledTaskRepository; } - public function schedule($taskType, $nextRunDate) { - $alreadyScheduled = ScheduledTask::where('type', $taskType) - ->whereNull('deleted_at') - ->where('status', ScheduledTask::STATUS_SCHEDULED) - ->findMany(); + public function schedule($taskType, $nextRunDate, $priority = ScheduledTaskEntity::PRIORITY_LOW): ScheduledTaskEntity { + $alreadyScheduled = $this->scheduledTaskRepository->findScheduledTask($taskType); if ($alreadyScheduled) { - return false; + return $alreadyScheduled; } - $task = ScheduledTask::create(); - $task->type = $taskType; - $task->status = ScheduledTask::STATUS_SCHEDULED; - $task->priority = ScheduledTask::PRIORITY_LOW; - $task->scheduledAt = $nextRunDate; - $task->save(); + $task = new ScheduledTaskEntity(); + $task->setType($taskType); + $task->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED); + $task->setPriority($priority); + $task->setScheduledAt($nextRunDate); + $this->scheduledTaskRepository->persist($task); + $this->scheduledTaskRepository->flush(); return $task; } diff --git a/lib/Newsletter/Sending/ScheduledTasksRepository.php b/lib/Newsletter/Sending/ScheduledTasksRepository.php index 8cada38f09..7f3d6b7012 100644 --- a/lib/Newsletter/Sending/ScheduledTasksRepository.php +++ b/lib/Newsletter/Sending/ScheduledTasksRepository.php @@ -50,6 +50,21 @@ class ScheduledTasksRepository extends Repository { $queryBuilder = $this->doctrineRepository->createQueryBuilder('st') ->select('st') ->where('(st.status = :scheduledStatus) OR (st.status is NULL)') + ->andWhere('st.deletedAt IS NULL') + ->setParameter('scheduledStatus', ScheduledTaskEntity::STATUS_SCHEDULED); + if (!empty($type)) { + $queryBuilder + ->andWhere('st.type = :type') + ->setParameter('type', $type); + } + return $queryBuilder->getQuery()->getOneOrNullResult(); + } + + public function findScheduledTask(?string $type): ?ScheduledTaskEntity { + $queryBuilder = $this->doctrineRepository->createQueryBuilder('st') + ->select('st') + ->where('st.status = :scheduledStatus') + ->andWhere('st.deletedAt IS NULL') ->setParameter('scheduledStatus', ScheduledTaskEntity::STATUS_SCHEDULED); if (!empty($type)) { $queryBuilder diff --git a/tests/integration/Cron/CronWorkerSchedulerTest.php b/tests/integration/Cron/CronWorkerSchedulerTest.php index c1d3d071d3..f997c1a540 100644 --- a/tests/integration/Cron/CronWorkerSchedulerTest.php +++ b/tests/integration/Cron/CronWorkerSchedulerTest.php @@ -31,19 +31,20 @@ class CronWorkerSchedulerTest extends \MailPoetTest { public function testItDoesNotScheduleTaskTwice() { $nextRunDate = Carbon::now()->addWeek(); - $this->cronWorkerScheduler->schedule('test', $nextRunDate); + $task = $this->cronWorkerScheduler->schedule('test', $nextRunDate); expect(ScheduledTask::findMany())->count(1); $result = $this->cronWorkerScheduler->schedule('test', $nextRunDate); - expect($result)->false(); + expect($result->getId())->equals($task->getId()); expect(ScheduledTask::findMany())->count(1); } public function testItReschedulesTask() { $nextRunDate = Carbon::now()->subDay(); $task = $this->cronWorkerScheduler->schedule('test', $nextRunDate); - $this->cronWorkerScheduler->reschedule($task, 10); - + $oldModel = ScheduledTask::findOne($task->getId()); + $this->assertInstanceOf(ScheduledTask::class, $oldModel); + $this->cronWorkerScheduler->reschedule($oldModel, 10); $tasks = ScheduledTask::findMany(); expect($tasks)->count(1); expect($tasks[0]->type)->same('test');