serviceFactory = $serviceFactory; $this->entityManager = $entityManager; } public function run(JobData $data): void { $targetId = $data->getTargetId(); if (!$targetId) { throw new Error("No target."); } $service = $this->serviceFactory->create('EmailAccount'); $entity = $this->entityManager->getEntity('EmailAccount', $targetId); if (!$entity) { throw new Error("Job CheckEmailAccounts '{$targetId}': EmailAccount does not exist.", -1); } if ($entity->get('status') !== 'Active') { throw new Error("Job CheckEmailAccounts '{$targetId}': EmailAccount is not active.", -1); } try { $service->fetchFromMailServer($entity); } catch (Throwable $e) { throw new Error( 'Job CheckEmailAccounts ' . $entity->getId() . ': [' . $e->getCode() . '] ' .$e->getMessage() ); } } public function prepare(ScheduledJobData $data, DateTimeImmutable $executeTime): void { $collection = $this->entityManager ->getRDBRepository('EmailAccount') ->join('assignedUser', 'assignedUserAdditional') ->where([ 'status' => 'Active', 'useImap' => true, 'assignedUserAdditional.isActive' => true, ]) ->find(); foreach ($collection as $entity) { $running = $this->entityManager ->getRDBRepository('Job') ->where([ 'scheduledJobId' => $data->getId(), 'status' => [ JobStatus::RUNNING, JobStatus::READY, ], 'targetType' => 'EmailAccount', 'targetId' => $entity->getId(), ]) ->findOne(); if ($running) { continue; } $countPending = $this->entityManager ->getRDBRepository('Job') ->where([ 'scheduledJobId' => $data->getId(), 'status' => JobStatus::PENDING, 'targetType' => 'EmailAccount', 'targetId' => $entity->getId(), ]) ->count(); if ($countPending > 1) { continue; } $jobEntity = $this->entityManager->getEntity('Job'); $jobEntity->set([ 'name' => $data->getName(), 'scheduledJobId' => $data->getId(), 'executeTime' => $executeTime->format(DateTime::SYSTEM_DATE_TIME_FORMAT), 'targetType' => 'EmailAccount', 'targetId' => $entity->getId(), ]); $this->entityManager->saveEntity($jobEntity); } } }