diff --git a/schema/mysql/schema.sql b/schema/mysql/schema.sql index 27f1ef5c..3f4f2889 100644 --- a/schema/mysql/schema.sql +++ b/schema/mysql/schema.sql @@ -10,6 +10,7 @@ CREATE TABLE available_channel_type ( CREATE TABLE channel ( id bigint NOT NULL AUTO_INCREMENT, + external_uuid char(36) NOT NULL, -- used for external references, lower case name text NOT NULL COLLATE utf8mb4_unicode_ci, type varchar(255) NOT NULL, -- 'email', 'sms', ... config mediumtext, -- JSON with channel-specific attributes @@ -20,6 +21,7 @@ CREATE TABLE channel ( deleted enum('n', 'y') NOT NULL DEFAULT 'n', CONSTRAINT pk_channel PRIMARY KEY (id), + CONSTRAINT uk_channel_external_uuid UNIQUE (external_uuid), CONSTRAINT fk_channel_available_channel_type FOREIGN KEY (type) REFERENCES available_channel_type(type) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; @@ -27,6 +29,7 @@ CREATE INDEX idx_channel_changed_at ON channel(changed_at); CREATE TABLE contact ( id bigint NOT NULL AUTO_INCREMENT, + external_uuid char(36) NOT NULL, -- used for external references, lower case full_name text NOT NULL COLLATE utf8mb4_unicode_ci, username varchar(254) COLLATE utf8mb4_unicode_ci, -- reference to web user default_channel_id bigint NOT NULL, @@ -35,6 +38,7 @@ CREATE TABLE contact ( deleted enum('n', 'y') NOT NULL DEFAULT 'n', CONSTRAINT pk_contact PRIMARY KEY (id), + CONSTRAINT uk_contact_external_uuid UNIQUE (external_uuid), -- As the username is unique, it must be NULLed for deletion via "deleted = 'y'" CONSTRAINT uk_contact_username UNIQUE (username), @@ -61,12 +65,14 @@ CREATE INDEX idx_contact_address_changed_at ON contact_address(changed_at); CREATE TABLE contactgroup ( id bigint NOT NULL AUTO_INCREMENT, + external_uuid char(36) NOT NULL, -- used for external references, lower case name text NOT NULL COLLATE utf8mb4_unicode_ci, changed_at bigint NOT NULL, deleted enum('n', 'y') NOT NULL DEFAULT 'n', - CONSTRAINT pk_contactgroup PRIMARY KEY (id) + CONSTRAINT pk_contactgroup PRIMARY KEY (id), + CONSTRAINT uk_contactgroup_external_uuid UNIQUE (external_uuid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; CREATE INDEX idx_contactgroup_changed_at ON contactgroup(changed_at); diff --git a/schema/mysql/upgrades/0.2.0-external-uuid.sql b/schema/mysql/upgrades/0.2.0-external-uuid.sql new file mode 100644 index 00000000..750bdd4e --- /dev/null +++ b/schema/mysql/upgrades/0.2.0-external-uuid.sql @@ -0,0 +1,15 @@ +ALTER TABLE contact ADD COLUMN external_uuid char(36) AFTER id; +ALTER TABLE contactgroup ADD COLUMN external_uuid char(36) AFTER id; +ALTER TABLE channel ADD COLUMN external_uuid char(36) AFTER id; + +UPDATE contact SET external_uuid = UUID() WHERE external_uuid IS NULL; +UPDATE contactgroup SET external_uuid = UUID() WHERE external_uuid IS NULL; +UPDATE channel SET external_uuid = UUID() WHERE external_uuid IS NULL; + +ALTER TABLE contact MODIFY COLUMN external_uuid char(36) NOT NULL; +ALTER TABLE contactgroup MODIFY COLUMN external_uuid char(36) NOT NULL; +ALTER TABLE channel MODIFY COLUMN external_uuid char(36) NOT NULL; + +ALTER TABLE contact ADD CONSTRAINT uk_contact_external_uuid UNIQUE (external_uuid); +ALTER TABLE contactgroup ADD CONSTRAINT uk_contactgroup_external_uuid UNIQUE (external_uuid); +ALTER TABLE channel ADD CONSTRAINT uk_channel_external_uuid UNIQUE (external_uuid); diff --git a/schema/pgsql/schema.sql b/schema/pgsql/schema.sql index 5ddb12e7..3f2d943c 100644 --- a/schema/pgsql/schema.sql +++ b/schema/pgsql/schema.sql @@ -42,6 +42,7 @@ CREATE TABLE available_channel_type ( CREATE TABLE channel ( id bigserial, + external_uuid uuid NOT NULL, -- used for external references name citext NOT NULL, type varchar(255) NOT NULL, -- 'email', 'sms', ... config text, -- JSON with channel-specific attributes @@ -52,6 +53,7 @@ CREATE TABLE channel ( deleted boolenum NOT NULL DEFAULT 'n', CONSTRAINT pk_channel PRIMARY KEY (id), + CONSTRAINT uk_channel_external_uuid UNIQUE (external_uuid), CONSTRAINT fk_channel_available_channel_type FOREIGN KEY (type) REFERENCES available_channel_type(type) ); @@ -59,6 +61,7 @@ CREATE INDEX idx_channel_changed_at ON channel(changed_at); CREATE TABLE contact ( id bigserial, + external_uuid uuid NOT NULL, -- used for external references full_name citext NOT NULL, username citext, -- reference to web user default_channel_id bigint NOT NULL, @@ -67,6 +70,7 @@ CREATE TABLE contact ( deleted boolenum NOT NULL DEFAULT 'n', CONSTRAINT pk_contact PRIMARY KEY (id), + CONSTRAINT uk_contact_external_uuid UNIQUE (external_uuid), -- As the username is unique, it must be NULLed for deletion via "deleted = 'y'" CONSTRAINT uk_contact_username UNIQUE (username), @@ -94,12 +98,14 @@ CREATE INDEX idx_contact_address_changed_at ON contact_address(changed_at); CREATE TABLE contactgroup ( id bigserial, + external_uuid uuid NOT NULL, -- used for external references name citext NOT NULL, changed_at bigint NOT NULL, deleted boolenum NOT NULL DEFAULT 'n', - CONSTRAINT pk_contactgroup PRIMARY KEY (id) + CONSTRAINT pk_contactgroup PRIMARY KEY (id), + CONSTRAINT uk_contactgroup_external_uuid UNIQUE (external_uuid) ); CREATE INDEX idx_contactgroup_changed_at ON contactgroup(changed_at); diff --git a/schema/pgsql/upgrades/0.2.0-external-uuid.sql b/schema/pgsql/upgrades/0.2.0-external-uuid.sql new file mode 100644 index 00000000..a79192cf --- /dev/null +++ b/schema/pgsql/upgrades/0.2.0-external-uuid.sql @@ -0,0 +1,15 @@ +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; + +ALTER TABLE contact ADD COLUMN external_uuid uuid CONSTRAINT uk_contact_external_uuid UNIQUE; +ALTER TABLE contactgroup ADD COLUMN external_uuid uuid CONSTRAINT uk_contactgroup_external_uuid UNIQUE; +ALTER TABLE channel ADD COLUMN external_uuid uuid CONSTRAINT uk_channel_external_uuid UNIQUE; + +UPDATE contact SET external_uuid = uuid_generate_v4() WHERE external_uuid IS NULL; +UPDATE contactgroup SET external_uuid = uuid_generate_v4() WHERE external_uuid IS NULL; +UPDATE channel SET external_uuid = uuid_generate_v4() WHERE external_uuid IS NULL; + +ALTER TABLE contact ALTER COLUMN external_uuid SET NOT NULL; +ALTER TABLE contactgroup ALTER COLUMN external_uuid SET NOT NULL; +ALTER TABLE channel ALTER COLUMN external_uuid SET NOT NULL; + +DROP EXTENSION "uuid-ossp";