diff --git a/packages/db/migrations/0090.do.add_position_to_labels.sql b/packages/db/migrations/0090.do.add_position_to_labels.sql index a1790d4d6..bf4973d6f 100755 --- a/packages/db/migrations/0090.do.add_position_to_labels.sql +++ b/packages/db/migrations/0090.do.add_position_to_labels.sql @@ -20,6 +20,25 @@ WITH positions AS ( WHERE omnivore.labels.id = positions.id; -ALTER TABLE omnivore.labels ADD constraint labels_position_user_id_unique UNIQUE(user_id, position); +CREATE OR REPLACE FUNCTION update_label_position() + RETURNS TRIGGER AS $$ + DECLARE + new_position INTEGER; + BEGIN + IF (TG_OP = 'DELETE') THEN + UPDATE omnivore.labels SET position = position - 1 WHERE user_id = OLD.user_id AND position > OLD.position; + RETURN OLD; + ELSIF (TG_OP = 'INSERT') THEN + SELECT MAX(position) + 1 INTO new_position FROM omnivore.labels WHERE user_id = NEW.user_id; + NEW.position = new_position; + RETURN NEW; + END IF; + END; +$$ LANGUAGE 'plpgsql'; + +CREATE TRIGGER update_label_position + BEFORE INSERT OR DELETE ON omnivore.labels + FOR EACH ROW + EXECUTE FUNCTION update_label_position(); COMMIT; diff --git a/packages/db/migrations/0090.undo.add_position_to_labels.sql b/packages/db/migrations/0090.undo.add_position_to_labels.sql index a1eff4384..b36cefa33 100755 --- a/packages/db/migrations/0090.undo.add_position_to_labels.sql +++ b/packages/db/migrations/0090.undo.add_position_to_labels.sql @@ -4,6 +4,10 @@ BEGIN; +DROP TRIGGER IF EXISTS update_label_position ON omnivore.labels; + +DROP FUNCTION IF EXISTS update_label_position; + ALTER TABLE omnivore.labels DROP COLUMN IF EXISTS position; COMMIT;