diff options
Diffstat (limited to 'app/services/issues/reorder_service.rb')
-rw-r--r-- | app/services/issues/reorder_service.rb | 48 |
1 files changed, 48 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 |