feat: use JSONB instead of SIMPLE_ARRAY

This commit is contained in:
Maël Gangloff 2025-10-16 22:21:08 +02:00
parent a143039925
commit 64fe0c895b
No known key found for this signature in database
GPG Key ID: 11FDC81C24A7F629
8 changed files with 213 additions and 9 deletions

View File

@ -154,7 +154,7 @@
"symfony/css-selector": "7.3.*", "symfony/css-selector": "7.3.*",
"symfony/debug-bundle": "7.3.*", "symfony/debug-bundle": "7.3.*",
"symfony/maker-bundle": "^1.0", "symfony/maker-bundle": "^1.0",
"symfony/phpunit-bridge": "^7.1", "symfony/phpunit-bridge": "^7.3",
"symfony/stopwatch": "7.3.*", "symfony/stopwatch": "7.3.*",
"symfony/web-profiler-bundle": "7.3.*", "symfony/web-profiler-bundle": "7.3.*",
"zenstruck/foundry": "^2.7" "zenstruck/foundry": "^2.7"

2
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "36070883cc8a6add8ac7b7bb05214d8f", "content-hash": "49fd7fad6776160ff572f3fb9201a8a2",
"packages": [ "packages": [
{ {
"name": "api-platform/core", "name": "api-platform/core",

View File

@ -0,0 +1,204 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20251016193639 extends AbstractMigration
{
public function getDescription(): string
{
return 'Convert domain status to JSONB';
}
public function up(Schema $schema): void
{
// domain.status
$this->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');
}
}

View File

@ -89,7 +89,7 @@ class Domain
#[SerializedName('entities')] #[SerializedName('entities')]
private Collection $domainEntities; 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'])] #[Groups(['domain:item', 'domain:list', 'watchlist:item', 'watchlist:list'])]
private array $status = []; private array $status = [];

View File

@ -23,7 +23,7 @@ class DomainEntity
#[Groups(['domain-entity:entity'])] #[Groups(['domain-entity:entity'])]
private ?Entity $entity = null; private ?Entity $entity = null;
#[ORM\Column(type: Types::SIMPLE_ARRAY)] #[ORM\Column(type: Types::JSON)]
#[Groups(['domain-entity:entity', 'domain-entity:domain'])] #[Groups(['domain-entity:entity', 'domain-entity:domain'])]
private array $roles = []; private array $roles = [];

View File

@ -27,11 +27,11 @@ class DomainStatus
#[Groups(['domain:item'])] #[Groups(['domain:item'])]
private \DateTimeImmutable $date; private \DateTimeImmutable $date;
#[ORM\Column(type: Types::SIMPLE_ARRAY, nullable: true)] #[ORM\Column(type: Types::JSON, nullable: true)]
#[Groups(['domain:item'])] #[Groups(['domain:item'])]
private array $addStatus = []; private array $addStatus = [];
#[ORM\Column(type: Types::SIMPLE_ARRAY, nullable: true)] #[ORM\Column(type: Types::JSON, nullable: true)]
#[Groups(['domain:item'])] #[Groups(['domain:item'])]
private array $deleteStatus = []; private array $deleteStatus = [];

View File

@ -23,11 +23,11 @@ class NameserverEntity
#[Groups(['nameserver-entity:entity'])] #[Groups(['nameserver-entity:entity'])]
private ?Entity $entity = null; private ?Entity $entity = null;
#[ORM\Column(type: Types::SIMPLE_ARRAY)] #[ORM\Column(type: Types::JSON)]
#[Groups(['nameserver-entity:entity', 'nameserver-entity:nameserver'])] #[Groups(['nameserver-entity:entity', 'nameserver-entity:nameserver'])]
private array $roles = []; private array $roles = [];
#[ORM\Column(type: Types::SIMPLE_ARRAY)] #[ORM\Column(type: Types::JSON)]
#[Groups(['nameserver-entity:entity', 'nameserver-entity:nameserver'])] #[Groups(['nameserver-entity:entity', 'nameserver-entity:nameserver'])]
private array $status = []; private array $status = [];

View File

@ -180,7 +180,7 @@ class WatchList
private ?\DateTimeImmutable $createdAt = null; private ?\DateTimeImmutable $createdAt = null;
#[SerializedName('dsn')] #[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'])] #[Groups(['watchlist:list', 'watchlist:item', 'watchlist:create', 'watchlist:update'])]
#[Assert\Unique] #[Assert\Unique]
#[Assert\All([ #[Assert\All([