From 4facd7e9514b09d3b725947458013e25cc5444e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Gangloff?= Date: Tue, 21 Oct 2025 12:52:43 +0200 Subject: [PATCH] refactor: move DQL in repositories --- src/Controller/StatisticsController.php | 16 +------- src/Controller/WatchListController.php | 11 +---- .../SendDomainEventNotifHandler.php | 20 +--------- .../UpdateRdapServersHandler.php | 5 ++- src/Repository/DomainEntityRepository.php | 13 ++++++ src/Repository/DomainEventRepository.php | 40 +++++++++++++++++++ src/Repository/DomainRepository.php | 24 +++++++++++ src/Repository/DomainStatusRepository.php | 14 +++++++ src/Repository/TldRepository.php | 10 +++++ src/Repository/WatchListRepository.php | 9 +++++ src/Service/OfficialDataService.php | 22 ++-------- src/Service/RDAPService.php | 20 +--------- 12 files changed, 123 insertions(+), 81 deletions(-) diff --git a/src/Controller/StatisticsController.php b/src/Controller/StatisticsController.php index 408464e..a751500 100644 --- a/src/Controller/StatisticsController.php +++ b/src/Controller/StatisticsController.php @@ -34,22 +34,10 @@ class StatisticsController extends AbstractController ->setAlertSent($this->pool->getItem('stats.alert.sent')->get() ?? 0) ->setDomainTracked( - $this->getCachedItem('stats.domain.tracked', fn () => $this->watchListRepository->createQueryBuilder('w') - ->join('w.domains', 'd') - ->select('COUNT(DISTINCT d.ldhName)') - ->where('d.deleted = FALSE') - ->getQuery()->getSingleColumnResult()[0]) + $this->getCachedItem('stats.domain.tracked', fn () => $this->watchListRepository->getTrackedDomainCount()) ) ->setDomainCount( - $this->getCachedItem('stats.domain.count', fn () => $this->domainRepository->createQueryBuilder('d') - ->join('d.tld', 't') - ->select('t.tld tld') - ->addSelect('COUNT(d.ldhName) AS domain') - ->addGroupBy('t.tld') - ->where('d.deleted = FALSE') - ->orderBy('domain', 'DESC') - ->setMaxResults(5) - ->getQuery()->getArrayResult()) + $this->getCachedItem('stats.domain.count', fn () => $this->domainRepository->getActiveDomainCountByTld()) ) ->setDomainCountTotal( $this->getCachedItem('stats.domain.total', fn () => $this->domainRepository->count(['deleted' => false]) diff --git a/src/Controller/WatchListController.php b/src/Controller/WatchListController.php index f363f8a..95fa000 100644 --- a/src/Controller/WatchListController.php +++ b/src/Controller/WatchListController.php @@ -110,16 +110,7 @@ class WatchListController extends AbstractController /** @var Domain $domain */ foreach ($watchList->getDomains()->getIterator() as $domain) { /** @var DomainEvent|null $exp */ - $exp = $this->domainEventRepository->createQueryBuilder('de') - ->select() - ->where('de.domain = :domain') - ->andWhere('de.action = \'expiration\'') - ->andWhere('de.deleted = FALSE') - ->orderBy('de.date', 'DESC') - ->setMaxResults(1) - ->getQuery() - ->setParameter('domain', $domain) - ->getOneOrNullResult(); + $exp = $this->domainEventRepository->findLastExpirationDomainEvent($domain); if (!$domain->getDeleted() && null !== $exp && !in_array($domain, $domains)) { $domains[] = $domain; diff --git a/src/MessageHandler/SendDomainEventNotifHandler.php b/src/MessageHandler/SendDomainEventNotifHandler.php index 5b76719..565e30f 100644 --- a/src/MessageHandler/SendDomainEventNotifHandler.php +++ b/src/MessageHandler/SendDomainEventNotifHandler.php @@ -64,15 +64,7 @@ final readonly class SendDomainEventNotifHandler */ /** @var DomainEvent[] $newEvents */ - $newEvents = $this->domainEventRepository->createQueryBuilder('de') - ->select() - ->where('de.domain = :domain') - ->andWhere('de.date > :updatedAt') - ->andWhere('de.date < :now') - ->setParameter('domain', $domain) - ->setParameter('updatedAt', $message->updatedAt) - ->setParameter('now', new \DateTimeImmutable()) - ->getQuery()->getResult(); + $newEvents = $this->domainEventRepository->findNewDomainEvents($domain, $message->updatedAt); foreach ($newEvents as $event) { if (!in_array($event->getAction(), $watchList->getTrackedEvents())) { @@ -111,15 +103,7 @@ final readonly class SendDomainEventNotifHandler } /** @var DomainStatus $domainStatus */ - $domainStatus = $this->domainStatusRepository->createQueryBuilder('ds') - ->select() - ->where('ds.domain = :domain') - ->andWhere('ds.date = :date') - ->orderBy('ds.createdAt', 'DESC') - ->setParameter('domain', $domain) - ->setParameter('date', $message->updatedAt) - ->getQuery() - ->getOneOrNullResult(); + $domainStatus = $this->domainStatusRepository->findNewDomainStatus($domain, $message->updatedAt); if (null !== $domainStatus && count(array_intersect( $watchList->getTrackedEppStatus(), diff --git a/src/MessageHandler/UpdateRdapServersHandler.php b/src/MessageHandler/UpdateRdapServersHandler.php index cde453e..8670399 100644 --- a/src/MessageHandler/UpdateRdapServersHandler.php +++ b/src/MessageHandler/UpdateRdapServersHandler.php @@ -3,6 +3,7 @@ namespace App\MessageHandler; use App\Message\UpdateRdapServers; +use App\Repository\DomainRepository; use App\Service\OfficialDataService; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\Messenger\Attribute\AsMessageHandler; @@ -17,7 +18,7 @@ final readonly class UpdateRdapServersHandler { public function __construct( private OfficialDataService $officialDataService, - private ParameterBagInterface $bag, + private ParameterBagInterface $bag, private DomainRepository $domainRepository, ) { } @@ -41,7 +42,7 @@ final readonly class UpdateRdapServersHandler try { $this->officialDataService->updateTldListIANA(); $this->officialDataService->updateGTldListICANN(); - $this->officialDataService->updateDomainsWhenTldIsDeleted(); + $this->domainRepository->setDomainDeletedIfTldIsDeleted(); } catch (\Throwable $throwable) { $throws[] = $throwable; } diff --git a/src/Repository/DomainEntityRepository.php b/src/Repository/DomainEntityRepository.php index 6af2ada..5bf5206 100644 --- a/src/Repository/DomainEntityRepository.php +++ b/src/Repository/DomainEntityRepository.php @@ -2,6 +2,7 @@ namespace App\Repository; +use App\Entity\Domain; use App\Entity\DomainEntity; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; @@ -16,6 +17,18 @@ class DomainEntityRepository extends ServiceEntityRepository parent::__construct($registry, DomainEntity::class); } + public function setDomainEntityAsDeleted(Domain $domain) + { + return $this->createQueryBuilder('de') + ->update() + ->set('de.deletedAt', ':now') + ->where('de.domain = :domain') + ->andWhere('de.deletedAt IS NOT NULL') + ->setParameter('now', new \DateTimeImmutable()) + ->setParameter('domain', $domain) + ->getQuery()->execute(); + } + // /** // * @return DomainEntity[] Returns an array of DomainEntity objects // */ diff --git a/src/Repository/DomainEventRepository.php b/src/Repository/DomainEventRepository.php index e6ac087..601f93e 100644 --- a/src/Repository/DomainEventRepository.php +++ b/src/Repository/DomainEventRepository.php @@ -2,6 +2,7 @@ namespace App\Repository; +use App\Entity\Domain; use App\Entity\DomainEvent; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; @@ -16,6 +17,45 @@ class DomainEventRepository extends ServiceEntityRepository parent::__construct($registry, DomainEvent::class); } + public function findLastExpirationDomainEvent(Domain $domain) + { + return $this->createQueryBuilder('de') + ->select() + ->where('de.domain = :domain') + ->andWhere('de.action = \'expiration\'') + ->andWhere('de.deleted = FALSE') + ->orderBy('de.date', 'DESC') + ->setMaxResults(1) + ->getQuery() + ->setParameter('domain', $domain) + ->getOneOrNullResult(); + } + + public function findNewDomainEvents(Domain $domain, \DateTimeImmutable $updatedAt) + { + return $this->createQueryBuilder('de') + ->select() + ->where('de.domain = :domain') + ->andWhere('de.date > :updatedAt') + ->andWhere('de.date < :now') + ->setParameter('domain', $domain) + ->setParameter('updatedAt', $updatedAt) + ->setParameter('now', new \DateTimeImmutable()) + ->getQuery()->getResult(); + } + + public function setDomainEventAsDeleted(Domain $domain) + { + return $this->createQueryBuilder('de') + ->update() + ->set('de.deleted', ':deleted') + ->where('de.domain = :domain') + ->setParameter('deleted', true) + ->setParameter('domain', $domain) + ->getQuery() + ->execute(); + } + // /** // * @return DomainEvent[] Returns an array of DomainEvent objects // */ diff --git a/src/Repository/DomainRepository.php b/src/Repository/DomainRepository.php index 992fd2a..32c3f8a 100644 --- a/src/Repository/DomainRepository.php +++ b/src/Repository/DomainRepository.php @@ -3,6 +3,7 @@ namespace App\Repository; use App\Entity\Domain; +use App\Entity\Tld; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; @@ -27,6 +28,29 @@ class DomainRepository extends ServiceEntityRepository ->getResult(); } + public function getActiveDomainCountByTld(): array + { + return $this->createQueryBuilder('d') + ->select('t.tld tld') + ->join('d.tld', 't') + ->addSelect('COUNT(d.ldhName) AS domain') + ->addGroupBy('t.tld') + ->where('d.deleted = FALSE') + ->orderBy('domain', 'DESC') + ->setMaxResults(5) + ->getQuery()->getArrayResult(); + } + + public function setDomainDeletedIfTldIsDeleted() + { + return $this->createQueryBuilder('d') + ->update() + ->set('d.deleted', ':deleted') + ->where('d.tld IN (SELECT t FROM '.Tld::class.' t WHERE t.deletedAt IS NOT NULL)') + ->setParameter('deleted', true) + ->getQuery()->execute(); + } + // /** // * @return Domain[] Returns an array of Domain objects // */ diff --git a/src/Repository/DomainStatusRepository.php b/src/Repository/DomainStatusRepository.php index ec3c6ad..a43a95b 100644 --- a/src/Repository/DomainStatusRepository.php +++ b/src/Repository/DomainStatusRepository.php @@ -2,6 +2,7 @@ namespace App\Repository; +use App\Entity\Domain; use App\Entity\DomainStatus; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; @@ -16,6 +17,19 @@ class DomainStatusRepository extends ServiceEntityRepository parent::__construct($registry, DomainStatus::class); } + public function findNewDomainStatus(Domain $domain, \DateTimeImmutable $updatedAt) + { + return $this->createQueryBuilder('ds') + ->select() + ->where('ds.domain = :domain') + ->andWhere('ds.date = :date') + ->orderBy('ds.createdAt', 'DESC') + ->setParameter('domain', $domain) + ->setParameter('date', $updatedAt) + ->getQuery() + ->getOneOrNullResult(); + } + // /** // * @return DomainStatus[] Returns an array of DomainStatus objects // */ diff --git a/src/Repository/TldRepository.php b/src/Repository/TldRepository.php index d723aae..719c876 100644 --- a/src/Repository/TldRepository.php +++ b/src/Repository/TldRepository.php @@ -28,6 +28,16 @@ class TldRepository extends ServiceEntityRepository ->getResult(); } + public function setAllTldAsDeleted() + { + return $this->createQueryBuilder('t') + ->update() + ->set('t.deletedAt', 'COALESCE(t.removalDate, CURRENT_TIMESTAMP())') + ->where('t.tld != :dot') + ->setParameter('dot', '.') + ->getQuery()->execute(); + } + // /** // * @return Tld[] Returns an array of Tld objects // */ diff --git a/src/Repository/WatchListRepository.php b/src/Repository/WatchListRepository.php index e65fb23..27f10c9 100644 --- a/src/Repository/WatchListRepository.php +++ b/src/Repository/WatchListRepository.php @@ -16,6 +16,15 @@ class WatchListRepository extends ServiceEntityRepository parent::__construct($registry, WatchList::class); } + public function getTrackedDomainCount() + { + return $this->createQueryBuilder('w') + ->select('COUNT(DISTINCT d.ldhName)') + ->join('w.domains', 'd') + ->where('d.deleted = FALSE') + ->getQuery()->getSingleScalarResult(); + } + // /** // * @return WatchList[] Returns an array of WatchList objects // */ diff --git a/src/Service/OfficialDataService.php b/src/Service/OfficialDataService.php index b8d1c6e..4faeb26 100644 --- a/src/Service/OfficialDataService.php +++ b/src/Service/OfficialDataService.php @@ -7,7 +7,6 @@ use App\Config\TldType; use App\Entity\IcannAccreditation; use App\Entity\RdapServer; use App\Entity\Tld; -use App\Repository\DomainRepository; use App\Repository\IcannAccreditationRepository; use App\Repository\RdapServerRepository; use App\Repository\TldRepository; @@ -63,8 +62,8 @@ class OfficialDataService public const DOMAIN_DOT = '.'; - public function __construct(private HttpClientInterface $client, - private readonly DomainRepository $domainRepository, + public function __construct( + private readonly HttpClientInterface $client, private readonly RdapServerRepository $rdapServerRepository, private readonly TldRepository $tldRepository, private readonly IcannAccreditationRepository $icannAccreditationRepository, @@ -165,12 +164,7 @@ class OfficialDataService continue; } - $this->tldRepository->createQueryBuilder('t') - ->update() - ->set('t.deletedAt', 'COALESCE(t.removalDate, CURRENT_TIMESTAMP())') - ->where('t.tld != :dot') - ->setParameter('dot', self::DOMAIN_DOT) - ->getQuery()->execute(); + $this->tldRepository->setAllTldAsDeleted(); $tldEntity = $this->tldRepository->findOneBy(['tld' => $tld]); @@ -305,14 +299,4 @@ class OfficialDataService $this->em->flush(); } - - public function updateDomainsWhenTldIsDeleted(): void - { - $this->domainRepository->createQueryBuilder('d') - ->update() - ->set('d.deleted', ':deleted') - ->where('d.tld IN (SELECT t FROM '.Tld::class.' t WHERE t.deletedAt IS NOT NULL)') - ->setParameter('deleted', true) - ->getQuery()->execute(); - } } diff --git a/src/Service/RDAPService.php b/src/Service/RDAPService.php index 2571ca8..6068c12 100644 --- a/src/Service/RDAPService.php +++ b/src/Service/RDAPService.php @@ -355,14 +355,7 @@ class RDAPService */ private function updateDomainEvents(Domain $domain, array $rdapData): void { - $this->domainEventRepository->createQueryBuilder('de') - ->update() - ->set('de.deleted', ':deleted') - ->where('de.domain = :domain') - ->setParameter('deleted', true) - ->setParameter('domain', $domain) - ->getQuery() - ->execute(); + $this->domainEventRepository->setDomainEventAsDeleted($domain); if (isset($rdapData['events']) && is_array($rdapData['events'])) { foreach ($rdapData['events'] as $rdapEvent) { @@ -399,16 +392,7 @@ class RDAPService */ private function updateDomainEntities(Domain $domain, array $rdapData): void { - $now = new \DateTimeImmutable(); - - $this->domainEntityRepository->createQueryBuilder('de') - ->update() - ->set('de.deletedAt', ':now') - ->where('de.domain = :domain') - ->andWhere('de.deletedAt IS NOT NULL') - ->setParameter('now', $now) - ->setParameter('domain', $domain) - ->getQuery()->execute(); + $this->domainEntityRepository->setDomainEntityAsDeleted($domain); if (!isset($rdapData['entities']) || !is_array($rdapData['entities'])) { return;