diff --git a/migrations/Version20240713104543.php b/migrations/Version20240713104543.php deleted file mode 100644 index ead3397..0000000 --- a/migrations/Version20240713104543.php +++ /dev/null @@ -1,39 +0,0 @@ -addSql('CREATE TEMPORARY TABLE __temp__nameserver AS SELECT ldh_name, handle FROM nameserver'); - $this->addSql('DROP TABLE nameserver'); - $this->addSql('CREATE TABLE nameserver (ldh_name VARCHAR(255) NOT NULL, handle VARCHAR(255) DEFAULT NULL, PRIMARY KEY(ldh_name))'); - $this->addSql('INSERT INTO nameserver (ldh_name, handle) SELECT ldh_name, handle FROM __temp__nameserver'); - $this->addSql('DROP TABLE __temp__nameserver'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE TEMPORARY TABLE __temp__nameserver AS SELECT ldh_name, handle FROM nameserver'); - $this->addSql('DROP TABLE nameserver'); - $this->addSql('CREATE TABLE nameserver (ldh_name VARCHAR(255) NOT NULL, handle VARCHAR(255) NOT NULL, PRIMARY KEY(ldh_name))'); - $this->addSql('INSERT INTO nameserver (ldh_name, handle) SELECT ldh_name, handle FROM __temp__nameserver'); - $this->addSql('DROP TABLE __temp__nameserver'); - } -} diff --git a/migrations/Version20240713104346.php b/migrations/Version20240713135242.php similarity index 77% rename from migrations/Version20240713104346.php rename to migrations/Version20240713135242.php index df22d9e..c0b5b55 100644 --- a/migrations/Version20240713104346.php +++ b/migrations/Version20240713135242.php @@ -10,7 +10,7 @@ use Doctrine\Migrations\AbstractMigration; /** * Auto-generated Migration: Please modify to your needs! */ -final class Version20240713104346 extends AbstractMigration +final class Version20240713135242 extends AbstractMigration { public function getDescription(): string { @@ -22,25 +22,25 @@ final class Version20240713104346 extends AbstractMigration // this up() migration is auto-generated, please modify it to your needs $this->addSql('CREATE TABLE domain (ldh_name VARCHAR(255) NOT NULL, handle VARCHAR(255) NOT NULL, status CLOB NOT NULL --(DC2Type:simple_array) , PRIMARY KEY(ldh_name))'); - $this->addSql('CREATE TABLE domain_nameservers (domain_handle VARCHAR(255) NOT NULL, nameserver_ldh_name VARCHAR(255) NOT NULL, PRIMARY KEY(domain_handle, nameserver_ldh_name), CONSTRAINT FK_B6E6B63AFEE32C10 FOREIGN KEY (domain_handle) REFERENCES domain (handle) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_B6E6B63AA6496BFE FOREIGN KEY (nameserver_ldh_name) REFERENCES nameserver (ldh_name) NOT DEFERRABLE INITIALLY IMMEDIATE)'); - $this->addSql('CREATE INDEX IDX_B6E6B63AFEE32C10 ON domain_nameservers (domain_handle)'); + $this->addSql('CREATE TABLE domain_nameservers (domain_ldh_name VARCHAR(255) NOT NULL, nameserver_ldh_name VARCHAR(255) NOT NULL, PRIMARY KEY(domain_ldh_name, nameserver_ldh_name), CONSTRAINT FK_B6E6B63AAF923913 FOREIGN KEY (domain_ldh_name) REFERENCES domain (ldh_name) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_B6E6B63AA6496BFE FOREIGN KEY (nameserver_ldh_name) REFERENCES nameserver (ldh_name) NOT DEFERRABLE INITIALLY IMMEDIATE)'); + $this->addSql('CREATE INDEX IDX_B6E6B63AAF923913 ON domain_nameservers (domain_ldh_name)'); $this->addSql('CREATE INDEX IDX_B6E6B63AA6496BFE ON domain_nameservers (nameserver_ldh_name)'); - $this->addSql('CREATE TABLE domain_entity (domain_id VARCHAR(255) NOT NULL, entity_id VARCHAR(255) NOT NULL, roles CLOB NOT NULL --(DC2Type:simple_array) - , PRIMARY KEY(domain_id, entity_id), CONSTRAINT FK_614B48A1115F0EE5 FOREIGN KEY (domain_id) REFERENCES domain (ldh_name) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_614B48A181257D5D FOREIGN KEY (entity_id) REFERENCES entity (handle) NOT DEFERRABLE INITIALLY IMMEDIATE)'); + $this->addSql('CREATE TABLE domain_entity (domain_id VARCHAR(255) NOT NULL, entity_id INTEGER NOT NULL, roles CLOB NOT NULL --(DC2Type:simple_array) + , PRIMARY KEY(domain_id, entity_id), CONSTRAINT FK_614B48A1115F0EE5 FOREIGN KEY (domain_id) REFERENCES domain (ldh_name) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_614B48A181257D5D FOREIGN KEY (entity_id) REFERENCES entity (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); $this->addSql('CREATE INDEX IDX_614B48A1115F0EE5 ON domain_entity (domain_id)'); $this->addSql('CREATE INDEX IDX_614B48A181257D5D ON domain_entity (entity_id)'); $this->addSql('CREATE TABLE domain_event (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, domain_id VARCHAR(255) NOT NULL, "action" VARCHAR(255) NOT NULL, date DATETIME NOT NULL --(DC2Type:datetime_immutable) , CONSTRAINT FK_E8D52271115F0EE5 FOREIGN KEY (domain_id) REFERENCES domain (ldh_name) NOT DEFERRABLE INITIALLY IMMEDIATE)'); $this->addSql('CREATE INDEX IDX_E8D52271115F0EE5 ON domain_event (domain_id)'); - $this->addSql('CREATE TABLE entity (handle VARCHAR(255) NOT NULL, j_card CLOB NOT NULL --(DC2Type:json) - , PRIMARY KEY(handle))'); - $this->addSql('CREATE TABLE entity_event (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, entity_id VARCHAR(255) NOT NULL, "action" VARCHAR(255) NOT NULL, date DATETIME NOT NULL --(DC2Type:datetime_immutable) - , CONSTRAINT FK_975A3F5E81257D5D FOREIGN KEY (entity_id) REFERENCES entity (handle) NOT DEFERRABLE INITIALLY IMMEDIATE)'); + $this->addSql('CREATE TABLE entity (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, handle VARCHAR(255) NOT NULL, tld VARCHAR(255) NOT NULL, j_card CLOB NOT NULL --(DC2Type:json) + )'); + $this->addSql('CREATE TABLE entity_event (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, entity_id INTEGER NOT NULL, "action" VARCHAR(255) NOT NULL, date DATETIME NOT NULL --(DC2Type:datetime_immutable) + , CONSTRAINT FK_975A3F5E81257D5D FOREIGN KEY (entity_id) REFERENCES entity (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); $this->addSql('CREATE INDEX IDX_975A3F5E81257D5D ON entity_event (entity_id)'); - $this->addSql('CREATE TABLE nameserver (ldh_name VARCHAR(255) NOT NULL, handle VARCHAR(255) NOT NULL, PRIMARY KEY(ldh_name))'); - $this->addSql('CREATE TABLE nameserver_entity (nameserver_id VARCHAR(255) NOT NULL, entity_id VARCHAR(255) NOT NULL, roles CLOB NOT NULL --(DC2Type:simple_array) + $this->addSql('CREATE TABLE nameserver (ldh_name VARCHAR(255) NOT NULL, PRIMARY KEY(ldh_name))'); + $this->addSql('CREATE TABLE nameserver_entity (nameserver_id VARCHAR(255) NOT NULL, entity_id INTEGER NOT NULL, roles CLOB NOT NULL --(DC2Type:simple_array) , status CLOB NOT NULL --(DC2Type:simple_array) - , PRIMARY KEY(nameserver_id, entity_id), CONSTRAINT FK_A269AFB41A555619 FOREIGN KEY (nameserver_id) REFERENCES nameserver (ldh_name) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_A269AFB481257D5D FOREIGN KEY (entity_id) REFERENCES entity (handle) NOT DEFERRABLE INITIALLY IMMEDIATE)'); + , PRIMARY KEY(nameserver_id, entity_id), CONSTRAINT FK_A269AFB41A555619 FOREIGN KEY (nameserver_id) REFERENCES nameserver (ldh_name) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_A269AFB481257D5D FOREIGN KEY (entity_id) REFERENCES entity (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); $this->addSql('CREATE INDEX IDX_A269AFB41A555619 ON nameserver_entity (nameserver_id)'); $this->addSql('CREATE INDEX IDX_A269AFB481257D5D ON nameserver_entity (entity_id)'); $this->addSql('CREATE TABLE user (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, email VARCHAR(180) NOT NULL, roles CLOB NOT NULL --(DC2Type:json) diff --git a/src/Controller/TestController.php b/src/Controller/TestController.php index d2ce3d2..276e0e8 100644 --- a/src/Controller/TestController.php +++ b/src/Controller/TestController.php @@ -48,7 +48,8 @@ class TestController extends AbstractController #[Route(path: '/test/{fqdn}', name: 'test')] public function testRoute(string $fqdn): Response { - $rdapServer = $this->getRdapServer($fqdn); + $tld = $this->getTld($fqdn); + $rdapServer = $this->getRdapServer($tld); $res = $this->client->request( 'GET', $rdapServer . 'domain/' . $fqdn @@ -79,7 +80,10 @@ class TestController extends AbstractController foreach ($res['entities'] as $rdapEntity) { if (!array_key_exists('handle', $rdapEntity)) continue; - $entity = $this->processEntity($rdapEntity); + $entity = $this->processEntity($rdapEntity, $tld); + + $this->em->persist($entity); + $this->em->flush(); $domainEntity = $this->domainEntityRepository->findOneBy([ "domain" => $domain, @@ -94,13 +98,10 @@ class TestController extends AbstractController ->setEntity($entity) ->setRoles(array_map(fn($str): DomainRole => DomainRole::from($str), $rdapEntity['roles']))); - $this->em->persist($entity); + $this->em->persist($domainEntity); $this->em->flush(); } - $this->em->persist($domain); - $this->em->flush(); - foreach ($res['nameservers'] as $rdapNameserver) { $nameserver = $this->nameserverRepository->findOneBy([ @@ -109,7 +110,6 @@ class TestController extends AbstractController if ($nameserver === null) $nameserver = new Nameserver(); $nameserver->setLdhName($rdapNameserver['ldhName']); - if (array_key_exists('handle', $rdapNameserver)) $nameserver->setHandle($rdapNameserver['handle']); if (!array_key_exists('entities', $rdapNameserver)) { $domain->addNameserver($nameserver); @@ -119,7 +119,10 @@ class TestController extends AbstractController foreach ($rdapNameserver['entities'] as $rdapEntity) { if (!array_key_exists('handle', $rdapEntity)) continue; - $entity = $this->processEntity($rdapEntity); + $entity = $this->processEntity($rdapEntity, $tld); + + $this->em->persist($entity); + $this->em->flush(); $nameserverEntity = $this->nameserverEntityRepository->findOneBy([ "nameserver" => $nameserver, @@ -133,10 +136,8 @@ class TestController extends AbstractController ->setStatus(array_map(fn($str): DomainStatus => DomainStatus::from($str), $rdapNameserver['status'])) ->setEntity($entity) ->setRoles(array_map(fn($str): DomainRole => DomainRole::from($str), $rdapEntity['roles']))); - - $this->em->persist($entity); - $this->em->flush(); } + $domain->addNameserver($nameserver); } @@ -147,9 +148,17 @@ class TestController extends AbstractController return new Response(null, Response::HTTP_OK); } - private function getRdapServer(string $fqdn) + private function getTld($domain): string + { + $lastDotPosition = strrpos($domain, '.'); + if ($lastDotPosition === false) { + throw new Exception("Domain must contain at least one dot."); + } + return strtolower(substr($domain, $lastDotPosition + 1)); + } + + private function getRdapServer(string $tld) { - $tld = $this->getTld($fqdn); $dnsRoot = json_decode(file_get_contents($this->getParameter('kernel.project_dir') . '/src/Config/dns.json'))->services; foreach ($dnsRoot as $dns) { @@ -158,23 +167,16 @@ class TestController extends AbstractController throw new Exception("This TLD ($tld) is not supported."); } - private function getTld($domain) - { - $lastDotPosition = strrpos($domain, '.'); - if ($lastDotPosition === false) { - throw new Exception("Domain must contain at least one dot."); - } - return substr($domain, $lastDotPosition + 1); - } - - private function processEntity(array $rdapEntity): Entity + private function processEntity(array $rdapEntity, string $tld): Entity { $entity = $this->entityRepository->findOneBy([ - "handle" => $rdapEntity['handle'] + "handle" => $rdapEntity['handle'], + "tld" => $tld ]); if ($entity === null) $entity = new Entity(); $entity + ->setTld($tld) ->setHandle($rdapEntity['handle']) ->setJCard($rdapEntity['vcardArray']); @@ -183,8 +185,7 @@ class TestController extends AbstractController foreach ($rdapEntity['events'] as $rdapEntityEvent) { $event = $this->entityEventRepository->findOneBy([ "action" => EventAction::from($rdapEntityEvent["eventAction"]), - "date" => new DateTimeImmutable($rdapEntityEvent["eventDate"]), - "entity" => $entity + "date" => new DateTimeImmutable($rdapEntityEvent["eventDate"]) ]); if ($event !== null) continue; diff --git a/src/Entity/Domain.php b/src/Entity/Domain.php index 4f3b7da..6ca30d9 100644 --- a/src/Entity/Domain.php +++ b/src/Entity/Domain.php @@ -45,7 +45,7 @@ class Domain */ #[ORM\ManyToMany(targetEntity: Nameserver::class, inversedBy: 'domains', cascade: ['persist'])] #[ORM\JoinTable(name: 'domain_nameservers', - joinColumns: [new ORM\JoinColumn(name: 'domain_handle', referencedColumnName: 'handle')], + joinColumns: [new ORM\JoinColumn(name: 'domain_ldh_name', referencedColumnName: 'ldh_name')], inverseJoinColumns: [new ORM\JoinColumn(name: 'nameserver_ldh_name', referencedColumnName: 'ldh_name')] )] private Collection $nameservers; diff --git a/src/Entity/DomainEntity.php b/src/Entity/DomainEntity.php index 0defdd5..c376652 100644 --- a/src/Entity/DomainEntity.php +++ b/src/Entity/DomainEntity.php @@ -17,7 +17,7 @@ class DomainEntity #[ORM\Id] #[ORM\ManyToOne(targetEntity: Entity::class, cascade: ['persist'], inversedBy: 'domainEntities')] - #[ORM\JoinColumn(referencedColumnName: 'handle', nullable: false)] + #[ORM\JoinColumn(referencedColumnName: 'id', nullable: false)] private ?Entity $entity = null; #[ORM\Column(type: Types::SIMPLE_ARRAY, enumType: DomainRole::class)] diff --git a/src/Entity/Entity.php b/src/Entity/Entity.php index 2326fdb..7a79126 100644 --- a/src/Entity/Entity.php +++ b/src/Entity/Entity.php @@ -10,10 +10,19 @@ use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: EntityRepository::class)] class Entity { + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column] + private ?int $id = null; + + #[ORM\Column(length: 255)] private ?string $handle = null; + #[ORM\Column(length: 255)] + private ?string $tld = null; + /** * @var Collection */ @@ -42,6 +51,11 @@ class Entity $this->events = new ArrayCollection(); } + public function getId(): ?int + { + return $this->id; + } + public function getHandle(): ?string { return $this->handle; @@ -54,6 +68,18 @@ class Entity return $this; } + public function getTld(): ?string + { + return $this->tld; + } + + public function setTld(string $tld): static + { + $this->tld = $tld; + + return $this; + } + /** * @return Collection */ diff --git a/src/Entity/EntityEvent.php b/src/Entity/EntityEvent.php index 21bf1d3..859e779 100644 --- a/src/Entity/EntityEvent.php +++ b/src/Entity/EntityEvent.php @@ -10,10 +10,11 @@ class EntityEvent extends Event { #[ORM\ManyToOne(targetEntity: Entity::class, inversedBy: 'events')] - #[ORM\JoinColumn(referencedColumnName: 'handle', nullable: false)] + #[ORM\JoinColumn(referencedColumnName: 'id', nullable: false)] private ?Entity $entity = null; + public function getEntity(): ?Entity { return $this->entity; diff --git a/src/Entity/Nameserver.php b/src/Entity/Nameserver.php index 90af515..85ef994 100644 --- a/src/Entity/Nameserver.php +++ b/src/Entity/Nameserver.php @@ -15,9 +15,6 @@ class Nameserver #[ORM\Column(length: 255)] private ?string $ldhName = null; - #[ORM\Column(length: 255, nullable: true)] - private ?string $handle = null; - /** * @var Collection */ @@ -48,18 +45,6 @@ class Nameserver return $this; } - public function getHandle(): ?string - { - return $this->handle; - } - - public function setHandle(string $handle): static - { - $this->handle = $handle; - - return $this; - } - /** * @return Collection */ diff --git a/src/Entity/NameserverEntity.php b/src/Entity/NameserverEntity.php index 706b6e1..d0a4f48 100644 --- a/src/Entity/NameserverEntity.php +++ b/src/Entity/NameserverEntity.php @@ -18,9 +18,10 @@ class NameserverEntity #[ORM\Id] #[ORM\ManyToOne(targetEntity: Entity::class, cascade: ['persist'], inversedBy: 'nameserverEntities')] - #[ORM\JoinColumn(referencedColumnName: 'handle', nullable: false)] + #[ORM\JoinColumn(referencedColumnName: 'id', nullable: false)] private ?Entity $entity = null; + #[ORM\Column(type: Types::SIMPLE_ARRAY, enumType: DomainRole::class)] private array $roles = [];