diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-03-16 18:18:33 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-03-16 18:18:33 +0000 |
commit | f64a639bcfa1fc2bc89ca7db268f594306edfd7c (patch) | |
tree | a2c3c2ebcc3b45e596949db485d6ed18ffaacfa1 /app/graphql/resolvers | |
parent | bfbc3e0d6583ea1a91f627528bedc3d65ba4b10f (diff) | |
download | gitlab-ce-f64a639bcfa1fc2bc89ca7db268f594306edfd7c.tar.gz |
Add latest changes from gitlab-org/gitlab@13-10-stable-eev13.10.0-rc40
Diffstat (limited to 'app/graphql/resolvers')
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: '', |