From 8c7f4e9d5f36cff46365a7f8c4b9c21578c1e781 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 18 Jun 2020 11:18:50 +0000 Subject: Add latest changes from gitlab-org/gitlab@13-1-stable-ee --- app/services/discussions/resolve_service.rb | 55 +++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 6 deletions(-) (limited to 'app/services/discussions') diff --git a/app/services/discussions/resolve_service.rb b/app/services/discussions/resolve_service.rb index 816cd45b07a..946fb5f1372 100644 --- a/app/services/discussions/resolve_service.rb +++ b/app/services/discussions/resolve_service.rb @@ -2,25 +2,68 @@ module Discussions class ResolveService < Discussions::BaseService - def execute(one_or_more_discussions) - Array(one_or_more_discussions).each { |discussion| resolve_discussion(discussion) } + include Gitlab::Utils::StrongMemoize + + def initialize(project, user = nil, params = {}) + @discussions = Array.wrap(params.fetch(:one_or_more_discussions)) + @follow_up_issue = params[:follow_up_issue] + @resolved_count = 0 + + raise ArgumentError, 'Discussions must be all for the same noteable' \ + unless noteable_is_same? + + super + end + + def execute + discussions.each(&method(:resolve_discussion)) + process_auto_merge + end + + private + + attr_accessor :discussions, :follow_up_issue + + def noteable_is_same? + return true unless discussions.size > 1 + + # Perform this check without fetching extra records + discussions.all? do |discussion| + discussion.noteable_type == first_discussion.noteable_type && + discussion.noteable_id == first_discussion.noteable_id + end end def resolve_discussion(discussion) return unless discussion.can_resolve?(current_user) discussion.resolve!(current_user) + @resolved_count += 1 - MergeRequests::ResolvedDiscussionNotificationService.new(project, current_user).execute(merge_request) + MergeRequests::ResolvedDiscussionNotificationService.new(project, current_user).execute(merge_request) if merge_request SystemNoteService.discussion_continued_in_issue(discussion, project, current_user, follow_up_issue) if follow_up_issue end + def first_discussion + @first_discussion ||= discussions.first + end + def merge_request - params[:merge_request] + strong_memoize(:merge_request) do + first_discussion.noteable if first_discussion.for_merge_request? + end + end + + def process_auto_merge + return unless merge_request + return unless @resolved_count.positive? + return unless discussions_ready_to_merge? + + AutoMergeProcessWorker.perform_async(merge_request.id) end - def follow_up_issue - params[:follow_up_issue] + def discussions_ready_to_merge? + merge_request.auto_merge_enabled? && merge_request.mergeable_discussions_state? end end end -- cgit v1.2.3