diff --git a/source/migrations/r6-r7-postgresql.sql b/source/migrations/r6-r7-postgresql.sql new file mode 100644 index 0000000..93631d1 --- /dev/null +++ b/source/migrations/r6-r7-postgresql.sql @@ -0,0 +1,100 @@ +-- groups + +CREATE TABLE + groups( + "id" SERIAL, + "name" VARCHAR(63) NOT NULL, + "label" VARCHAR(63) NOT NULL, + UNIQUE ("name"), + UNIQUE ("id") + ) +; + +INSERT INTO + groups("name","label") + SELECT + DISTINCT group_name, + '' + FROM + member_groups +; + +UPDATE + groups +SET + label = name +; + + +-- invitations + +CREATE TABLE + invitations( + "id" SERIAL, + "key" VARCHAR(63) NOT NULL, + "expiry" INTEGER, + "name_changeable" BOOLEAN NOT NULL, + "name_value" VARCHAR(63) NOT NULL, + "label_changeable" BOOLEAN NOT NULL, + "label_value" VARCHAR(63) NOT NULL, + "email_address_changeable" BOOLEAN NOT NULL, + "email_address_value" VARCHAR(63), + "groups_changeable" BOOLEAN NOT NULL, + UNIQUE ("key"), + UNIQUE ("id") + ) +; + + +-- invitation_groups + +CREATE TABLE + invitation_groups( + "invitation_id" INTEGER NOT NULL, + "group_id" INTEGER NOT NULL, + "_dummy" BOOLEAN, + FOREIGN KEY ("invitation_id") REFERENCES "invitations"("id"), + FOREIGN KEY ("group_id") REFERENCES "groups"("id"), + UNIQUE ("invitation_id","group_id") + ) +; + + +-- name_indices + +DROP TABLE name_indices; + + +-- members + +ALTER TABLE members DROP CONSTRAINT members_name_real_value_name_real_index_key; +ALTER TABLE members ADD COLUMN "label" VARCHAR(63); +UPDATE members SET label = name_real_value; +ALTER TABLE members ALTER COLUMN "label" SET NOT NULL; +ALTER TABLE members RENAME COLUMN "name_real_value" TO "name"; +ALTER TABLE members RENAME COLUMN "email_address_private" TO "email_address"; +ALTER TABLE members DROP COLUMN "membership_number"; +ALTER TABLE members DROP COLUMN "name_real_index"; +ALTER TABLE members DROP COLUMN "registered"; +ALTER TABLE members DROP COLUMN "email_use_veiled_address"; +ALTER TABLE members DROP COLUMN "email_use_nominal_address"; +ALTER TABLE members DROP COLUMN "email_redirect_to_private_address"; +ALTER TABLE members DROP COLUMN "email_allow_sending"; +ALTER TABLE members ADD CONSTRAINT "members_name_key" UNIQUE ("name"); + + + +-- member_groups + +ALTER TABLE member_groups DROP CONSTRAINT member_groups_member_id_group_name_key; +ALTER TABLE member_groups ADD COLUMN group_id INTEGER; +UPDATE member_groups AS x SET group_id = (SELECT y.id FROM groups AS y WHERE y.name = x.group_name); +ALTER TABLE member_groups ALTER COLUMN group_id SET NOT NULL; +ALTER TABLE member_groups ADD CONSTRAINT "member_groups_group_id_fkey" FOREIGN KEY ("group_id") REFERENCES groups(id); +ALTER TABLE member_groups ADD CONSTRAINT "member_groups_member_id_group_id_key" UNIQUE ("member_id","group_id"); +ALTER TABLE member_groups DROP COLUMN group_name; + + +-- revision + +UPDATE _meta SET revision = 'r7'; diff --git a/source/structure/r7.sindri.json b/source/structure/r7.sindri.json new file mode 100644 index 0000000..e3e8428 --- /dev/null +++ b/source/structure/r7.sindri.json @@ -0,0 +1,297 @@ +{ + "domains": [ + { + "name": "sessions", + "data_fields": [ + { + "name": "key", + "type": "string_medium", + "nullable": false + }, + { + "name": "data", + "type": "string_long", + "nullable": false + } + ], + "constraints": [ + { + "kind": "unique", + "parameters": { + "fields": ["key"] + } + } + ] + }, + { + "name": "groups", + "key_field": { + "name": "id" + }, + "data_fields": [ + { + "name": "name", + "type": "string_short", + "nullable": false + }, + { + "name": "label", + "type": "string_short", + "nullable": false + } + ], + "constraints": [ + { + "kind": "unique", + "parameters": { + "fields": ["name"] + } + } + ] + }, + { + "name": "admins", + "key_field": { + "name": "id" + }, + "data_fields": [ + { + "name": "name", + "type": "string_short", + "nullable": false + }, + { + "name": "email_address", + "type": "string_medium", + "nullable": true + }, + { + "name": "password_image", + "type": "string_medium", + "nullable": false + }, + { + "name": "password_fail_count", + "type": "integer", + "nullable": false + } + ], + "constraints": [ + { + "kind": "unique", + "parameters": { + "fields": ["name"] + } + } + ] + }, + { + "name": "members", + "key_field": { + "name": "id" + }, + "data_fields": [ + { + "name": "name", + "type": "string_short", + "nullable": false + }, + { + "name": "label", + "type": "string_short", + "nullable": false + }, + { + "name": "email_address", + "type": "string_short", + "nullable": true + }, + { + "name": "enabled", + "type": "boolean", + "nullable": false + }, + { + "name": "password_image", + "type": "string_medium", + "nullable": true + }, + { + "name": "password_change_last_attempt", + "type": "integer", + "nullable": true + }, + { + "name": "password_change_token", + "type": "string_medium", + "nullable": true + } + ], + "constraints": [ + { + "kind": "unique", + "parameters": { + "fields": ["name"] + } + } + ] + }, + { + "name": "member_groups", + "data_fields": [ + { + "name": "member_id", + "type": "integer", + "nullable": false + }, + { + "name": "group_id", + "type": "integer", + "nullable": false + }, + { + "name": "_dummy", + "type": "boolean", + "nullable": true + } + ], + "constraints": [ + { + "kind": "foreign_key", + "parameters": { + "fields": ["member_id"], + "reference": { + "name": "members", + "fields": ["id"] + } + } + }, + { + "kind": "foreign_key", + "parameters": { + "fields": ["group_id"], + "reference": { + "name": "groups", + "fields": ["id"] + } + } + }, + { + "kind": "unique", + "parameters": { + "fields": ["member_id","group_id"] + } + } + ] + }, + { + "name": "invitations", + "key_field": { + "name": "id" + }, + "data_fields": [ + { + "name": "key", + "type": "string_short", + "nullable": false + }, + { + "name": "expiry", + "type": "integer", + "nullable": true + }, + { + "name": "name_changeable", + "type": "boolean", + "nullable": false + }, + { + "name": "name_value", + "type": "string_short", + "nullable": false + }, + { + "name": "label_changeable", + "type": "boolean", + "nullable": false + }, + { + "name": "label_value", + "type": "string_short", + "nullable": false + }, + { + "name": "email_address_changeable", + "type": "boolean", + "nullable": false + }, + { + "name": "email_address_value", + "type": "string_short", + "nullable": true + }, + { + "name": "groups_changeable", + "type": "boolean", + "nullable": false + } + ], + "constraints": [ + { + "kind": "unique", + "parameters": { + "fields": ["key"] + } + } + ] + }, + { + "name": "invitation_groups", + "data_fields": [ + { + "name": "invitation_id", + "type": "integer", + "nullable": false + }, + { + "name": "group_id", + "type": "integer", + "nullable": false + }, + { + "name": "_dummy", + "type": "boolean", + "nullable": true + } + ], + "constraints": [ + { + "kind": "foreign_key", + "parameters": { + "fields": ["invitation_id"], + "reference": { + "name": "invitations", + "fields": ["id"] + } + } + }, + { + "kind": "foreign_key", + "parameters": { + "fields": ["group_id"], + "reference": { + "name": "groups", + "fields": ["id"] + } + } + }, + { + "kind": "unique", + "parameters": { + "fields": ["invitation_id","group_id"] + } + } + ] + } + ] +}