diff options
author | Douglas Barbosa Alexandre <dbalexandre@gmail.com> | 2016-07-28 02:33:22 +0300 |
---|---|---|
committer | Douglas Barbosa Alexandre <dbalexandre@gmail.com> | 2016-08-17 18:58:57 +0300 |
commit | 279361fa16c52011ee0f565c79a47012fad9b03f (patch) | |
tree | 309f93bd1073a2f3307c2fd1f6d14ef4ea03ee63 /app/services | |
parent | 247e11c94865b429c400fd9f0d1730c13b0b0c35 (diff) |
Add service to move board lists
Diffstat (limited to 'app/services')
-rw-r--r-- | app/services/boards/lists/move_service.rb | 52 |
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 |