Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-07-28 02:33:22 +0300
committerDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-08-17 18:58:57 +0300
commit279361fa16c52011ee0f565c79a47012fad9b03f (patch)
tree309f93bd1073a2f3307c2fd1f6d14ef4ea03ee63 /app/services
parent247e11c94865b429c400fd9f0d1730c13b0b0c35 (diff)
Add service to move board lists
Diffstat (limited to 'app/services')
-rw-r--r--app/services/boards/lists/move_service.rb52
1 files changed, 52 insertions, 0 deletions
diff --git a/app/services/boards/lists/move_service.rb b/app/services/boards/lists/move_service.rb
new file mode 100644
index 00000000000..4a3000d1648
--- /dev/null
+++ b/app/services/boards/lists/move_service.rb
@@ -0,0 +1,52 @@
+module Boards
+ module Lists
+ class MoveService
+ def initialize(project, params = {})
+ @board = project.board
+ @params = params.dup
+ end
+
+ def execute
+ return false if new_position.blank?
+ return false if new_position == old_position
+
+ list.with_lock do
+ reorder_intermediate_lists
+ update_list_position
+ end
+ end
+
+ private
+
+ attr_reader :board, :params
+
+ def list
+ @list ||= board.lists.find(params[:list_id])
+ end
+
+ def old_position
+ @old_position ||= list.position
+ end
+
+ def new_position
+ @new_position ||= params[:position]
+ end
+
+ def reorder_intermediate_lists
+ if old_position < new_position
+ board.lists.where('position > ?', old_position)
+ .where('position <= ?', new_position)
+ .update_all('position = position - 1')
+ else
+ board.lists.where('position >= ?', new_position)
+ .where('position < ?', old_position)
+ .update_all('position = position + 1')
+ end
+ end
+
+ def update_list_position
+ list.update_attribute(:position, new_position)
+ end
+ end
+ end
+end