diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-12-20 16:37:47 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-12-20 16:37:47 +0300 |
commit | aee0a117a889461ce8ced6fcf73207fe017f1d99 (patch) | |
tree | 891d9ef189227a8445d83f35c1b0fc99573f4380 /app/graphql/resolvers | |
parent | 8d46af3258650d305f53b819eabf7ab18d22f59e (diff) |
Add latest changes from gitlab-org/gitlab@14-6-stable-eev14.6.0-rc42
Diffstat (limited to 'app/graphql/resolvers')
16 files changed, 201 insertions, 17 deletions
diff --git a/app/graphql/resolvers/base_issues_resolver.rb b/app/graphql/resolvers/base_issues_resolver.rb index 54ebb697cb2..dca93444907 100644 --- a/app/graphql/resolvers/base_issues_resolver.rb +++ b/app/graphql/resolvers/base_issues_resolver.rb @@ -4,13 +4,13 @@ module Resolvers class BaseIssuesResolver < BaseResolver prepend IssueResolverArguments - argument :state, Types::IssuableStateEnum, - required: false, - description: 'Current state of this issue.' argument :sort, Types::IssueSortEnum, description: 'Sort issues by this criteria.', required: false, default_value: :created_desc + argument :state, Types::IssuableStateEnum, + required: false, + description: 'Current state of this issue.' type Types::IssueType.connection_type, null: true diff --git a/app/graphql/resolvers/ci/jobs_resolver.rb b/app/graphql/resolvers/ci/jobs_resolver.rb index 5ae9e721cc8..df138a15538 100644 --- a/app/graphql/resolvers/ci/jobs_resolver.rb +++ b/app/graphql/resolvers/ci/jobs_resolver.rb @@ -29,7 +29,7 @@ module Resolvers job_types: security_report_types ).execute else - pipeline.statuses + pipeline.statuses_order_id_desc end end end diff --git a/app/graphql/resolvers/ci/runner_status_resolver.rb b/app/graphql/resolvers/ci/runner_status_resolver.rb new file mode 100644 index 00000000000..d916a8a13f0 --- /dev/null +++ b/app/graphql/resolvers/ci/runner_status_resolver.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module Resolvers + module Ci + # NOTE: This class was introduced to allow modifying the meaning of certain values in RunnerStatusEnum + # while preserving backward compatibility. It can be removed in 15.0 once the API has stabilized. + class RunnerStatusResolver < BaseResolver + type Types::Ci::RunnerStatusEnum, null: false + + alias_method :runner, :object + + argument :legacy_mode, + type: GraphQL::Types::String, + default_value: '14.5', + required: false, + description: 'Compatibility mode. A null value turns off compatibility mode.', + deprecated: { reason: 'Will be removed in 15.0. From that release onward, the field will behave as if legacyMode is null', milestone: '14.6' } + + def resolve(legacy_mode:, **args) + runner.status(legacy_mode) + end + end + end +end diff --git a/app/graphql/resolvers/ci/runners_resolver.rb b/app/graphql/resolvers/ci/runners_resolver.rb index 07105701daa..9848b5a503f 100644 --- a/app/graphql/resolvers/ci/runners_resolver.rb +++ b/app/graphql/resolvers/ci/runners_resolver.rb @@ -7,6 +7,10 @@ module Resolvers type Types::Ci::RunnerType.connection_type, null: true + argument :active, ::GraphQL::Types::Boolean, + required: false, + description: 'Filter runners by active (true) or paused (false) status.' + argument :status, ::Types::Ci::RunnerStatusEnum, required: false, description: 'Filter runners by status.' @@ -38,6 +42,7 @@ module Resolvers def runners_finder_params(params) { + active: params[:active], status_status: params[:status]&.to_s, type_type: params[:type], tag_name: params[:tag_list], diff --git a/app/graphql/resolvers/clusters/agent_activity_events_resolver.rb b/app/graphql/resolvers/clusters/agent_activity_events_resolver.rb new file mode 100644 index 00000000000..b6fec3d3772 --- /dev/null +++ b/app/graphql/resolvers/clusters/agent_activity_events_resolver.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Resolvers + module Clusters + class AgentActivityEventsResolver < BaseResolver + type Types::Clusters::AgentActivityEventType, null: true + + alias_method :agent, :object + + delegate :project, to: :agent + + def resolve(**args) + return ::Clusters::Agents::ActivityEvent.none unless can_view_activity_events? + + agent.activity_events + end + + private + + def can_view_activity_events? + current_user.can?(:admin_cluster, project) + end + end + end +end diff --git a/app/graphql/resolvers/clusters/agents_resolver.rb b/app/graphql/resolvers/clusters/agents_resolver.rb index 9b8cea52e3b..5ad66ed7cdd 100644 --- a/app/graphql/resolvers/clusters/agents_resolver.rb +++ b/app/graphql/resolvers/clusters/agents_resolver.rb @@ -28,7 +28,10 @@ module Resolvers private def preloads - { tokens: :last_used_agent_tokens } + { + activity_events: { activity_events: [:user, agent_token: :agent] }, + tokens: :last_used_agent_tokens + } end end end diff --git a/app/graphql/resolvers/container_repository_tags_resolver.rb b/app/graphql/resolvers/container_repository_tags_resolver.rb new file mode 100644 index 00000000000..55a83dd49da --- /dev/null +++ b/app/graphql/resolvers/container_repository_tags_resolver.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +module Resolvers + class ContainerRepositoryTagsResolver < BaseResolver + type Types::ContainerRepositoryTagType.connection_type, null: true + + argument :sort, Types::ContainerRepositoryTagsSortEnum, + description: 'Sort tags by these criteria.', + required: false, + default_value: nil + + argument :name, GraphQL::Types::String, + description: 'Search by tag name.', + required: false, + default_value: nil + + def resolve(sort:, **filters) + result = tags + + if filters[:name] + result = tags.filter do |tag| + tag.name.include?(filters[:name]) + end + end + + result = sort_tags(result, sort) if sort + result + end + + private + + def sort_tags(to_be_sorted, sort) + raise StandardError unless Types::ContainerRepositoryTagsSortEnum.enum.include?(sort) + + sort_value, _, direction = sort.to_s.rpartition('_') + + sorted = to_be_sorted.sort_by(&sort_value.to_sym) + return sorted.reverse if direction == 'desc' + + sorted + end + + def tags + object.tags + rescue Faraday::Error + raise ::Gitlab::Graphql::Errors::ResourceNotAvailable, "Can't connect to the Container Registry. If this error persists, please review the troubleshooting documentation." + end + end +end diff --git a/app/graphql/resolvers/design_management/designs_resolver.rb b/app/graphql/resolvers/design_management/designs_resolver.rb index dec778fac80..a62ef6d76e5 100644 --- a/app/graphql/resolvers/design_management/designs_resolver.rb +++ b/app/graphql/resolvers/design_management/designs_resolver.rb @@ -8,16 +8,16 @@ module Resolvers type ::Types::DesignManagement::DesignType.connection_type, null: true - argument :ids, [DesignID], + argument :at_version, VersionID, required: false, - description: 'Filters designs by their ID.' + description: 'Filters designs to only those that existed at the version. ' \ + 'If argument is omitted or nil then all designs will reflect the latest version' argument :filenames, [GraphQL::Types::String], required: false, description: 'Filters designs by their filename.' - argument :at_version, VersionID, + argument :ids, [DesignID], required: false, - description: 'Filters designs to only those that existed at the version. ' \ - 'If argument is omitted or nil then all designs will reflect the latest version' + description: 'Filters designs by their ID.' def self.single ::Resolvers::DesignManagement::DesignResolver diff --git a/app/graphql/resolvers/design_management/version/design_at_version_resolver.rb b/app/graphql/resolvers/design_management/version/design_at_version_resolver.rb index d879c1434dc..76e365c40b1 100644 --- a/app/graphql/resolvers/design_management/version/design_at_version_resolver.rb +++ b/app/graphql/resolvers/design_management/version/design_at_version_resolver.rb @@ -16,16 +16,16 @@ module Resolvers authorize :read_design - argument :id, DesignAtVersionID, - required: false, - as: :design_at_version_id, - description: 'ID of the DesignAtVersion.' argument :design_id, DesignID, required: false, description: 'ID of a specific design.' argument :filename, GraphQL::Types::String, required: false, description: 'Filename of a specific design.' + argument :id, DesignAtVersionID, + required: false, + as: :design_at_version_id, + description: 'ID of the DesignAtVersion.' def self.single self diff --git a/app/graphql/resolvers/kas/agent_configurations_resolver.rb b/app/graphql/resolvers/kas/agent_configurations_resolver.rb index 238dae0bf12..a1b1d3bfe4c 100644 --- a/app/graphql/resolvers/kas/agent_configurations_resolver.rb +++ b/app/graphql/resolvers/kas/agent_configurations_resolver.rb @@ -14,7 +14,7 @@ module Resolvers return [] unless can_read_agent_configuration? kas_client.list_agent_config_files(project: project) - rescue GRPC::BadStatus => e + rescue GRPC::BadStatus, Gitlab::Kas::Client::ConfigurationError => e raise Gitlab::Graphql::Errors::ResourceNotAvailable, e.class.name end diff --git a/app/graphql/resolvers/package_pipelines_resolver.rb b/app/graphql/resolvers/package_pipelines_resolver.rb new file mode 100644 index 00000000000..59a1cd173a4 --- /dev/null +++ b/app/graphql/resolvers/package_pipelines_resolver.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +module Resolvers + class PackagePipelinesResolver < BaseResolver + include Gitlab::Graphql::Authorize::AuthorizeResource + + type Types::Ci::PipelineType.connection_type, null: true + extension Gitlab::Graphql::Extensions::ExternallyPaginatedArrayExtension + + authorizes_object! + authorize :read_pipeline + + alias_method :package, :object + + def resolve(first: nil, last: nil, after: nil, before: nil, lookahead:) + finder = ::Packages::BuildInfosFinder.new( + package, + first: first, + last: last, + after: decode_cursor(after), + before: decode_cursor(before), + max_page_size: context.schema.default_max_page_size, + support_next_page: lookahead.selects?(:page_info) + ) + + build_infos = finder.execute + + # this .pluck_pipeline_ids can load max 101 pipelines ids + ::Ci::Pipeline.id_in(build_infos.pluck_pipeline_ids) + end + + # we manage the pagination manually, so opt out of the connection field extension + def self.field_options + super.merge( + connection: false, + extras: [:lookahead] + ) + end + + private + + def decode_cursor(encoded) + return unless encoded + + decoded = Gitlab::Json.parse(context.schema.cursor_encoder.decode(encoded, nonce: true)) + id_from_cursor(decoded) + rescue JSON::ParserError + raise Gitlab::Graphql::Errors::ArgumentError, "Please provide a valid cursor" + end + + def id_from_cursor(cursor) + cursor&.fetch('id') + rescue KeyError + raise Gitlab::Graphql::Errors::ArgumentError, "Please provide a valid cursor" + end + end +end diff --git a/app/graphql/resolvers/project_jobs_resolver.rb b/app/graphql/resolvers/project_jobs_resolver.rb index 75068014242..8a2693ee46b 100644 --- a/app/graphql/resolvers/project_jobs_resolver.rb +++ b/app/graphql/resolvers/project_jobs_resolver.rb @@ -33,6 +33,7 @@ module Resolvers def preloads { + previous_stage_jobs_and_needs: [:needs, :pipeline], artifacts: [:job_artifacts], pipeline: [:user] } diff --git a/app/graphql/resolvers/project_pipeline_resolver.rb b/app/graphql/resolvers/project_pipeline_resolver.rb index 5acd7f95606..ea733ab08ad 100644 --- a/app/graphql/resolvers/project_pipeline_resolver.rb +++ b/app/graphql/resolvers/project_pipeline_resolver.rb @@ -24,7 +24,6 @@ module Resolvers super end - # the preloads are defined on ee/app/graphql/ee/resolvers/project_pipeline_resolver.rb def resolve(iid: nil, sha: nil, **args) self.lookahead = args.delete(:lookahead) @@ -42,5 +41,11 @@ module Resolvers end end end + + def unconditional_includes + [ + { statuses: [:needs] } + ] + end end end diff --git a/app/graphql/resolvers/project_pipelines_resolver.rb b/app/graphql/resolvers/project_pipelines_resolver.rb index 5a1e92efc96..47a8b028d4d 100644 --- a/app/graphql/resolvers/project_pipelines_resolver.rb +++ b/app/graphql/resolvers/project_pipelines_resolver.rb @@ -18,7 +18,7 @@ module Resolvers def preloads { - jobs: [:statuses], + jobs: { statuses_order_id_desc: [:needs] }, upstream: [:triggered_by_pipeline], downstream: [:triggered_pipelines] } diff --git a/app/graphql/resolvers/snippets/blobs_resolver.rb b/app/graphql/resolvers/snippets/blobs_resolver.rb index 00f41517422..cbbc65d7263 100644 --- a/app/graphql/resolvers/snippets/blobs_resolver.rb +++ b/app/graphql/resolvers/snippets/blobs_resolver.rb @@ -35,3 +35,5 @@ module Resolvers end end end + +Resolvers::Snippets::BlobsResolver.prepend_mod diff --git a/app/graphql/resolvers/users/participants_resolver.rb b/app/graphql/resolvers/users/participants_resolver.rb new file mode 100644 index 00000000000..9e87b60fa34 --- /dev/null +++ b/app/graphql/resolvers/users/participants_resolver.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Resolvers + module Users + class ParticipantsResolver < BaseResolver + type Types::UserType.connection_type, null: true + + def resolve(**args) + object.visible_participants(current_user) + end + end + end +end |