entityManager->getRepository(ScrapingJobEntity::class)->find($job->getId()); if ($existingEntity) { $existingEntity->setStatus($job->status->value); $existingEntity->setPages($job->pages); $existingEntity->setCompletedAt($job->completedAt); $existingEntity->setCbzPath($job->cbzPath?->getPath()); $existingEntity->setFailureReason($job->failureReason); } else { $entity = ScrapingJobEntity::fromDomain($job); $this->entityManager->persist($entity); } $this->entityManager->flush(); } public function findById(string $id): ?ScrapingJob { $entity = $this->entityManager->getRepository(ScrapingJobEntity::class) ->find($id); return $entity?->toDomain(); } public function findByChapterId(string $chapterId): ?ScrapingJob { $entity = $this->entityManager->getRepository(ScrapingJobEntity::class) ->findOneBy(['chapterId' => $chapterId]); return $entity?->toDomain(); } public function findPendingJobs(): array { $entities = $this->entityManager->getRepository(ScrapingJobEntity::class) ->createQueryBuilder('sj') ->where('sj.status = :status') ->setParameter('status', ScrapingStatus::PENDING->value) ->getQuery() ->getResult(); return array_map(fn (ScrapingJobEntity $entity) => $entity->toDomain(), $entities); } public function findInProgressJobs(): array { $entities = $this->entityManager->getRepository(ScrapingJobEntity::class) ->createQueryBuilder('sj') ->where('sj.status = :status') ->setParameter('status', ScrapingStatus::IN_PROGRESS->value) ->getQuery() ->getResult(); return array_map(fn (ScrapingJobEntity $entity) => $entity->toDomain(), $entities); } }