summaryrefslogtreecommitdiff
path: root/app/services/issues
diff options
context:
space:
mode:
authorBrett Walker <bwalker@gitlab.com>2019-05-31 20:19:08 -0500
committerBrett Walker <bwalker@gitlab.com>2019-06-21 07:05:42 -0500
commit4a85e263b4afe2e1e64dcaf55856add6e7aed764 (patch)
tree91f9d823f7c1b3ecc45ae0b8c20bcd4bf8b69a42 /app/services/issues
parent6fa900547dbd30b0db0070f87dbeb4b05d485b9b (diff)
downloadgitlab-ce-4a85e263b4afe2e1e64dcaf55856add6e7aed764.tar.gz
Add reorder action to Project IssuesControllerbw-issue-reorder
to support manual sorting on the frontend
Diffstat (limited to 'app/services/issues')
-rw-r--r--app/services/issues/reorder_service.rb48
-rw-r--r--app/services/issues/update_service.rb1
2 files changed, 49 insertions, 0 deletions
diff --git a/app/services/issues/reorder_service.rb b/app/services/issues/reorder_service.rb
new file mode 100644
index 00000000000..02c18d31b5e
--- /dev/null
+++ b/app/services/issues/reorder_service.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module Issues
+ class ReorderService < Issues::BaseService
+ def execute(issue)
+ return false unless can?(current_user, :update_issue, issue)
+ return false if group && !can?(current_user, :read_group, group)
+
+ attrs = issue_params(group)
+ return false if attrs.empty?
+
+ update(issue, attrs)
+ end
+
+ private
+
+ def group
+ return unless params[:group_full_path]
+
+ @group ||= Group.find_by_full_path(params[:group_full_path])
+ end
+
+ def update(issue, attrs)
+ ::Issues::UpdateService.new(project, current_user, attrs).execute(issue)
+ rescue ActiveRecord::RecordNotFound
+ false
+ end
+
+ def issue_params(group)
+ attrs = {}
+
+ if move_between_ids
+ attrs[:move_between_ids] = move_between_ids
+ attrs[:board_group_id] = group&.id
+ end
+
+ attrs
+ end
+
+ def move_between_ids
+ ids = [params[:move_after_id], params[:move_before_id]]
+ .map(&:to_i)
+ .map { |m| m.positive? ? m : nil }
+
+ ids.any? ? ids : nil
+ end
+ end
+end
diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb
index cb2337d29d4..6b9f23f24cd 100644
--- a/app/services/issues/update_service.rb
+++ b/app/services/issues/update_service.rb
@@ -76,6 +76,7 @@ module Issues
issue_before = get_issue_if_allowed(before_id, board_group_id)
issue_after = get_issue_if_allowed(after_id, board_group_id)
+ raise ActiveRecord::RecordNotFound unless issue_before || issue_after
issue.move_between(issue_before, issue_after)
end