diff --git a/application/Espo/Binding.php b/application/Espo/Binding.php index a02449bb8d..328f55f720 100644 --- a/application/Espo/Binding.php +++ b/application/Espo/Binding.php @@ -257,8 +257,8 @@ class Binding implements BindingProcessor ); $binder->bindImplementation( - 'Espo\\Core\\Job\\JobSchedulerCreator', - 'Espo\\Core\\Job\\JobScheduler\\Creators\\EntityJobSchedulerCreator', + 'Espo\\Core\\Job\\JobScheduler\\Creator', + 'Espo\\Core\\Job\\JobScheduler\\Creators\\EntityCreator', ); } diff --git a/application/Espo/Core/Job/JobScheduler.php b/application/Espo/Core/Job/JobScheduler.php index d7afe127ed..64b248f2d3 100644 --- a/application/Espo/Core/Job/JobScheduler.php +++ b/application/Espo/Core/Job/JobScheduler.php @@ -31,6 +31,7 @@ namespace Espo\Core\Job; use Espo\Core\Field\DateTime as DateTimeField; use Espo\Core\Job\Job\Data; +use Espo\Core\Job\JobScheduler\Creator; use ReflectionClass; use DateTimeInterface; @@ -53,7 +54,7 @@ class JobScheduler private ?DateInterval $delay = null; public function __construct( - private JobSchedulerCreator $creator, + private Creator $creator, ) {} /** @@ -179,7 +180,7 @@ class JobScheduler $data = $this->data ?? Data::create(); - $creatorData = new JobScheduler\Data( + $creatorData = new Creator\Data( className: $this->className, queue: $this->queue, group: $this->group, diff --git a/application/Espo/Core/Job/JobSchedulerCreator.php b/application/Espo/Core/Job/JobScheduler/Creator.php similarity index 90% rename from application/Espo/Core/Job/JobSchedulerCreator.php rename to application/Espo/Core/Job/JobScheduler/Creator.php index a42dae7f30..43137d4ae6 100644 --- a/application/Espo/Core/Job/JobSchedulerCreator.php +++ b/application/Espo/Core/Job/JobScheduler/Creator.php @@ -27,12 +27,14 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -namespace Espo\Core\Job; +namespace Espo\Core\Job\JobScheduler; + +use Espo\Core\Job\JobScheduler\Creator\Data; /** * @since 9.2.0 */ -interface JobSchedulerCreator +interface Creator { - public function create(JobScheduler\Data $data): void; + public function create(Data $data): void; } diff --git a/application/Espo/Core/Job/JobScheduler/Data.php b/application/Espo/Core/Job/JobScheduler/Creator/Data.php similarity index 97% rename from application/Espo/Core/Job/JobScheduler/Data.php rename to application/Espo/Core/Job/JobScheduler/Creator/Data.php index c7788b603c..8c6f11a91a 100644 --- a/application/Espo/Core/Job/JobScheduler/Data.php +++ b/application/Espo/Core/Job/JobScheduler/Creator/Data.php @@ -27,7 +27,7 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -namespace Espo\Core\Job\JobScheduler; +namespace Espo\Core\Job\JobScheduler\Creator; use Espo\Core\Field\DateTime; use Espo\Core\Job\Job; diff --git a/application/Espo/Core/Job/JobScheduler/Creators/EntityJobSchedulerCreator.php b/application/Espo/Core/Job/JobScheduler/Creators/EntityCreator.php similarity index 73% rename from application/Espo/Core/Job/JobScheduler/Creators/EntityJobSchedulerCreator.php rename to application/Espo/Core/Job/JobScheduler/Creators/EntityCreator.php index def2504727..8976b49091 100644 --- a/application/Espo/Core/Job/JobScheduler/Creators/EntityJobSchedulerCreator.php +++ b/application/Espo/Core/Job/JobScheduler/Creators/EntityCreator.php @@ -30,30 +30,32 @@ namespace Espo\Core\Job\JobScheduler\Creators; use Espo\Core\Field\DateTime; -use Espo\Core\Job\JobScheduler; -use Espo\Core\Job\JobSchedulerCreator; +use Espo\Core\Job\JobScheduler\Creator; use Espo\Entities\Job; use Espo\ORM\EntityManager; -class EntityJobSchedulerCreator implements JobSchedulerCreator +class EntityCreator implements Creator { public function __construct( private EntityManager $entityManager, ) {} - public function create(JobScheduler\Data $data): void + public function create(Creator\Data $data): void { $time = $data->time ?? DateTime::createNow(); - $this->entityManager->createEntity(Job::ENTITY_TYPE, [ - 'name' => $data->className, - 'className' => $data->className, - 'queue' => $data->queue, - 'group' => $data->group, - 'targetType' => $data->data->getTargetType(), - 'targetId' => $data->data->getTargetId(), - 'data' => $data->data->getRaw(), - 'executeTime' => $time->toString(), - ]); + $job = $this->entityManager->getRDBRepositoryByClass(Job::class)->getNew(); + + $job + ->setName($data->className) + ->setClassName($data->className) + ->setQueue($data->queue) + ->setGroup($data->group) + ->setData($data->data) + ->setTargetId($data->data->getTargetId()) + ->setTargetType($data->data->getTargetType()) + ->setExecuteTime($time); + + $this->entityManager->saveEntity($job); } } diff --git a/application/Espo/Entities/Job.php b/application/Espo/Entities/Job.php index a9adf1ac67..d9a0a71511 100644 --- a/application/Espo/Entities/Job.php +++ b/application/Espo/Entities/Job.php @@ -29,6 +29,7 @@ namespace Espo\Entities; +use Espo\Core\Field\DateTime; use Espo\Core\Job\Job as JobJob; use Espo\Core\Job\Job\Status; use Espo\Core\Job\JobDataLess; @@ -212,4 +213,48 @@ class Job extends Entity { return $this->set('executedAt', DateTimeUtil::getSystemNowString()); } + + public function setName(?string $name): self + { + return $this->set('name', $name); + } + + public function setClassName(?string $className): self + { + return $this->set('className', $className); + } + + public function setQueue(?string $queue): self + { + return $this->set('queue', $queue); + } + + public function setGroup(?string $group): self + { + return $this->set('group', $group); + } + + public function setTargetId(?string $targetId): self + { + return $this->set('targetId', $targetId); + } + + public function setTargetType(?string $targetType): self + { + return $this->set('targetType', $targetType); + } + + public function setData(?JobJob\Data $data): self + { + if (!$data) { + return $this->set('data', $data); + } + + return $this->set('data', $data->getRaw()); + } + + public function setExecuteTime(?DateTime $executeTime): self + { + return $this->setValueObject('executeTime', $executeTime); + } } diff --git a/tests/unit/Espo/Core/Job/JobSchedulerTest.php b/tests/unit/Espo/Core/Job/JobSchedulerTest.php index 52c3e024cc..27958241f2 100644 --- a/tests/unit/Espo/Core/Job/JobSchedulerTest.php +++ b/tests/unit/Espo/Core/Job/JobSchedulerTest.php @@ -31,7 +31,7 @@ namespace tests\unit\Espo\Core\Job; use Espo\Core\Field\DateTime as DateTimeField; use Espo\Core\Job\JobScheduler; -use Espo\Core\Job\JobSchedulerCreator; +use Espo\Core\Job\JobScheduler\Creator; use Espo\Core\Job\QueueName; use Espo\Core\Job\Job\Data; use PHPUnit\Framework\TestCase; @@ -42,11 +42,11 @@ use DateInterval; class JobSchedulerTest extends TestCase { - private ?JobSchedulerCreator $creator = null; + private ?JobScheduler\Creator $creator = null; protected function setUp(): void { - $this->creator = $this->createMock(JobSchedulerCreator::class); + $this->creator = $this->createMock(JobScheduler\Creator::class); } public function testSchedule1(): void @@ -57,7 +57,7 @@ class JobSchedulerTest extends TestCase $delay = DateInterval::createFromDateString('1 minute'); - $expectedData = new JobScheduler\Data( + $expectedData = new Creator\Data( className: TestJob::class, queue: QueueName::Q0, group: null, @@ -87,7 +87,7 @@ class JobSchedulerTest extends TestCase $time = new DateTimeImmutable(); - $expectedData = new JobScheduler\Data( + $expectedData = new Creator\Data( className: TestJob::class, queue: null, group: 'g-1',