From 6fe3e3b6ad49adc0cd36cced3d2165ccd5b54a67 Mon Sep 17 00:00:00 2001 From: Kendall Garner <17521368+kgarner7@users.noreply.github.com> Date: Fri, 13 Jun 2025 21:27:57 +0000 Subject: [PATCH] fix(db): add user foreign key constraint to annotation table (#4211) * fix(db): add user foreign key constraint to annotation table Associates user_id with user.id, with cascade for delete (drop annotation) and update (update annotation). Migration script will only copy/insert annotations for user IDs that exist * remove default for user_id * refactor(db): rename migration correct sequencing Signed-off-by: Deluan --------- Signed-off-by: Deluan Co-authored-by: Deluan --- ...010102_add_annotation_user_foreign_key.sql | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 db/migrations/20250701010102_add_annotation_user_foreign_key.sql diff --git a/db/migrations/20250701010102_add_annotation_user_foreign_key.sql b/db/migrations/20250701010102_add_annotation_user_foreign_key.sql new file mode 100644 index 000000000..114de2a88 --- /dev/null +++ b/db/migrations/20250701010102_add_annotation_user_foreign_key.sql @@ -0,0 +1,46 @@ +-- +goose Up +-- +goose StatementBegin +CREATE TABLE IF NOT EXISTS annotation_tmp +( + user_id varchar(255) not null + REFERENCES user(id) + ON DELETE CASCADE + ON UPDATE CASCADE, + item_id varchar(255) default '' not null, + item_type varchar(255) default '' not null, + play_count integer default 0, + play_date datetime, + rating integer default 0, + starred bool default FALSE not null, + starred_at datetime, + unique (user_id, item_id, item_type) +); + + +INSERT INTO annotation_tmp( + user_id, item_id, item_type, play_count, play_date, rating, starred, starred_at +) +SELECT user_id, item_id, item_type, play_count, play_date, rating, starred, starred_at +FROM annotation +WHERE user_id IN ( + SELECT id FROM user +); + +DROP TABLE annotation; +ALTER TABLE annotation_tmp RENAME TO annotation; + +CREATE INDEX annotation_play_count + on annotation (play_count); +CREATE INDEX annotation_play_date + on annotation (play_date); +CREATE INDEX annotation_rating + on annotation (rating); +CREATE INDEX annotation_starred + on annotation (starred); +CREATE INDEX annotation_starred_at + on annotation (starred_at); + +-- +goose StatementEnd + +-- +goose Down +