Welcome to mirror list, hosted at ThFree Co, Russian Federation.

resolves_merge_requests.rb « concerns « resolvers « graphql « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: a2140728a2740e3c986d0daf4462e06b6a746e84 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# frozen_string_literal: true

# Mixin for resolving merge requests. All arguments must be in forms
# that `MergeRequestsFinder` can handle, so you may need to use aliasing.
module ResolvesMergeRequests
  extend ActiveSupport::Concern
  include LooksAhead

  included do
    type Types::MergeRequestType, null: true
  end

  def resolve_with_lookahead(**args)
    args[:iids] = Array.wrap(args[:iids]) if args[:iids]
    args.compact!

    if project && args.keys == [:iids]
      batch_load_merge_requests(args[:iids])
    else
      args[:project_id] ||= project

      apply_lookahead(MergeRequestsFinder.new(current_user, args).execute)
    end.then(&(single? ? :first : :itself))
  end

  def ready?(**args)
    return early_return if no_results_possible?(args)

    super
  end

  def early_return
    [false, single? ? nil : MergeRequest.none]
  end

  private

  def batch_load_merge_requests(iids)
    iids.map { |iid| batch_load(iid) }.select(&:itself) # .compact doesn't work on BatchLoader
  end

  # rubocop: disable CodeReuse/ActiveRecord
  def batch_load(iid)
    BatchLoader::GraphQL.for(iid.to_s).batch(key: project) do |iids, loader, args|
      query = args[:key].merge_requests.where(iid: iids)

      apply_lookahead(query).each do |mr|
        loader.call(mr.iid.to_s, mr)
      end
    end
  end
  # rubocop: enable CodeReuse/ActiveRecord

  def unconditional_includes
    [:target_project]
  end

  def preloads
    {
      assignees: [:assignees],
      labels: [:labels],
      author: [:author],
      milestone: [:milestone],
      head_pipeline: [:merge_request_diff, { head_pipeline: [:merge_request] }]
    }
  end
end