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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/graphql/resolvers')
-rw-r--r--app/graphql/resolvers/base_issues_resolver.rb2
-rw-r--r--app/graphql/resolvers/bulk_labels_resolver.rb27
-rw-r--r--app/graphql/resolvers/ci/all_jobs_resolver.rb17
-rw-r--r--app/graphql/resolvers/ci/runner_projects_resolver.rb4
-rw-r--r--app/graphql/resolvers/concerns/looks_ahead.rb27
-rw-r--r--app/graphql/resolvers/concerns/resolves_merge_requests.rb4
-rw-r--r--app/graphql/resolvers/down_votes_count_resolver.rb15
-rw-r--r--app/graphql/resolvers/project_pipeline_schedules_resolver.rb17
-rw-r--r--app/graphql/resolvers/projects/branch_rules_resolver.rb8
-rw-r--r--app/graphql/resolvers/projects_resolver.rb4
-rw-r--r--app/graphql/resolvers/up_votes_count_resolver.rb15
-rw-r--r--app/graphql/resolvers/work_items_resolver.rb26
12 files changed, 144 insertions, 22 deletions
diff --git a/app/graphql/resolvers/base_issues_resolver.rb b/app/graphql/resolvers/base_issues_resolver.rb
index ec47a8996eb..6357132705e 100644
--- a/app/graphql/resolvers/base_issues_resolver.rb
+++ b/app/graphql/resolvers/base_issues_resolver.rb
@@ -47,8 +47,8 @@ module Resolvers
def preloads
{
alert_management_alert: [:alert_management_alert],
- labels: [:labels],
assignees: [:assignees],
+ participants: Issue.participant_includes,
timelogs: [:timelogs],
customer_relations_contacts: { customer_relations_contacts: [:group] },
escalation_status: [:incident_management_issuable_escalation_status]
diff --git a/app/graphql/resolvers/bulk_labels_resolver.rb b/app/graphql/resolvers/bulk_labels_resolver.rb
new file mode 100644
index 00000000000..7362e257fb6
--- /dev/null
+++ b/app/graphql/resolvers/bulk_labels_resolver.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class BulkLabelsResolver < BaseResolver
+ include Gitlab::Graphql::Authorize::AuthorizeResource
+
+ type Types::LabelType.connection_type, null: true
+
+ def resolve
+ authorize!(object)
+
+ BatchLoader::GraphQL.for(object.id).batch(cache: false) do |ids, loader, args|
+ labels = Label.for_targets(object.class.id_in(ids)).group_by(&:target_id)
+
+ ids.each do |id|
+ loader.call(id, labels[id] || [])
+ end
+ end
+ end
+
+ private
+
+ def authorized_resource?(object)
+ Ability.allowed?(current_user, :read_label, object.issuing_parent)
+ end
+ end
+end
diff --git a/app/graphql/resolvers/ci/all_jobs_resolver.rb b/app/graphql/resolvers/ci/all_jobs_resolver.rb
new file mode 100644
index 00000000000..d918bed9f57
--- /dev/null
+++ b/app/graphql/resolvers/ci/all_jobs_resolver.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Resolvers
+ module Ci
+ class AllJobsResolver < BaseResolver
+ type ::Types::Ci::JobType.connection_type, null: true
+
+ argument :statuses, [::Types::Ci::JobStatusEnum],
+ required: false,
+ description: 'Filter jobs by status.'
+
+ def resolve(statuses: nil)
+ ::Ci::JobsFinder.new(current_user: current_user, params: { scope: statuses }).execute
+ end
+ end
+ end
+end
diff --git a/app/graphql/resolvers/ci/runner_projects_resolver.rb b/app/graphql/resolvers/ci/runner_projects_resolver.rb
index ca3b4ebb797..af9a67acfda 100644
--- a/app/graphql/resolvers/ci/runner_projects_resolver.rb
+++ b/app/graphql/resolvers/ci/runner_projects_resolver.rb
@@ -21,8 +21,8 @@ module Resolvers
'Specify `"id_asc"` if query results\' order is important',
milestone: '15.4'
},
- description: "Sort order of results. Format: '<field_name>_<sort_direction>', " \
- "for example: 'id_desc' or 'name_asc'"
+ description: "Sort order of results. Format: `<field_name>_<sort_direction>`, " \
+ "for example: `id_desc` or `name_asc`"
def resolve_with_lookahead(**args)
return unless runner.project_type?
diff --git a/app/graphql/resolvers/concerns/looks_ahead.rb b/app/graphql/resolvers/concerns/looks_ahead.rb
index b548dc1e175..81099c04e9f 100644
--- a/app/graphql/resolvers/concerns/looks_ahead.rb
+++ b/app/graphql/resolvers/concerns/looks_ahead.rb
@@ -32,16 +32,37 @@ module LooksAhead
{}
end
+ def nested_preloads
+ {}
+ end
+
def filtered_preloads
nodes = node_selection
return [] unless nodes
selected_fields = nodes.selections.map(&:name)
+ root_level_preloads = preloads_from_node_selection(selected_fields, preloads)
- preloads.each.flat_map do |name, requirements|
- selected_fields.include?(name) ? requirements : []
- end
+ root_level_preloads + nested_filtered_preloads(nodes, selected_fields)
+ end
+
+ def nested_filtered_preloads(nodes, selected_root_fields)
+ return [] if nested_preloads.empty?
+
+ nested_preloads.each_with_object([]) do |(root_field, fields), result|
+ next unless selected_root_fields.include?(root_field)
+
+ selected_fields = nodes.selection(root_field).selections.map(&:name)
+
+ result << preloads_from_node_selection(selected_fields, fields)
+ end.flatten
+ end
+
+ def preloads_from_node_selection(selected_fields, fields)
+ fields.each_with_object([]) do |(field, requirements), result|
+ result << requirements if selected_fields.include?(field)
+ end.flatten
end
def node_selection
diff --git a/app/graphql/resolvers/concerns/resolves_merge_requests.rb b/app/graphql/resolvers/concerns/resolves_merge_requests.rb
index 697cc6f5b03..d56951bc821 100644
--- a/app/graphql/resolvers/concerns/resolves_merge_requests.rb
+++ b/app/graphql/resolvers/concerns/resolves_merge_requests.rb
@@ -42,7 +42,6 @@ module ResolvesMergeRequests
assignees: [:assignees],
reviewers: [:reviewers],
participants: MergeRequest.participant_includes,
- labels: [:labels],
author: [:author],
merged_at: [:metrics],
commit_count: [:metrics],
@@ -53,7 +52,8 @@ module ResolvesMergeRequests
head_pipeline: [:merge_request_diff, { head_pipeline: [:merge_request] }],
timelogs: [:timelogs],
pipelines: [:merge_request_diffs], # used by `recent_diff_head_shas` to load pipelines
- committers: [merge_request_diff: [:merge_request_diff_commits]]
+ committers: [merge_request_diff: [:merge_request_diff_commits]],
+ suggested_reviewers: [:predictions]
}
end
end
diff --git a/app/graphql/resolvers/down_votes_count_resolver.rb b/app/graphql/resolvers/down_votes_count_resolver.rb
new file mode 100644
index 00000000000..0e7772f988a
--- /dev/null
+++ b/app/graphql/resolvers/down_votes_count_resolver.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class DownVotesCountResolver < BaseResolver
+ include Gitlab::Graphql::Authorize::AuthorizeResource
+ include BatchLoaders::AwardEmojiVotesBatchLoader
+
+ type GraphQL::Types::Int, null: true
+
+ def resolve
+ authorize!(object)
+ load_votes(object, AwardEmoji::DOWNVOTE_NAME)
+ end
+ end
+end
diff --git a/app/graphql/resolvers/project_pipeline_schedules_resolver.rb b/app/graphql/resolvers/project_pipeline_schedules_resolver.rb
new file mode 100644
index 00000000000..eb980f72717
--- /dev/null
+++ b/app/graphql/resolvers/project_pipeline_schedules_resolver.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class ProjectPipelineSchedulesResolver < BaseResolver
+ alias_method :project, :object
+
+ type ::Types::Ci::PipelineScheduleType.connection_type, null: true
+
+ argument :status, ::Types::Ci::PipelineScheduleStatusEnum,
+ required: false,
+ description: 'Filter pipeline schedules by active status.'
+
+ def resolve(status: nil)
+ ::Ci::PipelineSchedulesFinder.new(project).execute(scope: status)
+ end
+ end
+end
diff --git a/app/graphql/resolvers/projects/branch_rules_resolver.rb b/app/graphql/resolvers/projects/branch_rules_resolver.rb
index 6c8b416bcea..e99d7ae4d5f 100644
--- a/app/graphql/resolvers/projects/branch_rules_resolver.rb
+++ b/app/graphql/resolvers/projects/branch_rules_resolver.rb
@@ -3,13 +3,17 @@
module Resolvers
module Projects
class BranchRulesResolver < BaseResolver
+ include LooksAhead
+
type Types::Projects::BranchRuleType.connection_type, null: false
alias_method :project, :object
- def resolve(**args)
- project.protected_branches
+ def resolve_with_lookahead(**args)
+ apply_lookahead(project.protected_branches)
end
end
end
end
+
+Resolvers::Projects::BranchRulesResolver.prepend_mod_with('Resolvers::Projects::BranchRulesResolver')
diff --git a/app/graphql/resolvers/projects_resolver.rb b/app/graphql/resolvers/projects_resolver.rb
index 4d1e1b867da..0bdba53c7af 100644
--- a/app/graphql/resolvers/projects_resolver.rb
+++ b/app/graphql/resolvers/projects_resolver.rb
@@ -12,8 +12,8 @@ module Resolvers
argument :sort, GraphQL::Types::String,
required: false,
- description: "Sort order of results. Format: '<field_name>_<sort_direction>', " \
- "for example: 'id_desc' or 'name_asc'"
+ description: "Sort order of results. Format: `<field_name>_<sort_direction>`, " \
+ "for example: `id_desc` or `name_asc`"
def resolve(**args)
ProjectsFinder
diff --git a/app/graphql/resolvers/up_votes_count_resolver.rb b/app/graphql/resolvers/up_votes_count_resolver.rb
new file mode 100644
index 00000000000..1c78facb694
--- /dev/null
+++ b/app/graphql/resolvers/up_votes_count_resolver.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class UpVotesCountResolver < BaseResolver
+ include Gitlab::Graphql::Authorize::AuthorizeResource
+ include BatchLoaders::AwardEmojiVotesBatchLoader
+
+ type GraphQL::Types::Int, null: true
+
+ def resolve
+ authorize!(object)
+ load_votes(object, AwardEmoji::UPVOTE_NAME)
+ end
+ end
+end
diff --git a/app/graphql/resolvers/work_items_resolver.rb b/app/graphql/resolvers/work_items_resolver.rb
index a8c0d363325..a4cbcc61ead 100644
--- a/app/graphql/resolvers/work_items_resolver.rb
+++ b/app/graphql/resolvers/work_items_resolver.rb
@@ -37,20 +37,26 @@ module Resolvers
def preloads
{
- last_edited_by: :last_edited_by,
- web_url: { project: { namespace: :route } }
+ work_item_type: :work_item_type,
+ web_url: { project: { namespace: :route } },
+ widgets: :work_item_type
}
end
- # Allows to apply lookahead for fields
- # selected from WidgetInterface
- override :node_selection
- def node_selection
- selected_fields = super
-
- return unless selected_fields
+ def nested_preloads
+ {
+ widgets: widget_preloads,
+ user_permissions: { update_work_item: :assignees }
+ }
+ end
- selected_fields.selection(:widgets)
+ def widget_preloads
+ {
+ last_edited_by: :last_edited_by,
+ assignees: :assignees,
+ parent: :work_item_parent,
+ labels: :labels
+ }
end
def unconditional_includes