feat: reduce IO when registering domains

This commit is contained in:
Maël Gangloff
2024-07-15 00:21:40 +02:00
parent 8a8059a366
commit aa54d4c9ce
2 changed files with 66 additions and 8 deletions

View File

@@ -3,8 +3,21 @@
namespace App\Controller;
use App\Entity\Domain;
use App\Entity\DomainEntity;
use App\Entity\DomainEvent;
use App\Repository\DomainRepository;
use App\Service\RDAPService;
use Eluceo\iCal\Domain\Entity\Attendee;
use Eluceo\iCal\Domain\Entity\Calendar;
use Eluceo\iCal\Domain\Entity\Event;
use Eluceo\iCal\Domain\ValueObject\Category;
use Eluceo\iCal\Domain\ValueObject\Date;
use Eluceo\iCal\Domain\ValueObject\EmailAddress;
use Eluceo\iCal\Domain\ValueObject\SingleDay;
use Eluceo\iCal\Presentation\Factory\CalendarFactory;
use Exception;
use Sabre\VObject\Reader;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
@@ -14,7 +27,8 @@ class TestController extends AbstractController
{
public function __construct(
private readonly RDAPService $RDAPService
private readonly RDAPService $RDAPService,
private readonly DomainRepository $domainRepository
)
{
@@ -24,11 +38,46 @@ class TestController extends AbstractController
public function testRegisterDomain(string $fqdn): Response
{
try {
$this->RDAPService->registerDomain($fqdn);
$this->RDAPService->registerDomains([$fqdn]);
} catch (Exception $e) {
return new Response($e->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
}
return new Response();
}
}
#[Route(path: '/test/publish/calendar', name: 'test_publish_calendar')]
public function testPublishCalendar(): Response
{
$calendar = new Calendar();
/** @var Domain $domain */
foreach ($this->domainRepository->findAll() as $domain) {
$attendees = [];
/** @var DomainEntity $entity */
foreach ($domain->getDomainEntities()->toArray() as $entity) {
$vCard = Reader::readJson($entity->getEntity()->getJCard());
$email = (string)$vCard->EMAIL;
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) continue;
$attendees[] = (new Attendee(new EmailAddress($email)))->setDisplayName((string)$vCard->FN);
}
/** @var DomainEvent $event */
foreach ($domain->getEvents()->toArray() as $event) {
$calendar->addEvent((new Event())
->setSummary($domain->getLdhName() . ' (' . $event->getAction()->value . ')')
->addCategory(new Category($event->getAction()->value))
->setAttendees($attendees)
->setOccurrence(new SingleDay(new Date($event->getDate())))
);
}
}
return new Response((new CalendarFactory())->createCalendar($calendar), Response::HTTP_OK, [
"Content-Type" => 'text/calendar; charset=utf-8'
]);
}
}

View File

@@ -47,11 +47,22 @@ readonly class RDAPService
/**
* @throws Exception
*/
public function registerDomain(string $fqdn): Domain
public function registerDomains(array $domains): void
{
$dnsRoot = json_decode(file_get_contents($this->params->get('kernel.project_dir') . '/src/Config/dns.json'))->services;
foreach ($domains as $fqdn) {
$this->registerDomain($dnsRoot, $fqdn);
}
}
/**
* @throws Exception
*/
private function registerDomain(array $dnsRoot, string $fqdn): void
{
$idnDomain = idn_to_ascii($fqdn);
try {
$rdapServer = $this->getRDAPServer(RDAPService::getTld($idnDomain));
$rdapServer = $this->getRDAPServer($dnsRoot, RDAPService::getTld($idnDomain));
} catch (Exception) {
throw new Exception("Unable to determine which RDAP server to contact");
}
@@ -156,17 +167,15 @@ readonly class RDAPService
$this->em->persist($domain);
$this->em->flush();
return $domain;
}
/**
* @throws Exception
*/
private function getRDAPServer(string $tld)
private function getRDAPServer(array $dnsRoot, string $tld)
{
$dnsRoot = json_decode(file_get_contents($this->params->get('kernel.project_dir') . '/src/Config/dns.json'))->services;
foreach ($dnsRoot as $dns) {
if (in_array($tld, $dns[0])) return $dns[1][0];
}