Refactor CronWorkerScheduler to Doctrine
[MAILPOET-3726]
This commit is contained in:
committed by
Veljko V
parent
493a6a6704
commit
1c4eb15f93
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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');
|
||||||
|
Reference in New Issue
Block a user