diff --git a/src/Entity/Domain.php b/src/Entity/Domain.php index b293288..f4d837f 100644 --- a/src/Entity/Domain.php +++ b/src/Entity/Domain.php @@ -8,6 +8,7 @@ use App\Config\EventAction; use App\Controller\DomainRefreshController; use App\Repository\DomainRepository; use App\Service\RDAPService; +use App\State\AutoRegisterDomainProvider; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\DBAL\Types\Types; @@ -42,7 +43,8 @@ use Symfony\Component\Serializer\Attribute\SerializedName; ], read: false ), - ] + ], + provider: AutoRegisterDomainProvider::class )] class Domain { diff --git a/src/State/AutoRegisterDomainProvider.php b/src/State/AutoRegisterDomainProvider.php new file mode 100644 index 0000000..10a02a1 --- /dev/null +++ b/src/State/AutoRegisterDomainProvider.php @@ -0,0 +1,65 @@ +itemProvider->provide($operation, $uriVariables, $context); + + if (!is_null($domain)) { + return $domain; + } + + if (false === $this->kernel->isDebug() && true === $this->parameterBag->get('limited_features')) { + $limiter = $this->rdapRequestsLimiter->create($this->security->getUser()->getUserIdentifier()); + $limit = $limiter->consume(); + + if (!$limit->isAccepted()) { + throw new TooManyRequestsHttpException($limit->getRetryAfter()->getTimestamp() - time()); + } + } + + $ldhName = RDAPService::convertToIdn($uriVariables['ldhName']); + + try { + $domain = $this->RDAPService->registerDomain($ldhName); + } catch (NotFoundHttpException) { + $domain = (new Domain()) + ->setLdhName($ldhName) + ->setTld($this->RDAPService->getTld($ldhName)) + ->setDelegationSigned(false) + ->setDeleted(true); + + $this->entityManager->persist($domain); + $this->entityManager->flush(); + } + + return $domain; + } +} diff --git a/src/State/WatchListUpdateProcessor.php b/src/State/WatchListUpdateProcessor.php index f0f7da2..78c9f2c 100644 --- a/src/State/WatchListUpdateProcessor.php +++ b/src/State/WatchListUpdateProcessor.php @@ -8,11 +8,8 @@ use App\Entity\Domain; use App\Entity\User; use App\Entity\WatchList; use App\Notifier\TestChatNotification; -use App\Repository\DomainRepository; use App\Service\ChatNotificationService; use App\Service\Connector\AbstractProvider; -use App\Service\RDAPService; -use Doctrine\ORM\EntityManagerInterface; use Psr\Log\LoggerInterface; use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\DependencyInjection\Attribute\Autowire; @@ -20,8 +17,6 @@ use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; -use Symfony\Component\HttpKernel\KernelInterface; -use Symfony\Component\RateLimiter\RateLimiterFactory; class WatchListUpdateProcessor implements ProcessorInterface {