diff --git a/composer.json b/composer.json index 5fd0ee7..4f0b828 100644 --- a/composer.json +++ b/composer.json @@ -154,7 +154,7 @@ "symfony/css-selector": "7.3.*", "symfony/debug-bundle": "7.3.*", "symfony/maker-bundle": "^1.0", - "symfony/phpunit-bridge": "^7.1", + "symfony/phpunit-bridge": "^7.3", "symfony/stopwatch": "7.3.*", "symfony/web-profiler-bundle": "7.3.*", "zenstruck/foundry": "^2.7" diff --git a/composer.lock b/composer.lock index 520c035..8622cf8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "36070883cc8a6add8ac7b7bb05214d8f", + "content-hash": "49fd7fad6776160ff572f3fb9201a8a2", "packages": [ { "name": "api-platform/core", diff --git a/migrations/Version20251016193639.php b/migrations/Version20251016193639.php new file mode 100644 index 0000000..44038a3 --- /dev/null +++ b/migrations/Version20251016193639.php @@ -0,0 +1,204 @@ +addSql("ALTER TABLE domain ADD status_jsonb JSONB DEFAULT '[]'::jsonb"); + $this->addSql(" + UPDATE domain + SET status_jsonb = to_jsonb(string_to_array(status, ',')) + WHERE status IS NOT NULL AND status <> '' + "); + $this->addSql('ALTER TABLE domain DROP COLUMN status'); + $this->addSql('ALTER TABLE domain RENAME COLUMN status_jsonb TO status'); + $this->addSql('COMMENT ON COLUMN domain.status IS NULL'); + + // domain_entity.roles + $this->addSql("ALTER TABLE domain_entity ADD roles_jsonb JSONB DEFAULT '[]'::jsonb"); + $this->addSql(" + UPDATE domain_entity + SET roles_jsonb = to_jsonb(string_to_array(roles, ',')) + WHERE roles IS NOT NULL AND roles <> '' + "); + $this->addSql('ALTER TABLE domain_entity DROP COLUMN roles'); + $this->addSql('ALTER TABLE domain_entity RENAME COLUMN roles_jsonb TO roles'); + $this->addSql('COMMENT ON COLUMN domain_entity.roles IS NULL'); + + // nameserver_entity.roles + $this->addSql("ALTER TABLE nameserver_entity ADD roles_jsonb JSONB DEFAULT '[]'::jsonb"); + $this->addSql(" + UPDATE nameserver_entity + SET roles_jsonb = to_jsonb(string_to_array(roles, ',')) + WHERE roles IS NOT NULL AND roles <> '' + "); + $this->addSql('ALTER TABLE nameserver_entity DROP COLUMN roles'); + $this->addSql('ALTER TABLE nameserver_entity RENAME COLUMN roles_jsonb TO roles'); + $this->addSql('COMMENT ON COLUMN nameserver_entity.roles IS NULL'); + + // nameserver_entity.status + $this->addSql("ALTER TABLE nameserver_entity ADD status_jsonb JSONB DEFAULT '[]'::jsonb"); + $this->addSql(" + UPDATE nameserver_entity + SET status_jsonb = to_jsonb(string_to_array(status, ',')) + WHERE status IS NOT NULL AND status <> '' + "); + $this->addSql('ALTER TABLE nameserver_entity DROP COLUMN status'); + $this->addSql('ALTER TABLE nameserver_entity RENAME COLUMN status_jsonb TO status'); + $this->addSql('COMMENT ON COLUMN nameserver_entity.status IS NULL'); + + // domain_status.add_status + $this->addSql("ALTER TABLE domain_status ADD add_status_jsonb JSONB DEFAULT '[]'::jsonb"); + $this->addSql(" + UPDATE domain_status + SET add_status_jsonb = to_jsonb(string_to_array(add_status, ',')) + WHERE add_status IS NOT NULL AND add_status <> '' + "); + $this->addSql('ALTER TABLE domain_status DROP COLUMN add_status'); + $this->addSql('ALTER TABLE domain_status RENAME COLUMN add_status_jsonb TO add_status'); + $this->addSql('COMMENT ON COLUMN domain_status.add_status IS NULL'); + + // domain_status.delete_status + $this->addSql("ALTER TABLE domain_status ADD delete_status_jsonb JSONB DEFAULT '[]'::jsonb"); + $this->addSql(" + UPDATE domain_status + SET delete_status_jsonb = to_jsonb(string_to_array(delete_status, ',')) + WHERE delete_status IS NOT NULL AND delete_status <> '' + "); + $this->addSql('ALTER TABLE domain_status DROP COLUMN delete_status'); + $this->addSql('ALTER TABLE domain_status RENAME COLUMN delete_status_jsonb TO delete_status'); + $this->addSql('COMMENT ON COLUMN domain_status.delete_status IS NULL'); + + // watch_list.webhook_dsn + $this->addSql("ALTER TABLE watch_list ADD webhook_dsn_jsonb JSONB DEFAULT '[]'::jsonb"); + $this->addSql(" + UPDATE watch_list + SET webhook_dsn_jsonb = to_jsonb(string_to_array(webhook_dsn, ',')) + WHERE webhook_dsn IS NOT NULL AND webhook_dsn <> '' + "); + $this->addSql('ALTER TABLE watch_list DROP COLUMN webhook_dsn'); + $this->addSql('ALTER TABLE watch_list RENAME COLUMN webhook_dsn_jsonb TO webhook_dsn'); + $this->addSql('COMMENT ON COLUMN watch_list.webhook_dsn IS NULL'); + + $this->addSql('ALTER TABLE domain ALTER status DROP DEFAULT'); + $this->addSql('ALTER TABLE domain_entity ALTER roles DROP DEFAULT'); + $this->addSql('ALTER TABLE domain_entity ALTER roles SET NOT NULL'); + $this->addSql('ALTER TABLE domain_status ALTER add_status DROP DEFAULT'); + $this->addSql('ALTER TABLE domain_status ALTER delete_status DROP DEFAULT'); + $this->addSql('ALTER TABLE nameserver_entity ALTER roles DROP DEFAULT'); + $this->addSql('ALTER TABLE nameserver_entity ALTER roles SET NOT NULL'); + $this->addSql('ALTER TABLE nameserver_entity ALTER status DROP DEFAULT'); + $this->addSql('ALTER TABLE nameserver_entity ALTER status SET NOT NULL'); + $this->addSql('ALTER TABLE watch_list ALTER webhook_dsn DROP DEFAULT'); + } + + public function down(Schema $schema): void + { + // domain.status + $this->addSql('ALTER TABLE domain ADD status_text TEXT DEFAULT NULL'); + $this->addSql(" + UPDATE domain + SET status_text = array_to_string(ARRAY( + SELECT jsonb_array_elements_text(status) + ), ',') + WHERE status IS NOT NULL + "); + $this->addSql('ALTER TABLE domain DROP COLUMN status'); + $this->addSql('ALTER TABLE domain RENAME COLUMN status_text TO status'); + $this->addSql('COMMENT ON COLUMN domain.status IS NULL'); + + // domain_entity.roles + $this->addSql('ALTER TABLE domain_entity ADD roles_text TEXT DEFAULT NULL'); + $this->addSql(" + UPDATE domain_entity + SET roles_text = array_to_string(ARRAY( + SELECT jsonb_array_elements_text(roles) + ), ',') + WHERE roles IS NOT NULL + "); + $this->addSql('ALTER TABLE domain_entity DROP COLUMN roles'); + $this->addSql('ALTER TABLE domain_entity RENAME COLUMN roles_text TO roles'); + $this->addSql('COMMENT ON COLUMN domain_entity.roles IS NULL'); + + // nameserver_entity.roles + $this->addSql('ALTER TABLE nameserver_entity ADD roles_text TEXT DEFAULT NULL'); + $this->addSql(" + UPDATE nameserver_entity + SET roles_text = array_to_string(ARRAY( + SELECT jsonb_array_elements_text(roles) + ), ',') + WHERE roles IS NOT NULL + "); + $this->addSql('ALTER TABLE nameserver_entity DROP COLUMN roles'); + $this->addSql('ALTER TABLE nameserver_entity RENAME COLUMN roles_text TO roles'); + $this->addSql('COMMENT ON COLUMN nameserver_entity.roles IS NULL'); + + // nameserver_entity.status + $this->addSql('ALTER TABLE nameserver_entity ADD status_text TEXT DEFAULT NULL'); + $this->addSql(" + UPDATE nameserver_entity + SET status_text = array_to_string(ARRAY( + SELECT jsonb_array_elements_text(status) + ), ',') + WHERE status IS NOT NULL + "); + $this->addSql('ALTER TABLE nameserver_entity DROP COLUMN status'); + $this->addSql('ALTER TABLE nameserver_entity RENAME COLUMN status_text TO status'); + $this->addSql('COMMENT ON COLUMN nameserver_entity.status IS NULL'); + + // domain_status.add_status + $this->addSql('ALTER TABLE domain_status ADD add_status_text TEXT DEFAULT NULL'); + $this->addSql(" + UPDATE domain_status + SET add_status_text = array_to_string(ARRAY( + SELECT jsonb_array_elements_text(add_status) + ), ',') + WHERE add_status IS NOT NULL + "); + $this->addSql('ALTER TABLE domain_status DROP COLUMN add_status'); + $this->addSql('ALTER TABLE domain_status RENAME COLUMN add_status_text TO add_status'); + $this->addSql('COMMENT ON COLUMN domain_status.add_status IS NULL'); + + // domain_status.delete_status + $this->addSql('ALTER TABLE domain_status ADD delete_status_text TEXT DEFAULT NULL'); + $this->addSql(" + UPDATE domain_status + SET delete_status_text = array_to_string(ARRAY( + SELECT jsonb_array_elements_text(delete_status) + ), ',') + WHERE delete_status IS NOT NULL + "); + $this->addSql('ALTER TABLE domain_status DROP COLUMN delete_status'); + $this->addSql('ALTER TABLE domain_status RENAME COLUMN delete_status_text TO delete_status'); + $this->addSql('COMMENT ON COLUMN domain_status.delete_status IS NULL'); + + // watch_list.webhook_dsn + $this->addSql('ALTER TABLE watch_list ADD webhook_dsn_text TEXT DEFAULT NULL'); + $this->addSql(" + UPDATE watch_list + SET webhook_dsn_text = array_to_string(ARRAY( + SELECT jsonb_array_elements_text(webhook_dsn) + ), ',') + WHERE webhook_dsn IS NOT NULL + "); + $this->addSql('ALTER TABLE watch_list DROP COLUMN webhook_dsn'); + $this->addSql('ALTER TABLE watch_list RENAME COLUMN webhook_dsn_text TO webhook_dsn'); + $this->addSql('COMMENT ON COLUMN watch_list.webhook_dsn IS NULL'); + } +} diff --git a/src/Entity/Domain.php b/src/Entity/Domain.php index d116910..e044883 100644 --- a/src/Entity/Domain.php +++ b/src/Entity/Domain.php @@ -89,7 +89,7 @@ class Domain #[SerializedName('entities')] private Collection $domainEntities; - #[ORM\Column(type: Types::SIMPLE_ARRAY, nullable: true)] + #[ORM\Column(type: Types::JSON, nullable: true)] #[Groups(['domain:item', 'domain:list', 'watchlist:item', 'watchlist:list'])] private array $status = []; diff --git a/src/Entity/DomainEntity.php b/src/Entity/DomainEntity.php index c92d251..cf89323 100644 --- a/src/Entity/DomainEntity.php +++ b/src/Entity/DomainEntity.php @@ -23,7 +23,7 @@ class DomainEntity #[Groups(['domain-entity:entity'])] private ?Entity $entity = null; - #[ORM\Column(type: Types::SIMPLE_ARRAY)] + #[ORM\Column(type: Types::JSON)] #[Groups(['domain-entity:entity', 'domain-entity:domain'])] private array $roles = []; diff --git a/src/Entity/DomainStatus.php b/src/Entity/DomainStatus.php index 4e616df..2e529f5 100644 --- a/src/Entity/DomainStatus.php +++ b/src/Entity/DomainStatus.php @@ -27,11 +27,11 @@ class DomainStatus #[Groups(['domain:item'])] private \DateTimeImmutable $date; - #[ORM\Column(type: Types::SIMPLE_ARRAY, nullable: true)] + #[ORM\Column(type: Types::JSON, nullable: true)] #[Groups(['domain:item'])] private array $addStatus = []; - #[ORM\Column(type: Types::SIMPLE_ARRAY, nullable: true)] + #[ORM\Column(type: Types::JSON, nullable: true)] #[Groups(['domain:item'])] private array $deleteStatus = []; diff --git a/src/Entity/NameserverEntity.php b/src/Entity/NameserverEntity.php index 3966fd0..ba4d5ef 100644 --- a/src/Entity/NameserverEntity.php +++ b/src/Entity/NameserverEntity.php @@ -23,11 +23,11 @@ class NameserverEntity #[Groups(['nameserver-entity:entity'])] private ?Entity $entity = null; - #[ORM\Column(type: Types::SIMPLE_ARRAY)] + #[ORM\Column(type: Types::JSON)] #[Groups(['nameserver-entity:entity', 'nameserver-entity:nameserver'])] private array $roles = []; - #[ORM\Column(type: Types::SIMPLE_ARRAY)] + #[ORM\Column(type: Types::JSON)] #[Groups(['nameserver-entity:entity', 'nameserver-entity:nameserver'])] private array $status = []; diff --git a/src/Entity/WatchList.php b/src/Entity/WatchList.php index 0c5e754..0408966 100644 --- a/src/Entity/WatchList.php +++ b/src/Entity/WatchList.php @@ -180,7 +180,7 @@ class WatchList private ?\DateTimeImmutable $createdAt = null; #[SerializedName('dsn')] - #[ORM\Column(type: Types::SIMPLE_ARRAY, nullable: true)] + #[ORM\Column(type: Types::JSON, nullable: true)] #[Groups(['watchlist:list', 'watchlist:item', 'watchlist:create', 'watchlist:update'])] #[Assert\Unique] #[Assert\All([