From c14ac835756d1d0f4d0f8279759e2b7f75364447 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Wed, 3 Aug 2016 14:21:22 -0300 Subject: [PATCH] Ensure that we have only one list per label per board --- app/models/list.rb | 1 + ...03161903_add_unique_index_to_lists_label_id.rb | 15 +++++++++++++++ db/schema.rb | 1 + spec/models/list_spec.rb | 6 ++++++ 4 files changed, 23 insertions(+) create mode 100644 db/migrate/20160803161903_add_unique_index_to_lists_label_id.rb diff --git a/app/models/list.rb b/app/models/list.rb index f2a59d18c46..6f639a51150 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -6,6 +6,7 @@ class List < ActiveRecord::Base validates :board, :list_type, presence: true validates :label, :position, presence: true, if: :label? + validates :label_id, uniqueness: { scope: :board_id }, if: :label? validates :position, numericality: { only_integer: true, greater_than_or_equal_to: 0 }, if: :label? delegate :name, to: :label, allow_nil: true, prefix: true diff --git a/db/migrate/20160803161903_add_unique_index_to_lists_label_id.rb b/db/migrate/20160803161903_add_unique_index_to_lists_label_id.rb new file mode 100644 index 00000000000..baf2e70b127 --- /dev/null +++ b/db/migrate/20160803161903_add_unique_index_to_lists_label_id.rb @@ -0,0 +1,15 @@ +class AddUniqueIndexToListsLabelId < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + add_concurrent_index :lists, [:board_id, :label_id], unique: true + end + + def down + remove_index :lists, column: [:board_id, :label_id] if index_exists?(:lists, [:board_id, :label_id], unique: true) + end +end diff --git a/db/schema.rb b/db/schema.rb index 873dfa81702..0cdcc080227 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -550,6 +550,7 @@ ActiveRecord::Schema.define(version: 20160810142633) do t.datetime "updated_at", null: false end + add_index "lists", ["board_id", "label_id"], name: "index_lists_on_board_id_and_label_id", unique: true, using: :btree add_index "lists", ["board_id"], name: "index_lists_on_board_id", using: :btree add_index "lists", ["label_id"], name: "index_lists_on_label_id", using: :btree diff --git a/spec/models/list_spec.rb b/spec/models/list_spec.rb index 2dca15cef9c..86ff4cafa93 100644 --- a/spec/models/list_spec.rb +++ b/spec/models/list_spec.rb @@ -17,6 +17,12 @@ describe List do it { is_expected.to validate_presence_of(:position) } it { is_expected.to validate_numericality_of(:position).only_integer.is_greater_than_or_equal_to(0) } + it 'validates uniqueness of label scoped to board_id' do + create(:list) + + expect(subject).to validate_uniqueness_of(:label_id).scoped_to(:board_id) + end + context 'when list_type is set to backlog' do subject { described_class.new(list_type: :backlog) }