Refactor CronWorkerScheduler to Doctrine

[MAILPOET-3726]
This commit is contained in:
Rostislav Wolny
2021-09-06 12:55:52 +02:00
committed by Veljko V
parent 493a6a6704
commit 1c4eb15f93
3 changed files with 40 additions and 17 deletions

View File

@@ -2,7 +2,9 @@
namespace MailPoet\Cron; namespace MailPoet\Cron;
use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTask;
use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Carbon\Carbon;
@@ -10,24 +12,29 @@ class CronWorkerScheduler {
/** @var WPFunctions */ /** @var WPFunctions */
private $wp; private $wp;
public function __construct(WPFunctions $wp) { /** @var ScheduledTasksRepository */
private $scheduledTaskRepository;
public function __construct(
WPFunctions $wp,
ScheduledTasksRepository $scheduledTaskRepository
) {
$this->wp = $wp; $this->wp = $wp;
$this->scheduledTaskRepository = $scheduledTaskRepository;
} }
public function schedule($taskType, $nextRunDate) { public function schedule($taskType, $nextRunDate, $priority = ScheduledTaskEntity::PRIORITY_LOW): ScheduledTaskEntity {
$alreadyScheduled = ScheduledTask::where('type', $taskType) $alreadyScheduled = $this->scheduledTaskRepository->findScheduledTask($taskType);
->whereNull('deleted_at')
->where('status', ScheduledTask::STATUS_SCHEDULED)
->findMany();
if ($alreadyScheduled) { if ($alreadyScheduled) {
return false; return $alreadyScheduled;
} }
$task = ScheduledTask::create(); $task = new ScheduledTaskEntity();
$task->type = $taskType; $task->setType($taskType);
$task->status = ScheduledTask::STATUS_SCHEDULED; $task->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED);
$task->priority = ScheduledTask::PRIORITY_LOW; $task->setPriority($priority);
$task->scheduledAt = $nextRunDate; $task->setScheduledAt($nextRunDate);
$task->save(); $this->scheduledTaskRepository->persist($task);
$this->scheduledTaskRepository->flush();
return $task; return $task;
} }

View File

@@ -50,6 +50,21 @@ class ScheduledTasksRepository extends Repository {
$queryBuilder = $this->doctrineRepository->createQueryBuilder('st') $queryBuilder = $this->doctrineRepository->createQueryBuilder('st')
->select('st') ->select('st')
->where('(st.status = :scheduledStatus) OR (st.status is NULL)') ->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); ->setParameter('scheduledStatus', ScheduledTaskEntity::STATUS_SCHEDULED);
if (!empty($type)) { if (!empty($type)) {
$queryBuilder $queryBuilder

View File

@@ -31,19 +31,20 @@ class CronWorkerSchedulerTest extends \MailPoetTest {
public function testItDoesNotScheduleTaskTwice() { public function testItDoesNotScheduleTaskTwice() {
$nextRunDate = Carbon::now()->addWeek(); $nextRunDate = Carbon::now()->addWeek();
$this->cronWorkerScheduler->schedule('test', $nextRunDate); $task = $this->cronWorkerScheduler->schedule('test', $nextRunDate);
expect(ScheduledTask::findMany())->count(1); expect(ScheduledTask::findMany())->count(1);
$result = $this->cronWorkerScheduler->schedule('test', $nextRunDate); $result = $this->cronWorkerScheduler->schedule('test', $nextRunDate);
expect($result)->false(); expect($result->getId())->equals($task->getId());
expect(ScheduledTask::findMany())->count(1); expect(ScheduledTask::findMany())->count(1);
} }
public function testItReschedulesTask() { public function testItReschedulesTask() {
$nextRunDate = Carbon::now()->subDay(); $nextRunDate = Carbon::now()->subDay();
$task = $this->cronWorkerScheduler->schedule('test', $nextRunDate); $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(); $tasks = ScheduledTask::findMany();
expect($tasks)->count(1); expect($tasks)->count(1);
expect($tasks[0]->type)->same('test'); expect($tasks[0]->type)->same('test');