diff options
Diffstat (limited to 'app/services/issuable/bulk_update_service.rb')
-rw-r--r-- | app/services/issuable/bulk_update_service.rb | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/app/services/issuable/bulk_update_service.rb b/app/services/issuable/bulk_update_service.rb index 30444fa3938..c01509bc4d1 100644 --- a/app/services/issuable/bulk_update_service.rb +++ b/app/services/issuable/bulk_update_service.rb @@ -13,9 +13,9 @@ module Issuable end def execute(type) - ids = params.delete(:issuable_ids).split(",") + model_ids = ids_from_params(params.delete(:issuable_ids)) set_update_params(type) - updated_issuables = update_issuables(type, ids) + updated_issuables = update_issuables(type, model_ids) if updated_issuables.present? && requires_count_cache_reset?(type) schedule_group_issues_count_reset(updated_issuables) @@ -28,9 +28,14 @@ module Issuable private + def ids_from_params(issuable_ids) + return issuable_ids if issuable_ids.is_a?(Array) + + issuable_ids.split(',') + end + def set_update_params(type) params.slice!(*permitted_attrs(type)) - params.delete_if { |k, v| v.blank? } if params[:assignee_ids] == [IssuableFinder::Params::NONE.to_s] params[:assignee_ids] = [] @@ -40,8 +45,6 @@ module Issuable def permitted_attrs(type) attrs = %i(state_event milestone_id add_label_ids remove_label_ids subscription_event) - attrs.push(:sprint_id) if type == 'issue' - if type == 'issue' || type == 'merge_request' attrs.push(:assignee_ids) else @@ -53,10 +56,12 @@ module Issuable model_class = type.classify.constantize update_class = type.classify.pluralize.constantize::UpdateService items = find_issuables(parent, model_class, ids) + authorized_issuables = [] items.each do |issuable| next unless can?(current_user, :"update_#{type}", issuable) + authorized_issuables << issuable update_class.new( **update_class.constructor_container_arg(issuable.issuing_parent), current_user: current_user, @@ -64,23 +69,22 @@ module Issuable ).execute(issuable) end - items + authorized_issuables end def find_issuables(parent, model_class, ids) + issuables = model_class.id_in(ids) + case parent when Project - projects = parent + issuables = issuables.of_projects(parent) when Group - projects = parent.all_projects + issuables = issuables.of_projects(parent.all_projects) else - return + raise ArgumentError, _('A parent must be provided when bulk updating issuables') end - model_class - .id_in(ids) - .of_projects(projects) - .includes_for_bulk_update + issuables.includes_for_bulk_update end # Duplicates params and its top-level values |