diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-27 09:08:13 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-27 09:08:13 +0300 |
commit | 5c763ac4c62bdeb0f0fe26f710c0a7a91921a949 (patch) | |
tree | b267d888cb2e4aee67f172e4c447071124df170d /app/services/discussions/resolve_service.rb | |
parent | ae5e7e4855d32353b371d8eb774a12e1f07a1070 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/services/discussions/resolve_service.rb')
-rw-r--r-- | app/services/discussions/resolve_service.rb | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/app/services/discussions/resolve_service.rb b/app/services/discussions/resolve_service.rb index 816cd45b07a..3aa6245b54d 100644 --- a/app/services/discussions/resolve_service.rb +++ b/app/services/discussions/resolve_service.rb @@ -2,8 +2,34 @@ 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] + + raise ArgumentError, 'Discussions must be all for the same noteable' \ + unless noteable_is_same? + + super + end + + def execute + discussions.each(&method(:resolve_discussion)) + 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) @@ -11,16 +37,18 @@ module Discussions discussion.resolve!(current_user) - 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 merge_request - params[:merge_request] + def first_discussion + @first_discussion ||= discussions.first end - def follow_up_issue - params[:follow_up_issue] + def merge_request + strong_memoize(:merge_request) do + first_discussion.noteable if first_discussion.for_merge_request? + end end end end |