diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2024-01-16 13:42:19 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2024-01-16 13:42:19 +0300 |
commit | 84d1bd786125c1c14a3ba5f63e38a4cc736a9027 (patch) | |
tree | f550fa965f507077e20dbb6d61a8269a99ef7107 /app/graphql/resolvers | |
parent | 3a105e36e689f7b75482236712f1a47fd5a76814 (diff) |
Add latest changes from gitlab-org/gitlab@16-8-stable-eev16.8.0-rc42
Diffstat (limited to 'app/graphql/resolvers')
-rw-r--r-- | app/graphql/resolvers/ci/catalog/resources/versions_resolver.rb | 10 | ||||
-rw-r--r-- | app/graphql/resolvers/ci/runner_owner_project_resolver.rb | 2 | ||||
-rw-r--r-- | app/graphql/resolvers/ci/runner_projects_resolver.rb | 2 | ||||
-rw-r--r-- | app/graphql/resolvers/ci/runner_resolver.rb | 27 | ||||
-rw-r--r-- | app/graphql/resolvers/ci/runners_resolver.rb | 2 | ||||
-rw-r--r-- | app/graphql/resolvers/concerns/resolves_groups.rb | 28 | ||||
-rw-r--r-- | app/graphql/resolvers/container_repository_tags_resolver.rb | 8 | ||||
-rw-r--r-- | app/graphql/resolvers/full_path_resolver.rb | 6 | ||||
-rw-r--r-- | app/graphql/resolvers/group_resolver.rb | 6 | ||||
-rw-r--r-- | app/graphql/resolvers/ml/find_models_resolver.rb | 35 | ||||
-rw-r--r-- | app/graphql/resolvers/namespace_resolver.rb | 6 | ||||
-rw-r--r-- | app/graphql/resolvers/organizations/organizations_resolver.rb | 19 | ||||
-rw-r--r-- | app/graphql/resolvers/organizations/projects_resolver.rb | 19 | ||||
-rw-r--r-- | app/graphql/resolvers/project_resolver.rb | 6 | ||||
-rw-r--r-- | app/graphql/resolvers/projects/fork_targets_resolver.rb | 11 | ||||
-rw-r--r-- | app/graphql/resolvers/users_resolver.rb | 26 |
16 files changed, 166 insertions, 47 deletions
diff --git a/app/graphql/resolvers/ci/catalog/resources/versions_resolver.rb b/app/graphql/resolvers/ci/catalog/resources/versions_resolver.rb index 9332076a493..899b407b180 100644 --- a/app/graphql/resolvers/ci/catalog/resources/versions_resolver.rb +++ b/app/graphql/resolvers/ci/catalog/resources/versions_resolver.rb @@ -11,12 +11,18 @@ module Resolvers # field is evaluated on more than one node, it causes performance degradation. extension ::Gitlab::Graphql::Limit::FieldCallCount, limit: 1 + argument :name, GraphQL::Types::String, + required: false, + description: 'Name of the version.' + argument :sort, Types::Ci::Catalog::Resources::VersionSortEnum, required: false, description: 'Sort versions by given criteria.' - def resolve(sort: nil) - ::Ci::Catalog::Resources::VersionsFinder.new(object, current_user, sort: sort).execute + alias_method :catalog_resource, :object + + def resolve(name: nil, sort: nil) + ::Ci::Catalog::Resources::VersionsFinder.new(catalog_resource, current_user, name: name, sort: sort).execute end end end diff --git a/app/graphql/resolvers/ci/runner_owner_project_resolver.rb b/app/graphql/resolvers/ci/runner_owner_project_resolver.rb index f4e044b81c9..28c39427872 100644 --- a/app/graphql/resolvers/ci/runner_owner_project_resolver.rb +++ b/app/graphql/resolvers/ci/runner_owner_project_resolver.rb @@ -34,7 +34,7 @@ module Resolvers def resolve_owner return unless runner.project_type? - BatchLoader::GraphQL.for(runner.id).batch(key: :runner_owner_projects) do |runner_ids, loader| + BatchLoader::GraphQL.for(runner.id).batch do |runner_ids, loader| # rubocop: disable CodeReuse/ActiveRecord runner_and_projects_with_row_number = ::Ci::RunnerProject diff --git a/app/graphql/resolvers/ci/runner_projects_resolver.rb b/app/graphql/resolvers/ci/runner_projects_resolver.rb index c5037965e20..99c9bba1bd6 100644 --- a/app/graphql/resolvers/ci/runner_projects_resolver.rb +++ b/app/graphql/resolvers/ci/runner_projects_resolver.rb @@ -28,7 +28,7 @@ module Resolvers return unless runner.project_type? # rubocop:disable CodeReuse/ActiveRecord - BatchLoader::GraphQL.for(runner.id).batch(key: :runner_projects) do |runner_ids, loader| + BatchLoader::GraphQL.for(runner.id).batch do |runner_ids, loader| plucked_runner_and_project_ids = ::Ci::RunnerProject .select(:runner_id, :project_id) .where(runner_id: runner_ids) diff --git a/app/graphql/resolvers/ci/runner_resolver.rb b/app/graphql/resolvers/ci/runner_resolver.rb index 4250b069d20..60fb4163afe 100644 --- a/app/graphql/resolvers/ci/runner_resolver.rb +++ b/app/graphql/resolvers/ci/runner_resolver.rb @@ -6,13 +6,12 @@ module Resolvers include LooksAhead type Types::Ci::RunnerType, null: true - extras [:lookahead] description 'Runner information.' argument :id, - type: ::Types::GlobalIDType[::Ci::Runner], - required: true, - description: 'Runner ID.' + type: ::Types::GlobalIDType[::Ci::Runner], + required: true, + description: 'Runner ID.' def resolve_with_lookahead(id:) find_runner(id: id) @@ -21,19 +20,13 @@ module Resolvers private def find_runner(id:) - runner_id = GitlabSchema.parse_gid(id, expected_type: ::Ci::Runner).model_id.to_i - key = { - preload_tag_list: lookahead.selects?(:tag_list), - preload_creator: lookahead.selects?(:created_by) - } - - BatchLoader::GraphQL.for(runner_id).batch(key: key) do |ids, loader, batch| - results = ::Ci::Runner.id_in(ids) - results = results.with_tags if batch[:key][:preload_tag_list] - results = results.with_creator if batch[:key][:preload_creator] - - results.each { |record| loader.call(record.id, record) } - end + preloads = [] + preloads << :creator if lookahead.selects?(:created_by) + preloads << :tags if lookahead.selects?(:tag_list) + + runner_id = GitlabSchema.parse_gid(id, expected_type: ::Ci::Runner).model_id + + ::Gitlab::Graphql::Loaders::BatchModelLoader.new(::Ci::Runner, runner_id, preloads).find end end end diff --git a/app/graphql/resolvers/ci/runners_resolver.rb b/app/graphql/resolvers/ci/runners_resolver.rb index 9121c413b1f..38d2ebe046b 100644 --- a/app/graphql/resolvers/ci/runners_resolver.rb +++ b/app/graphql/resolvers/ci/runners_resolver.rb @@ -82,7 +82,7 @@ module Resolvers creator_id: params[:creator_id] ? ::GitlabSchema.parse_gid(params[:creator_id], expected_type: ::User).model_id : nil, version_prefix: params[:version_prefix], - preload: false # we'll handle preloading ourselves + preload: {} # we'll handle preloading ourselves }.compact .merge(parent_param) end diff --git a/app/graphql/resolvers/concerns/resolves_groups.rb b/app/graphql/resolvers/concerns/resolves_groups.rb index 86dda5cb1cb..1673b1bd37f 100644 --- a/app/graphql/resolvers/concerns/resolves_groups.rb +++ b/app/graphql/resolvers/concerns/resolves_groups.rb @@ -5,6 +5,19 @@ module ResolvesGroups extend ActiveSupport::Concern include LooksAhead + PRELOADS = { + container_repositories_count: [:container_repositories], + custom_emoji: [:custom_emoji], + full_path: [:route], + path: [:route], + web_url: [:route], + dependency_proxy_blob_count: [:dependency_proxy_blobs], + dependency_proxy_blobs: [:dependency_proxy_blobs], + dependency_proxy_image_count: [:dependency_proxy_manifests], + dependency_proxy_image_ttl_policy: [:dependency_proxy_image_ttl_policy], + dependency_proxy_setting: [:dependency_proxy_setting] + }.freeze + def resolve_with_lookahead(...) apply_lookahead(resolve_groups(...)) end @@ -17,17 +30,8 @@ module ResolvesGroups end def preloads - { - container_repositories_count: [:container_repositories], - custom_emoji: [:custom_emoji], - full_path: [:route], - path: [:route], - web_url: [:route], - dependency_proxy_blob_count: [:dependency_proxy_blobs], - dependency_proxy_blobs: [:dependency_proxy_blobs], - dependency_proxy_image_count: [:dependency_proxy_manifests], - dependency_proxy_image_ttl_policy: [:dependency_proxy_image_ttl_policy], - dependency_proxy_setting: [:dependency_proxy_setting] - } + PRELOADS end end + +ResolvesGroups.prepend_mod diff --git a/app/graphql/resolvers/container_repository_tags_resolver.rb b/app/graphql/resolvers/container_repository_tags_resolver.rb index 50adf98fa07..d3929451bd0 100644 --- a/app/graphql/resolvers/container_repository_tags_resolver.rb +++ b/app/graphql/resolvers/container_repository_tags_resolver.rb @@ -14,6 +14,11 @@ module Resolvers required: false, default_value: nil + argument :referrers, GraphQL::Types::Boolean, + description: 'Include tag referrers.', + required: false, + default_value: nil + alias_method :container_repository, :object def resolve(sort:, **filters) @@ -25,7 +30,8 @@ module Resolvers last: filters[:after], sort: map_sort_field(sort), name: filters[:name], - page_size: page_size + page_size: page_size, + referrers: filters[:referrers] ) Gitlab::Graphql::ExternallyPaginatedArray.new( diff --git a/app/graphql/resolvers/full_path_resolver.rb b/app/graphql/resolvers/full_path_resolver.rb index b8df54f49ab..2c64d08a219 100644 --- a/app/graphql/resolvers/full_path_resolver.rb +++ b/app/graphql/resolvers/full_path_resolver.rb @@ -4,10 +4,10 @@ module Resolvers module FullPathResolver extend ActiveSupport::Concern - prepended do + included do argument :full_path, GraphQL::Types::ID, - required: true, - description: 'Full path of the project, group, or namespace. For example, `gitlab-org/gitlab-foss`.' + required: true, + description: "Full path of the #{target_type}. For example, `gitlab-org/gitlab-foss`." end def model_by_full_path(model, full_path) diff --git a/app/graphql/resolvers/group_resolver.rb b/app/graphql/resolvers/group_resolver.rb index 4260e18829e..e3b651b6493 100644 --- a/app/graphql/resolvers/group_resolver.rb +++ b/app/graphql/resolvers/group_resolver.rb @@ -2,7 +2,11 @@ module Resolvers class GroupResolver < BaseResolver - prepend FullPathResolver + def self.target_type + 'group' + end + + include FullPathResolver type Types::GroupType, null: true diff --git a/app/graphql/resolvers/ml/find_models_resolver.rb b/app/graphql/resolvers/ml/find_models_resolver.rb new file mode 100644 index 00000000000..b9901100e22 --- /dev/null +++ b/app/graphql/resolvers/ml/find_models_resolver.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module Resolvers + module Ml + class FindModelsResolver < Resolvers::BaseResolver + extension ::Gitlab::Graphql::Limit::FieldCallCount, limit: 1 + + type ::Types::Ml::ModelType.connection_type, null: true + + argument :name, GraphQL::Types::String, + required: false, + description: 'Search for names that include the string.' + + argument :order_by, ::Types::Ml::ModelsOrderByEnum, + required: false, + description: 'Ordering column. Default is created_at.' + + argument :sort, ::Types::SortDirectionEnum, + required: false, + description: 'Ordering column. Default is desc.' + + def resolve(**args) + return unless current_user.can?(:read_model_registry, object) + + find_params = { + name: args[:name], + order_by: args[:order_by].to_s, + sort: args[:sort].to_s + } + + ::Projects::Ml::ModelFinder.new(object, find_params).execute + end + end + end +end diff --git a/app/graphql/resolvers/namespace_resolver.rb b/app/graphql/resolvers/namespace_resolver.rb index 17b3800d151..a0b16758625 100644 --- a/app/graphql/resolvers/namespace_resolver.rb +++ b/app/graphql/resolvers/namespace_resolver.rb @@ -2,7 +2,11 @@ module Resolvers class NamespaceResolver < BaseResolver - prepend FullPathResolver + def self.target_type + 'namespace' + end + + include FullPathResolver type Types::NamespaceType, null: true diff --git a/app/graphql/resolvers/organizations/organizations_resolver.rb b/app/graphql/resolvers/organizations/organizations_resolver.rb new file mode 100644 index 00000000000..ab21a84645b --- /dev/null +++ b/app/graphql/resolvers/organizations/organizations_resolver.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Resolvers + module Organizations + class OrganizationsResolver < BaseResolver + include Gitlab::Graphql::Authorize::AuthorizeResource + + type Types::Organizations::OrganizationType.connection_type, null: true + authorize :read_organization + + def resolve + # For the Organization MVC, all the organizations are public. We need to change this to only accessible + # organizations once we start supporting private organizations. + # See https://gitlab.com/groups/gitlab-org/-/epics/10649. + ::Organizations::Organization.all + end + end + end +end diff --git a/app/graphql/resolvers/organizations/projects_resolver.rb b/app/graphql/resolvers/organizations/projects_resolver.rb new file mode 100644 index 00000000000..836fe0ae059 --- /dev/null +++ b/app/graphql/resolvers/organizations/projects_resolver.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Resolvers + module Organizations + class ProjectsResolver < BaseResolver + include Gitlab::Graphql::Authorize::AuthorizeResource + + type Types::ProjectType, null: true + + authorize :read_project + + alias_method :organization, :object + + def resolve + ::ProjectsFinder.new(current_user: current_user, params: { organization: organization }).execute + end + end + end +end diff --git a/app/graphql/resolvers/project_resolver.rb b/app/graphql/resolvers/project_resolver.rb index 2132447da5e..931fefcea50 100644 --- a/app/graphql/resolvers/project_resolver.rb +++ b/app/graphql/resolvers/project_resolver.rb @@ -2,7 +2,11 @@ module Resolvers class ProjectResolver < BaseResolver - prepend FullPathResolver + def self.target_type + 'project' + end + + include FullPathResolver type Types::ProjectType, null: true diff --git a/app/graphql/resolvers/projects/fork_targets_resolver.rb b/app/graphql/resolvers/projects/fork_targets_resolver.rb index 5e8be325d43..27797b9f0af 100644 --- a/app/graphql/resolvers/projects/fork_targets_resolver.rb +++ b/app/graphql/resolvers/projects/fork_targets_resolver.rb @@ -3,7 +3,7 @@ module Resolvers module Projects class ForkTargetsResolver < BaseResolver - include ResolvesGroups + include LooksAhead include Gitlab::Graphql::Authorize::AuthorizeResource type Types::NamespaceType.connection_type, null: true @@ -17,10 +17,15 @@ module Resolvers required: false, description: 'Search query for path or name.' + def resolve_with_lookahead(**args) + fork_targets = ForkTargetsFinder.new(project, current_user).execute(args) + apply_lookahead(fork_targets) + end + private - def resolve_groups(**args) - ForkTargetsFinder.new(project, current_user).execute(args) + def preloads + ResolvesGroups::PRELOADS end end end diff --git a/app/graphql/resolvers/users_resolver.rb b/app/graphql/resolvers/users_resolver.rb index 90a6bd3e6b2..a512c6bafe1 100644 --- a/app/graphql/resolvers/users_resolver.rb +++ b/app/graphql/resolvers/users_resolver.rb @@ -28,10 +28,19 @@ module Resolvers default_value: false, description: 'Return only admin users.' - def resolve(ids: nil, usernames: nil, sort: nil, search: nil, admins: nil) + argument :group_id, ::Types::GlobalIDType[::Group], + required: false, + description: 'Return users member of a given group.' + + def resolve(ids: nil, usernames: nil, sort: nil, search: nil, admins: nil, group_id: nil) authorize!(usernames) - ::UsersFinder.new(context[:current_user], finder_params(ids, usernames, sort, search, admins)).execute + group = group_id ? find_authorized_group!(group_id) : nil + + ::UsersFinder.new( + context[:current_user], + finder_params(ids, usernames, sort, search, admins, group) + ).execute end def ready?(**args) @@ -52,16 +61,27 @@ module Resolvers private - def finder_params(ids, usernames, sort, search, admins) + def finder_params(ids, usernames, sort, search, admins, group) params = {} params[:sort] = sort if sort params[:username] = usernames if usernames params[:id] = parse_gids(ids) if ids params[:search] = search if search params[:admins] = admins if admins + params[:group] = group if group params end + def find_authorized_group!(group_id) + group = GitlabSchema.find_by_gid(group_id).sync + + unless Ability.allowed?(current_user, :read_group, group) + raise_resource_not_available_error! "Could not find a Group with ID #{group_id}" + end + + group + end + def parse_gids(gids) gids.map { |gid| GitlabSchema.parse_gid(gid, expected_type: ::User).model_id } end |