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/admin/analytics/usage_trends/measurements_resolver.rb (renamed from app/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver.rb)8
-rw-r--r--app/graphql/resolvers/alert_management/alert_resolver.rb3
-rw-r--r--app/graphql/resolvers/alert_management/http_integrations_resolver.rb23
-rw-r--r--app/graphql/resolvers/base_resolver.rb11
-rw-r--r--app/graphql/resolvers/board_lists_resolver.rb2
-rw-r--r--app/graphql/resolvers/board_resolver.rb2
-rw-r--r--app/graphql/resolvers/boards_resolver.rb2
-rw-r--r--app/graphql/resolvers/branch_commit_resolver.rb11
-rw-r--r--app/graphql/resolvers/ci/config_resolver.rb2
-rw-r--r--app/graphql/resolvers/concerns/resolves_snippets.rb2
-rw-r--r--app/graphql/resolvers/full_path_resolver.rb2
-rw-r--r--app/graphql/resolvers/group_packages_resolver.rb27
-rw-r--r--app/graphql/resolvers/last_commit_resolver.rb2
-rw-r--r--app/graphql/resolvers/metrics/dashboard_resolver.rb21
-rw-r--r--app/graphql/resolvers/namespace_projects_resolver.rb35
-rw-r--r--app/graphql/resolvers/project_merge_requests_resolver.rb2
-rw-r--r--app/graphql/resolvers/project_packages_resolver.rb (renamed from app/graphql/resolvers/packages_resolver.rb)2
-rw-r--r--app/graphql/resolvers/project_pipeline_resolver.rb32
-rw-r--r--app/graphql/resolvers/snippets/blobs_resolver.rb1
-rw-r--r--app/graphql/resolvers/tree_resolver.rb2
20 files changed, 153 insertions, 39 deletions
diff --git a/app/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver.rb b/app/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver.rb
index 9df07df24d8..a5f81149d4e 100644
--- a/app/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver.rb
+++ b/app/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver.rb
@@ -3,13 +3,13 @@
module Resolvers
module Admin
module Analytics
- module InstanceStatistics
+ module UsageTrends
class MeasurementsResolver < BaseResolver
include Gitlab::Graphql::Authorize::AuthorizeResource
- type Types::Admin::Analytics::InstanceStatistics::MeasurementType, null: true
+ type Types::Admin::Analytics::UsageTrends::MeasurementType, null: true
- argument :identifier, Types::Admin::Analytics::InstanceStatistics::MeasurementIdentifierEnum,
+ argument :identifier, Types::Admin::Analytics::UsageTrends::MeasurementIdentifierEnum,
required: true,
description: 'The type of measurement/statistics to retrieve.'
@@ -24,7 +24,7 @@ module Resolvers
def resolve(identifier:, recorded_before: nil, recorded_after: nil)
authorize!
- ::Analytics::InstanceStatistics::Measurement
+ ::Analytics::UsageTrends::Measurement
.recorded_after(recorded_after)
.recorded_before(recorded_before)
.with_identifier(identifier)
diff --git a/app/graphql/resolvers/alert_management/alert_resolver.rb b/app/graphql/resolvers/alert_management/alert_resolver.rb
index d60cabde62b..008641ed88a 100644
--- a/app/graphql/resolvers/alert_management/alert_resolver.rb
+++ b/app/graphql/resolvers/alert_management/alert_resolver.rb
@@ -43,7 +43,8 @@ module Resolvers
def preloads
{
assignees: [:assignees],
- notes: [:ordered_notes, { ordered_notes: [:system_note_metadata, :project, :noteable] }]
+ notes: [:ordered_notes, { ordered_notes: [:system_note_metadata, :project, :noteable] }],
+ issue: [:issue]
}
end
end
diff --git a/app/graphql/resolvers/alert_management/http_integrations_resolver.rb b/app/graphql/resolvers/alert_management/http_integrations_resolver.rb
new file mode 100644
index 00000000000..94a72bca7c7
--- /dev/null
+++ b/app/graphql/resolvers/alert_management/http_integrations_resolver.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Resolvers
+ module AlertManagement
+ class HttpIntegrationsResolver < BaseResolver
+ alias_method :project, :synchronized_object
+
+ type Types::AlertManagement::HttpIntegrationType.connection_type, null: true
+
+ def resolve(**args)
+ http_integrations
+ end
+
+ private
+
+ def http_integrations
+ return [] unless Ability.allowed?(current_user, :admin_operations, project)
+
+ ::AlertManagement::HttpIntegrationsFinder.new(project, {}).execute
+ end
+ end
+ end
+end
diff --git a/app/graphql/resolvers/base_resolver.rb b/app/graphql/resolvers/base_resolver.rb
index 5db618254cb..67bba079512 100644
--- a/app/graphql/resolvers/base_resolver.rb
+++ b/app/graphql/resolvers/base_resolver.rb
@@ -12,8 +12,17 @@ module Resolvers
@requires_argument = true
end
+ def self.calls_gitaly!
+ @calls_gitaly = true
+ end
+
def self.field_options
- super.merge(requires_argument: @requires_argument)
+ extra_options = {
+ requires_argument: @requires_argument,
+ calls_gitaly: @calls_gitaly
+ }.compact
+
+ super.merge(extra_options)
end
def self.singular_type
diff --git a/app/graphql/resolvers/board_lists_resolver.rb b/app/graphql/resolvers/board_lists_resolver.rb
index a97ac3220d5..e66f7b97b40 100644
--- a/app/graphql/resolvers/board_lists_resolver.rb
+++ b/app/graphql/resolvers/board_lists_resolver.rb
@@ -9,7 +9,7 @@ module Resolvers
type Types::BoardListType, null: true
extras [:lookahead]
- authorize :read_list
+ authorize :read_issue_board_list
argument :id, Types::GlobalIDType[List],
required: false,
diff --git a/app/graphql/resolvers/board_resolver.rb b/app/graphql/resolvers/board_resolver.rb
index 2c2922c3fbf..637d690e4cd 100644
--- a/app/graphql/resolvers/board_resolver.rb
+++ b/app/graphql/resolvers/board_resolver.rb
@@ -13,7 +13,7 @@ module Resolvers
def resolve(id: nil)
return unless parent
- ::Boards::ListService.new(parent, context[:current_user], board_id: extract_board_id(id)).execute.first
+ ::Boards::BoardsFinder.new(parent, context[:current_user], board_id: extract_board_id(id)).execute.first
rescue ActiveRecord::RecordNotFound
nil
end
diff --git a/app/graphql/resolvers/boards_resolver.rb b/app/graphql/resolvers/boards_resolver.rb
index be2f22175dc..679f2b4cceb 100644
--- a/app/graphql/resolvers/boards_resolver.rb
+++ b/app/graphql/resolvers/boards_resolver.rb
@@ -16,7 +16,7 @@ module Resolvers
return Board.none unless parent
- ::Boards::ListService.new(parent, context[:current_user], board_id: extract_board_id(id)).execute
+ ::Boards::BoardsFinder.new(parent, context[:current_user], board_id: extract_board_id(id)).execute
rescue ActiveRecord::RecordNotFound
Board.none
end
diff --git a/app/graphql/resolvers/branch_commit_resolver.rb b/app/graphql/resolvers/branch_commit_resolver.rb
index 11c49e17bc5..ba235251950 100644
--- a/app/graphql/resolvers/branch_commit_resolver.rb
+++ b/app/graphql/resolvers/branch_commit_resolver.rb
@@ -7,11 +7,16 @@ module Resolvers
alias_method :branch, :object
def resolve(**args)
- return unless branch
+ commit = branch&.dereferenced_target
+ return unless commit
- commit = branch.dereferenced_target
+ lazy_project = BatchLoader::GraphQL.for(commit.repository.gl_project_path).batch do |paths, loader|
+ paths.each { |path| loader.call(path, Project.find_by_full_path(path)) }
+ end
- ::Commit.new(commit, context[:branch_project]) if commit
+ ::Gitlab::Graphql::Lazy.with_value(lazy_project) do |project|
+ ::Commit.new(commit, project) if project
+ end
end
end
end
diff --git a/app/graphql/resolvers/ci/config_resolver.rb b/app/graphql/resolvers/ci/config_resolver.rb
index 852bb47e215..f8670649e48 100644
--- a/app/graphql/resolvers/ci/config_resolver.rb
+++ b/app/graphql/resolvers/ci/config_resolver.rb
@@ -16,7 +16,7 @@ module Resolvers
argument :content, GraphQL::STRING_TYPE,
required: true,
- description: "Contents of '.gitlab-ci.yml'."
+ description: "Contents of `.gitlab-ci.yml`."
argument :dry_run, GraphQL::BOOLEAN_TYPE,
required: false,
diff --git a/app/graphql/resolvers/concerns/resolves_snippets.rb b/app/graphql/resolvers/concerns/resolves_snippets.rb
index 0bc38188b9a..445f3567b1d 100644
--- a/app/graphql/resolvers/concerns/resolves_snippets.rb
+++ b/app/graphql/resolvers/concerns/resolves_snippets.rb
@@ -8,7 +8,7 @@ module ResolvesSnippets
argument :ids, [::Types::GlobalIDType[::Snippet]],
required: false,
- description: 'Array of global snippet ids, e.g., "gid://gitlab/ProjectSnippet/1".'
+ description: 'Array of global snippet IDs. For example, `gid://gitlab/ProjectSnippet/1`.'
argument :visibility, Types::Snippets::VisibilityScopesEnum,
required: false,
diff --git a/app/graphql/resolvers/full_path_resolver.rb b/app/graphql/resolvers/full_path_resolver.rb
index d01cdf749a1..b5e90da78b2 100644
--- a/app/graphql/resolvers/full_path_resolver.rb
+++ b/app/graphql/resolvers/full_path_resolver.rb
@@ -7,7 +7,7 @@ module Resolvers
prepended do
argument :full_path, GraphQL::ID_TYPE,
required: true,
- description: 'The full path of the project, group or namespace, e.g., "gitlab-org/gitlab-foss".'
+ description: 'The full path of the project, group or namespace, e.g., `gitlab-org/gitlab-foss`.'
end
def model_by_full_path(model, full_path)
diff --git a/app/graphql/resolvers/group_packages_resolver.rb b/app/graphql/resolvers/group_packages_resolver.rb
new file mode 100644
index 00000000000..d441cd80249
--- /dev/null
+++ b/app/graphql/resolvers/group_packages_resolver.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class GroupPackagesResolver < BaseResolver
+ type Types::Packages::PackageType.connection_type, null: true
+
+ def ready?(**args)
+ context[self.class] ||= { executions: 0 }
+ context[self.class][:executions] += 1
+ raise GraphQL::ExecutionError, "Packages can be requested only for one group at a time" if context[self.class][:executions] > 1
+
+ super
+ end
+
+ def resolve(**args)
+ return unless packages_available?
+
+ ::Packages::GroupPackagesFinder.new(current_user, object).execute
+ end
+
+ private
+
+ def packages_available?
+ ::Gitlab.config.packages.enabled
+ end
+ end
+end
diff --git a/app/graphql/resolvers/last_commit_resolver.rb b/app/graphql/resolvers/last_commit_resolver.rb
index dd89c322617..00c43bdfee6 100644
--- a/app/graphql/resolvers/last_commit_resolver.rb
+++ b/app/graphql/resolvers/last_commit_resolver.rb
@@ -4,6 +4,8 @@ module Resolvers
class LastCommitResolver < BaseResolver
type Types::CommitType, null: true
+ calls_gitaly!
+
alias_method :tree, :object
def resolve(**args)
diff --git a/app/graphql/resolvers/metrics/dashboard_resolver.rb b/app/graphql/resolvers/metrics/dashboard_resolver.rb
index f569cb0b2c3..a82a4a95254 100644
--- a/app/graphql/resolvers/metrics/dashboard_resolver.rb
+++ b/app/graphql/resolvers/metrics/dashboard_resolver.rb
@@ -3,19 +3,30 @@
module Resolvers
module Metrics
class DashboardResolver < Resolvers::BaseResolver
+ type Types::Metrics::DashboardType, null: true
+ calls_gitaly!
+
argument :path, GraphQL::STRING_TYPE,
required: true,
- description: "Path to a file which defines metrics dashboard eg: 'config/prometheus/common_metrics.yml'."
-
- type Types::Metrics::DashboardType, null: true
+ description: "Path to a file which defines metrics dashboard " \
+ "eg: 'config/prometheus/common_metrics.yml'."
alias_method :environment, :object
def resolve(**args)
return unless environment
- ::PerformanceMonitoring::PrometheusDashboard
- .find_for(project: environment.project, user: context[:current_user], path: args[:path], options: { environment: environment })
+ ::PerformanceMonitoring::PrometheusDashboard.find_for(**args, **service_params)
+ end
+
+ private
+
+ def service_params
+ {
+ project: environment.project,
+ user: current_user,
+ options: { environment: environment }
+ }
end
end
end
diff --git a/app/graphql/resolvers/namespace_projects_resolver.rb b/app/graphql/resolvers/namespace_projects_resolver.rb
index da44b9b5623..7320c3ce141 100644
--- a/app/graphql/resolvers/namespace_projects_resolver.rb
+++ b/app/graphql/resolvers/namespace_projects_resolver.rb
@@ -17,23 +17,23 @@ module Resolvers
default_value: nil,
description: 'Sort projects by this criteria.'
+ argument :ids, [GraphQL::ID_TYPE],
+ required: false,
+ default_value: nil,
+ description: 'Filter projects by IDs.'
+
type Types::ProjectType, null: true
- def resolve(include_subgroups:, sort:, search:)
+ def resolve(args)
# The namespace could have been loaded in batch by `BatchLoader`.
# At this point we need the `id` or the `full_path` of the namespace
# to query for projects, so make sure it's loaded and not `nil` before continuing.
- return Project.none if namespace.nil?
-
- query = include_subgroups ? namespace.all_projects.with_route : namespace.projects.with_route
- return query unless search.present?
-
- if sort == :similarity
- query.sorted_by_similarity_desc(search, include_in_select: true).merge(Project.search(search))
- else
- query.merge(Project.search(search))
- end
+ ::Namespaces::ProjectsFinder.new(
+ namespace: namespace,
+ current_user: current_user,
+ params: finder_params(args)
+ ).execute
end
def self.resolver_complexity(args, child_complexity:)
@@ -48,6 +48,19 @@ module Resolvers
object.respond_to?(:sync) ? object.sync : object
end
end
+
+ def finder_params(args)
+ {
+ include_subgroups: args.dig(:include_subgroups),
+ sort: args.dig(:sort),
+ search: args.dig(:search),
+ ids: parse_gids(args.dig(:ids))
+ }
+ end
+
+ def parse_gids(gids)
+ gids&.map { |gid| GitlabSchema.parse_gid(gid, expected_type: ::Project).model_id }
+ end
end
end
diff --git a/app/graphql/resolvers/project_merge_requests_resolver.rb b/app/graphql/resolvers/project_merge_requests_resolver.rb
index 9628a6dfd7a..66c020a0c14 100644
--- a/app/graphql/resolvers/project_merge_requests_resolver.rb
+++ b/app/graphql/resolvers/project_merge_requests_resolver.rb
@@ -10,7 +10,7 @@ module Resolvers
def resolve(**args)
scope = super
- if only_count_is_selected_with_merged_at_filter?(args) && Feature.enabled?(:optimized_merge_request_count_with_merged_at_filter, default_enabled: :yaml)
+ if only_count_is_selected_with_merged_at_filter?(args)
MergeRequest::MetricsFinder
.new(current_user, args.merge(target_project: project))
.execute
diff --git a/app/graphql/resolvers/packages_resolver.rb b/app/graphql/resolvers/project_packages_resolver.rb
index 3eeed48ff7e..288e14b41d0 100644
--- a/app/graphql/resolvers/packages_resolver.rb
+++ b/app/graphql/resolvers/project_packages_resolver.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module Resolvers
- class PackagesResolver < BaseResolver
+ class ProjectPackagesResolver < BaseResolver
type Types::Packages::PackageType.connection_type, null: true
def resolve(**args)
diff --git a/app/graphql/resolvers/project_pipeline_resolver.rb b/app/graphql/resolvers/project_pipeline_resolver.rb
index b604a408928..8fca6b829c0 100644
--- a/app/graphql/resolvers/project_pipeline_resolver.rb
+++ b/app/graphql/resolvers/project_pipeline_resolver.rb
@@ -7,14 +7,34 @@ module Resolvers
alias_method :project, :object
argument :iid, GraphQL::ID_TYPE,
- required: true,
- description: 'IID of the Pipeline, e.g., "1".'
+ required: false,
+ description: 'IID of the Pipeline. For example, "1".'
- def resolve(iid:)
- BatchLoader::GraphQL.for(iid).batch(key: project) do |iids, loader, args|
- finder = ::Ci::PipelinesFinder.new(project, context[:current_user], iids: iids)
+ argument :sha, GraphQL::STRING_TYPE,
+ required: false,
+ description: 'SHA of the Pipeline. For example, "dyd0f15ay83993f5ab66k927w28673882x99100b".'
- finder.execute.each { |pipeline| loader.call(pipeline.iid.to_s, pipeline) }
+ def ready?(iid: nil, sha: nil)
+ unless iid.present? ^ sha.present?
+ raise Gitlab::Graphql::Errors::ArgumentError, 'Provide one of an IID or SHA'
+ end
+
+ super
+ end
+
+ def resolve(iid: nil, sha: nil)
+ if iid
+ BatchLoader::GraphQL.for(iid).batch(key: project) do |iids, loader, args|
+ finder = ::Ci::PipelinesFinder.new(project, current_user, iids: iids)
+
+ finder.execute.each { |pipeline| loader.call(pipeline.iid.to_s, pipeline) }
+ end
+ else
+ BatchLoader::GraphQL.for(sha).batch(key: project) do |shas, loader, args|
+ finder = ::Ci::PipelinesFinder.new(project, current_user, shas: shas)
+
+ finder.execute.each { |pipeline| loader.call(pipeline.sha.to_s, pipeline) }
+ end
end
end
end
diff --git a/app/graphql/resolvers/snippets/blobs_resolver.rb b/app/graphql/resolvers/snippets/blobs_resolver.rb
index 672214df7d5..569b82149d3 100644
--- a/app/graphql/resolvers/snippets/blobs_resolver.rb
+++ b/app/graphql/resolvers/snippets/blobs_resolver.rb
@@ -8,6 +8,7 @@ module Resolvers
type Types::Snippets::BlobType.connection_type, null: true
authorize :read_snippet
+ calls_gitaly!
alias_method :snippet, :object
diff --git a/app/graphql/resolvers/tree_resolver.rb b/app/graphql/resolvers/tree_resolver.rb
index 7a70c35897d..c07d9187d4d 100644
--- a/app/graphql/resolvers/tree_resolver.rb
+++ b/app/graphql/resolvers/tree_resolver.rb
@@ -4,6 +4,8 @@ module Resolvers
class TreeResolver < BaseResolver
type Types::Tree::TreeType, null: true
+ calls_gitaly!
+
argument :path, GraphQL::STRING_TYPE,
required: false,
default_value: '',