From 4ddcb78e4451d6569c54ff249a5da9926fdb6ebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Tamargo?= Date: Fri, 3 Dec 2021 12:39:48 +0200 Subject: [PATCH] MBS-11312: Add table to store changes to edit notes While originally I was just planning to make changes to the edit note table and nothing else, discussion with the team suggested that it would be better to actually have a table that stores the changes. This gives us several benefits: 1) we can easily check if an edit note has been deleted or edited 2) we can see who and when made the change 3) we can store the reason the change was made 4) we can see the original value (useful in case a malicious actor gets access to an admin account somehow, and also useful to find proof of misconduct if the editor posts an edit note, then removes it (after it has been emailed to the intended insultee). This table won't be replicated nor dumped (other than in private dumps). --- admin/sql/CreateFKConstraints.sql | 10 ++++++ admin/sql/CreateIndexes.sql | 2 ++ admin/sql/CreatePrimaryKeys.sql | 1 + admin/sql/CreateTables.sql | 12 +++++++ admin/sql/CreateTypes.sql | 2 ++ admin/sql/DropFKConstraints.sql | 2 ++ admin/sql/DropIndexes.sql | 1 + admin/sql/DropPrimaryKeys.sql | 1 + admin/sql/DropTables.sql | 1 + admin/sql/DropTypes.sql | 1 + admin/sql/SetSequences.sql | 1 + admin/sql/TruncateTables.sql | 1 + .../updates/20211203-mbs-11312-standalone.sql | 17 +++++++++ admin/sql/updates/20211203-mbs-11312.sql | 36 +++++++++++++++++++ admin/sql/updates/schema-change/28.all.sql | 36 +++++++++++++++++++ .../schema-change/28.master_or_standalone.sql | 23 ++++++++++++ upgrade.json | 4 +++ 17 files changed, 151 insertions(+) create mode 100644 admin/sql/updates/20211203-mbs-11312-standalone.sql create mode 100644 admin/sql/updates/20211203-mbs-11312.sql create mode 100644 admin/sql/updates/schema-change/28.master_or_standalone.sql diff --git a/admin/sql/CreateFKConstraints.sql b/admin/sql/CreateFKConstraints.sql index 82db56fe26a..0acd3f22741 100644 --- a/admin/sql/CreateFKConstraints.sql +++ b/admin/sql/CreateFKConstraints.sql @@ -500,6 +500,16 @@ ALTER TABLE edit_note FOREIGN KEY (edit) REFERENCES edit(id); +ALTER TABLE edit_note_change + ADD CONSTRAINT edit_note_change_fk_edit_note + FOREIGN KEY (edit_note) + REFERENCES edit_note(id); + +ALTER TABLE edit_note_change + ADD CONSTRAINT edit_note_change_fk_change_editor + FOREIGN KEY (change_editor) + REFERENCES editor(id); + ALTER TABLE edit_note_recipient ADD CONSTRAINT edit_note_recipient_fk_recipient FOREIGN KEY (recipient) diff --git a/admin/sql/CreateIndexes.sql b/admin/sql/CreateIndexes.sql index bbecbb2e01b..79810473552 100644 --- a/admin/sql/CreateIndexes.sql +++ b/admin/sql/CreateIndexes.sql @@ -170,6 +170,8 @@ CREATE INDEX edit_url_idx ON edit_url (url); CREATE INDEX edit_note_idx_edit ON edit_note (edit); CREATE INDEX edit_note_idx_editor ON edit_note (editor); +CREATE INDEX edit_note_change_idx_edit_note ON edit_note_change (edit_note); + CREATE INDEX edit_note_recipient_idx_recipient ON edit_note_recipient (recipient); CREATE UNIQUE INDEX event_idx_gid ON event (gid); diff --git a/admin/sql/CreatePrimaryKeys.sql b/admin/sql/CreatePrimaryKeys.sql index 72dbf7af9d0..7d7988fc9a2 100644 --- a/admin/sql/CreatePrimaryKeys.sql +++ b/admin/sql/CreatePrimaryKeys.sql @@ -54,6 +54,7 @@ ALTER TABLE edit_instrument ADD CONSTRAINT edit_instrument_pkey PRIMARY KEY (edi ALTER TABLE edit_label ADD CONSTRAINT edit_label_pkey PRIMARY KEY (edit, label); ALTER TABLE edit_mood ADD CONSTRAINT edit_mood_pkey PRIMARY KEY (edit, mood); ALTER TABLE edit_note ADD CONSTRAINT edit_note_pkey PRIMARY KEY (id); +ALTER TABLE edit_note_change ADD CONSTRAINT edit_note_change_pkey PRIMARY KEY (id); ALTER TABLE edit_note_recipient ADD CONSTRAINT edit_note_recipient_pkey PRIMARY KEY (recipient, edit_note); ALTER TABLE edit_place ADD CONSTRAINT edit_place_pkey PRIMARY KEY (edit, place); ALTER TABLE edit_recording ADD CONSTRAINT edit_recording_pkey PRIMARY KEY (edit, recording); diff --git a/admin/sql/CreateTables.sql b/admin/sql/CreateTables.sql index c34f32ae637..c9d24e0bed9 100644 --- a/admin/sql/CreateTables.sql +++ b/admin/sql/CreateTables.sql @@ -575,6 +575,18 @@ CREATE TABLE edit_note post_time TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); +CREATE TABLE edit_note_change +( + id SERIAL, -- PK + status edit_note_status, + edit_note INTEGER NOT NULL, -- references edit_note.id + change_editor INTEGER NOT NULL, -- references editor.id + change_time TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + old_note TEXT NOT NULL, + new_note TEXT NOT NULL, + reason TEXT NOT NULL DEFAULT '' +); + CREATE TABLE edit_note_recipient ( recipient INTEGER NOT NULL, -- PK, references editor.id edit_note INTEGER NOT NULL -- PK, references edit_note.id diff --git a/admin/sql/CreateTypes.sql b/admin/sql/CreateTypes.sql index 2f1d9f3dddf..001706422f9 100644 --- a/admin/sql/CreateTypes.sql +++ b/admin/sql/CreateTypes.sql @@ -3,6 +3,8 @@ BEGIN; CREATE TYPE cover_art_presence AS ENUM ('absent', 'present', 'darkened'); +CREATE TYPE edit_note_status AS ENUM ('deleted', 'edited'); + CREATE TYPE event_art_presence AS ENUM ('absent', 'present', 'darkened'); CREATE TYPE fluency AS ENUM ( diff --git a/admin/sql/DropFKConstraints.sql b/admin/sql/DropFKConstraints.sql index df52bf6d3a1..ba59b6c1516 100644 --- a/admin/sql/DropFKConstraints.sql +++ b/admin/sql/DropFKConstraints.sql @@ -98,6 +98,8 @@ ALTER TABLE edit_mood DROP CONSTRAINT IF EXISTS edit_mood_fk_edit; ALTER TABLE edit_mood DROP CONSTRAINT IF EXISTS edit_mood_fk_mood; ALTER TABLE edit_note DROP CONSTRAINT IF EXISTS edit_note_fk_editor; ALTER TABLE edit_note DROP CONSTRAINT IF EXISTS edit_note_fk_edit; +ALTER TABLE edit_note_change DROP CONSTRAINT IF EXISTS edit_note_change_fk_edit_note; +ALTER TABLE edit_note_change DROP CONSTRAINT IF EXISTS edit_note_change_fk_change_editor; ALTER TABLE edit_note_recipient DROP CONSTRAINT IF EXISTS edit_note_recipient_fk_recipient; ALTER TABLE edit_note_recipient DROP CONSTRAINT IF EXISTS edit_note_recipient_fk_edit_note; ALTER TABLE edit_place DROP CONSTRAINT IF EXISTS edit_place_fk_edit; diff --git a/admin/sql/DropIndexes.sql b/admin/sql/DropIndexes.sql index b36e419951a..0eb398ab2d5 100644 --- a/admin/sql/DropIndexes.sql +++ b/admin/sql/DropIndexes.sql @@ -87,6 +87,7 @@ DROP INDEX edit_instrument_idx; DROP INDEX edit_label_idx; DROP INDEX edit_label_idx_status; DROP INDEX edit_mood_idx; +DROP INDEX edit_note_change_idx_edit_note; DROP INDEX edit_note_idx_edit; DROP INDEX edit_note_idx_editor; DROP INDEX edit_note_recipient_idx_recipient; diff --git a/admin/sql/DropPrimaryKeys.sql b/admin/sql/DropPrimaryKeys.sql index fb5c5eea526..da41d8b69bb 100644 --- a/admin/sql/DropPrimaryKeys.sql +++ b/admin/sql/DropPrimaryKeys.sql @@ -54,6 +54,7 @@ ALTER TABLE edit_instrument DROP CONSTRAINT IF EXISTS edit_instrument_pkey; ALTER TABLE edit_label DROP CONSTRAINT IF EXISTS edit_label_pkey; ALTER TABLE edit_mood DROP CONSTRAINT IF EXISTS edit_mood_pkey; ALTER TABLE edit_note DROP CONSTRAINT IF EXISTS edit_note_pkey; +ALTER TABLE edit_note_change DROP CONSTRAINT IF EXISTS edit_note_change_pkey; ALTER TABLE edit_note_recipient DROP CONSTRAINT IF EXISTS edit_note_recipient_pkey; ALTER TABLE edit_place DROP CONSTRAINT IF EXISTS edit_place_pkey; ALTER TABLE edit_recording DROP CONSTRAINT IF EXISTS edit_recording_pkey; diff --git a/admin/sql/DropTables.sql b/admin/sql/DropTables.sql index cc805b2826a..a5f2617f01c 100644 --- a/admin/sql/DropTables.sql +++ b/admin/sql/DropTables.sql @@ -58,6 +58,7 @@ DROP TABLE edit_instrument; DROP TABLE edit_label; DROP TABLE edit_mood; DROP TABLE edit_note; +DROP TABLE edit_note_change; DROP TABLE edit_note_recipient; DROP TABLE edit_place; DROP TABLE edit_recording; diff --git a/admin/sql/DropTypes.sql b/admin/sql/DropTypes.sql index 6ae9a9a3427..b4c83aef7c4 100644 --- a/admin/sql/DropTypes.sql +++ b/admin/sql/DropTypes.sql @@ -2,6 +2,7 @@ \unset ON_ERROR_STOP DROP TYPE IF EXISTS cover_art_presence; +DROP TYPE IF EXISTS edit_note_status; DROP TYPE IF EXISTS event_art_presence; DROP TYPE IF EXISTS fluency; DROP TYPE IF EXISTS oauth_code_challenge_method; diff --git a/admin/sql/SetSequences.sql b/admin/sql/SetSequences.sql index 44b77639add..6aa8c87eb90 100644 --- a/admin/sql/SetSequences.sql +++ b/admin/sql/SetSequences.sql @@ -28,6 +28,7 @@ SELECT setval('cdtoc_id_seq', COALESCE((SELECT MAX(id) FROM cdtoc), 0) + 1, FALS SELECT setval('cdtoc_raw_id_seq', COALESCE((SELECT MAX(id) FROM cdtoc_raw), 0) + 1, FALSE); SELECT setval('edit_id_seq', COALESCE((SELECT MAX(id) FROM edit), 0) + 1, FALSE); SELECT setval('edit_note_id_seq', COALESCE((SELECT MAX(id) FROM edit_note), 0) + 1, FALSE); +SELECT setval('edit_note_change_id_seq', COALESCE((SELECT MAX(id) FROM edit_note_change), 0) + 1, FALSE); SELECT setval('editor_id_seq', COALESCE((SELECT MAX(id) FROM editor), 0) + 1, FALSE); SELECT setval('editor_preference_id_seq', COALESCE((SELECT MAX(id) FROM editor_preference), 0) + 1, FALSE); SELECT setval('editor_subscribe_artist_id_seq', COALESCE((SELECT MAX(id) FROM editor_subscribe_artist), 0) + 1, FALSE); diff --git a/admin/sql/TruncateTables.sql b/admin/sql/TruncateTables.sql index 64ef158432e..6a7ab114216 100644 --- a/admin/sql/TruncateTables.sql +++ b/admin/sql/TruncateTables.sql @@ -58,6 +58,7 @@ TRUNCATE TABLE edit_instrument RESTART IDENTITY CASCADE; TRUNCATE TABLE edit_label RESTART IDENTITY CASCADE; TRUNCATE TABLE edit_mood RESTART IDENTITY CASCADE; TRUNCATE TABLE edit_note RESTART IDENTITY CASCADE; +TRUNCATE TABLE edit_note_change RESTART IDENTITY CASCADE; TRUNCATE TABLE edit_note_recipient RESTART IDENTITY CASCADE; TRUNCATE TABLE edit_place RESTART IDENTITY CASCADE; TRUNCATE TABLE edit_recording RESTART IDENTITY CASCADE; diff --git a/admin/sql/updates/20211203-mbs-11312-standalone.sql b/admin/sql/updates/20211203-mbs-11312-standalone.sql new file mode 100644 index 00000000000..f3f80f0a105 --- /dev/null +++ b/admin/sql/updates/20211203-mbs-11312-standalone.sql @@ -0,0 +1,17 @@ +\set ON_ERROR_STOP 1 + +BEGIN; + +-- Foreign keys + +ALTER TABLE edit_note_change + ADD CONSTRAINT edit_note_change_fk_edit_note + FOREIGN KEY (edit_note) + REFERENCES edit_note(id); + +ALTER TABLE edit_note_change + ADD CONSTRAINT edit_note_change_fk_change_editor + FOREIGN KEY (change_editor) + REFERENCES editor(id); + +COMMIT; diff --git a/admin/sql/updates/20211203-mbs-11312.sql b/admin/sql/updates/20211203-mbs-11312.sql new file mode 100644 index 00000000000..26f57b6a0e2 --- /dev/null +++ b/admin/sql/updates/20211203-mbs-11312.sql @@ -0,0 +1,36 @@ +\set ON_ERROR_STOP 1 + +BEGIN; + +DO $$ +BEGIN + PERFORM 1 FROM pg_type + WHERE typname = 'edit_note_status'; + + IF NOT FOUND THEN + CREATE TYPE edit_note_status AS ENUM ('deleted', 'edited'); + END IF; +END +$$; + +CREATE TABLE edit_note_change +( + id SERIAL, -- PK + status edit_note_status, + edit_note INTEGER NOT NULL, -- references edit_note.id + change_editor INTEGER NOT NULL, -- references editor.id + change_time TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + old_note TEXT NOT NULL, + new_note TEXT NOT NULL, + reason TEXT NOT NULL DEFAULT '' +); + +-- Primary keys + +ALTER TABLE edit_note_change ADD CONSTRAINT edit_note_change_pkey PRIMARY KEY (id); + +-- Indexes + +CREATE INDEX edit_note_change_idx_edit_note ON edit_note_change (edit_note); + +COMMIT; diff --git a/admin/sql/updates/schema-change/28.all.sql b/admin/sql/updates/schema-change/28.all.sql index d91e2484105..dbd87cdd6c1 100644 --- a/admin/sql/updates/schema-change/28.all.sql +++ b/admin/sql/updates/schema-change/28.all.sql @@ -1,4 +1,5 @@ -- Generated by CompileSchemaScripts.pl from: +-- 20211203-mbs-11312.sql -- 20220802-mbs-12497.sql -- 20220927-mbs-12573.sql -- 20221114-mbs-12704.sql @@ -7,6 +8,41 @@ BEGIN; SET search_path = musicbrainz, public; SET LOCAL statement_timeout = 0; +-------------------------------------------------------------------------------- +SELECT '20211203-mbs-11312.sql'; + + +DO $$ +BEGIN + PERFORM 1 FROM pg_type + WHERE typname = 'edit_note_status'; + + IF NOT FOUND THEN + CREATE TYPE edit_note_status AS ENUM ('deleted', 'edited'); + END IF; +END +$$; + +CREATE TABLE edit_note_change +( + id SERIAL, -- PK + status edit_note_status, + edit_note INTEGER NOT NULL, -- references edit_note.id + change_editor INTEGER NOT NULL, -- references editor.id + change_time TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + old_note TEXT NOT NULL, + new_note TEXT NOT NULL, + reason TEXT NOT NULL DEFAULT '' +); + +-- Primary keys + +ALTER TABLE edit_note_change ADD CONSTRAINT edit_note_change_pkey PRIMARY KEY (id); + +-- Indexes + +CREATE INDEX edit_note_change_idx_edit_note ON edit_note_change (edit_note); + -------------------------------------------------------------------------------- SELECT '20220802-mbs-12497.sql'; diff --git a/admin/sql/updates/schema-change/28.master_or_standalone.sql b/admin/sql/updates/schema-change/28.master_or_standalone.sql new file mode 100644 index 00000000000..c289a922434 --- /dev/null +++ b/admin/sql/updates/schema-change/28.master_or_standalone.sql @@ -0,0 +1,23 @@ +-- Generated by CompileSchemaScripts.pl from: +-- 20211203-mbs-11312-standalone.sql +\set ON_ERROR_STOP 1 +BEGIN; +SET search_path = musicbrainz, public; +SET LOCAL statement_timeout = 0; +-------------------------------------------------------------------------------- +SELECT '20211203-mbs-11312-standalone.sql'; + + +-- Foreign keys + +ALTER TABLE edit_note_change + ADD CONSTRAINT edit_note_change_fk_edit_note + FOREIGN KEY (edit_note) + REFERENCES edit_note(id); + +ALTER TABLE edit_note_change + ADD CONSTRAINT edit_note_change_fk_change_editor + FOREIGN KEY (change_editor) + REFERENCES editor(id); + +COMMIT; diff --git a/upgrade.json b/upgrade.json index 8078da32254..0e06506dbd7 100644 --- a/upgrade.json +++ b/upgrade.json @@ -206,6 +206,7 @@ }, "28": { "all": [ + "20211203-mbs-11312.sql", "20220802-mbs-12497.sql", "20220927-mbs-12573.sql", "20221114-mbs-12704.sql", @@ -213,6 +214,9 @@ ], "master_only": [ "20230423-nix-pending-keys-insertion.sql" + ], + "master_or_standalone": [ + "20211203-mbs-11312-standalone.sql" ] } }