summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-08-03 14:21:22 -0300
committerDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-08-17 12:58:58 -0300
commitc14ac835756d1d0f4d0f8279759e2b7f75364447 (patch)
tree925000dd60d64676eb76b8d4830ee7a9001a9a4f
parentc08a14c3c20de35018a36f89dec0b10c99a4fd86 (diff)
downloadgitlab-ce-c14ac835756d1d0f4d0f8279759e2b7f75364447.tar.gz
Ensure that we have only one list per label per board
-rw-r--r--app/models/list.rb1
-rw-r--r--db/migrate/20160803161903_add_unique_index_to_lists_label_id.rb15
-rw-r--r--db/schema.rb1
-rw-r--r--spec/models/list_spec.rb6
4 files changed, 23 insertions, 0 deletions
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) }