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:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-08-19 12:08:42 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-08-19 12:08:42 +0300
commitb76ae638462ab0f673e5915986070518dd3f9ad3 (patch)
treebdab0533383b52873be0ec0eb4d3c66598ff8b91 /app/graphql/resolvers
parent434373eabe7b4be9593d18a585fb763f1e5f1a6f (diff)
Add latest changes from gitlab-org/gitlab@14-2-stable-eev14.2.0-rc42
Diffstat (limited to 'app/graphql/resolvers')
-rw-r--r--app/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver.rb2
-rw-r--r--app/graphql/resolvers/alert_management/alert_resolver.rb6
-rw-r--r--app/graphql/resolvers/alert_management/alert_status_counts_resolver.rb4
-rw-r--r--app/graphql/resolvers/blobs_resolver.rb6
-rw-r--r--app/graphql/resolvers/board_resolver.rb2
-rw-r--r--app/graphql/resolvers/ci/config_resolver.rb10
-rw-r--r--app/graphql/resolvers/ci/runner_setup_resolver.rb4
-rw-r--r--app/graphql/resolvers/ci/runners_resolver.rb4
-rw-r--r--app/graphql/resolvers/ci/template_resolver.rb2
-rw-r--r--app/graphql/resolvers/ci/test_suite_resolver.rb2
-rw-r--r--app/graphql/resolvers/concerns/group_issuable_resolver.rb2
-rw-r--r--app/graphql/resolvers/concerns/issue_resolver_arguments.rb39
-rw-r--r--app/graphql/resolvers/concerns/resolves_ids.rb16
-rw-r--r--app/graphql/resolvers/concerns/resolves_pipelines.rb4
-rw-r--r--app/graphql/resolvers/concerns/resolves_snippets.rb16
-rw-r--r--app/graphql/resolvers/container_repositories_resolver.rb2
-rw-r--r--app/graphql/resolvers/design_management/design_at_version_resolver.rb2
-rw-r--r--app/graphql/resolvers/design_management/design_resolver.rb2
-rw-r--r--app/graphql/resolvers/design_management/designs_resolver.rb2
-rw-r--r--app/graphql/resolvers/design_management/version/design_at_version_resolver.rb8
-rw-r--r--app/graphql/resolvers/design_management/version/designs_at_version_resolver.rb2
-rw-r--r--app/graphql/resolvers/design_management/version_in_collection_resolver.rb6
-rw-r--r--app/graphql/resolvers/design_management/version_resolver.rb2
-rw-r--r--app/graphql/resolvers/design_management/versions_resolver.rb6
-rw-r--r--app/graphql/resolvers/echo_resolver.rb4
-rw-r--r--app/graphql/resolvers/environments_resolver.rb6
-rw-r--r--app/graphql/resolvers/error_tracking/sentry_errors_resolver.rb4
-rw-r--r--app/graphql/resolvers/full_path_resolver.rb4
-rw-r--r--app/graphql/resolvers/group_labels_resolver.rb4
-rw-r--r--app/graphql/resolvers/group_milestones_resolver.rb4
-rw-r--r--app/graphql/resolvers/groups_resolver.rb39
-rw-r--r--app/graphql/resolvers/issues_resolver.rb3
-rw-r--r--app/graphql/resolvers/labels_resolver.rb4
-rw-r--r--app/graphql/resolvers/members_resolver.rb2
-rw-r--r--app/graphql/resolvers/merge_request_resolver.rb2
-rw-r--r--app/graphql/resolvers/merge_requests_count_resolver.rb17
-rw-r--r--app/graphql/resolvers/merge_requests_resolver.rb20
-rw-r--r--app/graphql/resolvers/metrics/dashboard_resolver.rb2
-rw-r--r--app/graphql/resolvers/milestones_resolver.rb6
-rw-r--r--app/graphql/resolvers/namespace_projects_resolver.rb6
-rw-r--r--app/graphql/resolvers/packages_base_resolver.rb4
-rw-r--r--app/graphql/resolvers/paginated_tree_resolver.rb47
-rw-r--r--app/graphql/resolvers/project_milestones_resolver.rb2
-rw-r--r--app/graphql/resolvers/project_pipeline_resolver.rb4
-rw-r--r--app/graphql/resolvers/projects/jira_projects_resolver.rb2
-rw-r--r--app/graphql/resolvers/projects/services_resolver.rb2
-rw-r--r--app/graphql/resolvers/projects_resolver.rb12
-rw-r--r--app/graphql/resolvers/release_resolver.rb2
-rw-r--r--app/graphql/resolvers/repository_branch_names_resolver.rb8
-rw-r--r--app/graphql/resolvers/snippets/blobs_resolver.rb2
-rw-r--r--app/graphql/resolvers/snippets_resolver.rb3
-rw-r--r--app/graphql/resolvers/terraform/states_resolver.rb2
-rw-r--r--app/graphql/resolvers/timelog_resolver.rb101
-rw-r--r--app/graphql/resolvers/todo_resolver.rb6
-rw-r--r--app/graphql/resolvers/tree_resolver.rb6
-rw-r--r--app/graphql/resolvers/user_discussions_count_resolver.rb2
-rw-r--r--app/graphql/resolvers/user_merge_requests_resolver_base.rb2
-rw-r--r--app/graphql/resolvers/user_notes_count_resolver.rb2
-rw-r--r--app/graphql/resolvers/user_resolver.rb2
-rw-r--r--app/graphql/resolvers/user_starred_projects_resolver.rb2
-rw-r--r--app/graphql/resolvers/users/group_count_resolver.rb2
-rw-r--r--app/graphql/resolvers/users_resolver.rb8
62 files changed, 336 insertions, 165 deletions
diff --git a/app/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver.rb b/app/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver.rb
index a5f81149d4e..b5a19d38b9c 100644
--- a/app/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver.rb
+++ b/app/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver.rb
@@ -11,7 +11,7 @@ module Resolvers
argument :identifier, Types::Admin::Analytics::UsageTrends::MeasurementIdentifierEnum,
required: true,
- description: 'The type of measurement/statistics to retrieve.'
+ description: 'Type of measurement or statistics to retrieve.'
argument :recorded_after, Types::TimeType,
required: false,
diff --git a/app/graphql/resolvers/alert_management/alert_resolver.rb b/app/graphql/resolvers/alert_management/alert_resolver.rb
index 62744e719da..899b90a94dd 100644
--- a/app/graphql/resolvers/alert_management/alert_resolver.rb
+++ b/app/graphql/resolvers/alert_management/alert_resolver.rb
@@ -5,7 +5,7 @@ module Resolvers
class AlertResolver < BaseResolver
include LooksAhead
- argument :iid, GraphQL::STRING_TYPE,
+ argument :iid, GraphQL::Types::String,
required: false,
description: 'IID of the alert. For example, "1".'
@@ -23,11 +23,11 @@ module Resolvers
required: true,
default_value: 'operations'
- argument :search, GraphQL::STRING_TYPE,
+ argument :search, GraphQL::Types::String,
description: 'Search query for title, description, service, or monitoring_tool.',
required: false
- argument :assignee_username, GraphQL::STRING_TYPE,
+ argument :assignee_username, GraphQL::Types::String,
required: false,
description: 'Username of a user assigned to the issue.'
diff --git a/app/graphql/resolvers/alert_management/alert_status_counts_resolver.rb b/app/graphql/resolvers/alert_management/alert_status_counts_resolver.rb
index 410f72cff84..568d648a95e 100644
--- a/app/graphql/resolvers/alert_management/alert_status_counts_resolver.rb
+++ b/app/graphql/resolvers/alert_management/alert_status_counts_resolver.rb
@@ -5,11 +5,11 @@ module Resolvers
class AlertStatusCountsResolver < BaseResolver
type Types::AlertManagement::AlertStatusCountsType, null: true
- argument :search, GraphQL::STRING_TYPE,
+ argument :search, GraphQL::Types::String,
description: 'Search query for title, description, service, or monitoring_tool.',
required: false
- argument :assignee_username, GraphQL::STRING_TYPE,
+ argument :assignee_username, GraphQL::Types::String,
required: false,
description: 'Username of a user assigned to the issue.'
diff --git a/app/graphql/resolvers/blobs_resolver.rb b/app/graphql/resolvers/blobs_resolver.rb
index d006769bd4b..d0eb2deaf48 100644
--- a/app/graphql/resolvers/blobs_resolver.rb
+++ b/app/graphql/resolvers/blobs_resolver.rb
@@ -10,13 +10,13 @@ module Resolvers
alias_method :repository, :object
- argument :paths, [GraphQL::STRING_TYPE],
+ argument :paths, [GraphQL::Types::String],
required: true,
description: 'Array of desired blob paths.'
- argument :ref, GraphQL::STRING_TYPE,
+ argument :ref, GraphQL::Types::String,
required: false,
default_value: nil,
- description: 'The commit ref to get the blobs from. Default value is HEAD.'
+ description: 'Commit ref to get the blobs from. Default value is HEAD.'
# We fetch blobs from Gitaly efficiently but it still scales O(N) with the
# number of paths being fetched, so apply a scaling limit to that.
diff --git a/app/graphql/resolvers/board_resolver.rb b/app/graphql/resolvers/board_resolver.rb
index 85362ab1422..24df67b7b6e 100644
--- a/app/graphql/resolvers/board_resolver.rb
+++ b/app/graphql/resolvers/board_resolver.rb
@@ -8,7 +8,7 @@ module Resolvers
argument :id, ::Types::GlobalIDType[::Board],
required: true,
- description: 'The board\'s ID.'
+ description: 'ID of the board.'
def resolve(id: nil)
return unless parent
diff --git a/app/graphql/resolvers/ci/config_resolver.rb b/app/graphql/resolvers/ci/config_resolver.rb
index f2e33251b9c..2d74392a84c 100644
--- a/app/graphql/resolvers/ci/config_resolver.rb
+++ b/app/graphql/resolvers/ci/config_resolver.rb
@@ -14,19 +14,19 @@ module Resolvers
authorize :read_pipeline
- argument :project_path, GraphQL::ID_TYPE,
+ argument :project_path, GraphQL::Types::ID,
required: true,
- description: 'The project of the CI config.'
+ description: 'Project of the CI config.'
- argument :sha, GraphQL::STRING_TYPE,
+ argument :sha, GraphQL::Types::String,
required: false,
description: "Sha for the pipeline."
- argument :content, GraphQL::STRING_TYPE,
+ argument :content, GraphQL::Types::String,
required: true,
description: "Contents of `.gitlab-ci.yml`."
- argument :dry_run, GraphQL::BOOLEAN_TYPE,
+ argument :dry_run, GraphQL::Types::Boolean,
required: false,
description: 'Run pipeline creation simulation, or only do static check.'
diff --git a/app/graphql/resolvers/ci/runner_setup_resolver.rb b/app/graphql/resolvers/ci/runner_setup_resolver.rb
index 9166999b400..6b21f5c3ab4 100644
--- a/app/graphql/resolvers/ci/runner_setup_resolver.rb
+++ b/app/graphql/resolvers/ci/runner_setup_resolver.rb
@@ -9,12 +9,12 @@ module Resolvers
description 'Runner setup instructions.'
argument :platform,
- type: GraphQL::STRING_TYPE,
+ type: GraphQL::Types::String,
required: true,
description: 'Platform to generate the instructions for.'
argument :architecture,
- type: GraphQL::STRING_TYPE,
+ type: GraphQL::Types::String,
required: true,
description: 'Architecture to generate the instructions for.'
diff --git a/app/graphql/resolvers/ci/runners_resolver.rb b/app/graphql/resolvers/ci/runners_resolver.rb
index 5074a248e18..1957c4ec058 100644
--- a/app/graphql/resolvers/ci/runners_resolver.rb
+++ b/app/graphql/resolvers/ci/runners_resolver.rb
@@ -15,11 +15,11 @@ module Resolvers
required: false,
description: 'Filter runners by type.'
- argument :tag_list, [GraphQL::STRING_TYPE],
+ argument :tag_list, [GraphQL::Types::String],
required: false,
description: 'Filter by tags associated with the runner (comma-separated or array).'
- argument :search, GraphQL::STRING_TYPE,
+ argument :search, GraphQL::Types::String,
required: false,
description: 'Filter by full token or partial text in description field.'
diff --git a/app/graphql/resolvers/ci/template_resolver.rb b/app/graphql/resolvers/ci/template_resolver.rb
index 7f5a1a486d7..17f2668df11 100644
--- a/app/graphql/resolvers/ci/template_resolver.rb
+++ b/app/graphql/resolvers/ci/template_resolver.rb
@@ -5,7 +5,7 @@ module Resolvers
class TemplateResolver < BaseResolver
type Types::Ci::TemplateType, null: true
- argument :name, GraphQL::STRING_TYPE, required: true,
+ argument :name, GraphQL::Types::String, required: true,
description: 'Name of the CI/CD template to search for. Template must be formatted as `Name.gitlab-ci.yml`.'
alias_method :project, :object
diff --git a/app/graphql/resolvers/ci/test_suite_resolver.rb b/app/graphql/resolvers/ci/test_suite_resolver.rb
index 90cc30b1281..5d61d9e986b 100644
--- a/app/graphql/resolvers/ci/test_suite_resolver.rb
+++ b/app/graphql/resolvers/ci/test_suite_resolver.rb
@@ -11,7 +11,7 @@ module Resolvers
alias_method :pipeline, :object
- argument :build_ids, [GraphQL::ID_TYPE],
+ argument :build_ids, [GraphQL::Types::ID],
required: true,
description: 'IDs of the builds used to run the test suite.'
diff --git a/app/graphql/resolvers/concerns/group_issuable_resolver.rb b/app/graphql/resolvers/concerns/group_issuable_resolver.rb
index 49a79683e9f..542ff5374ff 100644
--- a/app/graphql/resolvers/concerns/group_issuable_resolver.rb
+++ b/app/graphql/resolvers/concerns/group_issuable_resolver.rb
@@ -5,7 +5,7 @@ module GroupIssuableResolver
class_methods do
def include_subgroups(name_of_things)
- argument :include_subgroups, GraphQL::BOOLEAN_TYPE,
+ argument :include_subgroups, GraphQL::Types::Boolean,
required: false,
default_value: false,
description: "Include #{name_of_things} belonging to subgroups"
diff --git a/app/graphql/resolvers/concerns/issue_resolver_arguments.rb b/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
index c24f4dedc0e..8d77c0f3a8d 100644
--- a/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
+++ b/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
@@ -6,29 +6,29 @@ module IssueResolverArguments
prepended do
include LooksAhead
- argument :iid, GraphQL::STRING_TYPE,
+ argument :iid, GraphQL::Types::String,
required: false,
description: 'IID of the issue. For example, "1".'
- argument :iids, [GraphQL::STRING_TYPE],
+ argument :iids, [GraphQL::Types::String],
required: false,
description: 'List of IIDs of issues. For example, `["1", "2"]`.'
- argument :label_name, [GraphQL::STRING_TYPE, null: true],
+ argument :label_name, [GraphQL::Types::String, null: true],
required: false,
description: 'Labels applied to this issue.'
- argument :milestone_title, [GraphQL::STRING_TYPE, null: true],
+ argument :milestone_title, [GraphQL::Types::String, null: true],
required: false,
description: 'Milestone applied to this issue.'
- argument :author_username, GraphQL::STRING_TYPE,
+ argument :author_username, GraphQL::Types::String,
required: false,
description: 'Username of the author of the issue.'
- argument :assignee_username, GraphQL::STRING_TYPE,
+ argument :assignee_username, GraphQL::Types::String,
required: false,
description: 'Username of a user assigned to the issue.',
deprecated: { reason: 'Use `assigneeUsernames`', milestone: '13.11' }
- argument :assignee_usernames, [GraphQL::STRING_TYPE],
+ argument :assignee_usernames, [GraphQL::Types::String],
required: false,
description: 'Usernames of users assigned to the issue.'
- argument :assignee_id, GraphQL::STRING_TYPE,
+ argument :assignee_id, GraphQL::Types::String,
required: false,
description: 'ID of a user assigned to the issues, "none" and "any" values are supported.'
argument :created_before, Types::TimeType,
@@ -49,13 +49,16 @@ module IssueResolverArguments
argument :closed_after, Types::TimeType,
required: false,
description: 'Issues closed after this date.'
- argument :search, GraphQL::STRING_TYPE,
+ argument :search, GraphQL::Types::String,
required: false,
description: 'Search query for issue title or description.'
argument :types, [Types::IssueTypeEnum],
as: :issue_types,
description: 'Filter issues by the given issue types.',
required: false
+ argument :milestone_wildcard_id, ::Types::MilestoneWildcardIdEnum,
+ required: false,
+ description: 'Filter issues by milestone ID wildcard.'
argument :not, Types::Issues::NegatedIssueFilterInputType,
description: 'Negated arguments.',
prepare: ->(negated_args, ctx) { negated_args.to_h },
@@ -82,10 +85,9 @@ module IssueResolverArguments
end
def ready?(**args)
- if args.slice(*mutually_exclusive_assignee_username_args).compact.size > 1
- arg_str = mutually_exclusive_assignee_username_args.map { |x| x.to_s.camelize(:lower) }.join(', ')
- raise Gitlab::Graphql::Errors::ArgumentError, "only one of [#{arg_str}] arguments is allowed at the same time."
- end
+ params_not_mutually_exclusive(args, mutually_exclusive_assignee_username_args)
+ params_not_mutually_exclusive(args, mutually_exclusive_milestone_args)
+ params_not_mutually_exclusive(args.fetch(:not, {}), mutually_exclusive_milestone_args)
super
end
@@ -106,6 +108,17 @@ module IssueResolverArguments
args[:not][:assignee_username] = args[:not].delete(:assignee_usernames) if args.dig(:not, :assignee_usernames).present?
end
+ def params_not_mutually_exclusive(args, mutually_exclusive_args)
+ if args.slice(*mutually_exclusive_args).compact.size > 1
+ arg_str = mutually_exclusive_args.map { |x| x.to_s.camelize(:lower) }.join(', ')
+ raise ::Gitlab::Graphql::Errors::ArgumentError, "only one of [#{arg_str}] arguments is allowed at the same time."
+ end
+ end
+
+ def mutually_exclusive_milestone_args
+ [:milestone_title, :milestone_wildcard_id]
+ end
+
def mutually_exclusive_assignee_username_args
[:assignee_usernames, :assignee_username]
end
diff --git a/app/graphql/resolvers/concerns/resolves_ids.rb b/app/graphql/resolvers/concerns/resolves_ids.rb
new file mode 100644
index 00000000000..8bf2a6b2ac9
--- /dev/null
+++ b/app/graphql/resolvers/concerns/resolves_ids.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module ResolvesIds
+ extend ActiveSupport::Concern
+
+ def resolve_ids(ids, type)
+ Array.wrap(ids).map do |id|
+ next unless id.present?
+
+ # TODO: remove this line when the compatibility layer is removed
+ # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
+ id = type.coerce_isolated_input(id)
+ id.model_id
+ end.compact
+ end
+end
diff --git a/app/graphql/resolvers/concerns/resolves_pipelines.rb b/app/graphql/resolvers/concerns/resolves_pipelines.rb
index bbf33c0b5eb..77f2105db7c 100644
--- a/app/graphql/resolvers/concerns/resolves_pipelines.rb
+++ b/app/graphql/resolvers/concerns/resolves_pipelines.rb
@@ -10,11 +10,11 @@ module ResolvesPipelines
required: false,
description: "Filter pipelines by their status."
argument :ref,
- GraphQL::STRING_TYPE,
+ GraphQL::Types::String,
required: false,
description: "Filter pipelines by the ref they are run for."
argument :sha,
- GraphQL::STRING_TYPE,
+ GraphQL::Types::String,
required: false,
description: "Filter pipelines by the sha of the commit they are run for."
end
diff --git a/app/graphql/resolvers/concerns/resolves_snippets.rb b/app/graphql/resolvers/concerns/resolves_snippets.rb
index 8de85c074ec..46d78a6a8c8 100644
--- a/app/graphql/resolvers/concerns/resolves_snippets.rb
+++ b/app/graphql/resolvers/concerns/resolves_snippets.rb
@@ -2,6 +2,7 @@
module ResolvesSnippets
extend ActiveSupport::Concern
+ include ResolvesIds
included do
type Types::SnippetType.connection_type, null: true
@@ -12,7 +13,7 @@ module ResolvesSnippets
argument :visibility, Types::Snippets::VisibilityScopesEnum,
required: false,
- description: 'The visibility of the snippet.'
+ description: 'Visibility of the snippet.'
end
def resolve(**args)
@@ -27,22 +28,11 @@ module ResolvesSnippets
def snippet_finder_params(args)
{
- ids: resolve_ids(args[:ids]),
+ ids: resolve_ids(args[:ids], ::Types::GlobalIDType[::Snippet]),
scope: args[:visibility]
}.merge(options_by_type(args[:type]))
end
- def resolve_ids(ids, type = ::Types::GlobalIDType[::Snippet])
- Array.wrap(ids).map do |id|
- next unless id.present?
-
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = type.coerce_isolated_input(id)
- id.model_id
- end.compact
- end
-
def options_by_type(type)
case type
when 'personal'
diff --git a/app/graphql/resolvers/container_repositories_resolver.rb b/app/graphql/resolvers/container_repositories_resolver.rb
index 17af2a2f070..1e06d4e9094 100644
--- a/app/graphql/resolvers/container_repositories_resolver.rb
+++ b/app/graphql/resolvers/container_repositories_resolver.rb
@@ -6,7 +6,7 @@ module Resolvers
type Types::ContainerRepositoryType, null: true
- argument :name, GraphQL::STRING_TYPE,
+ argument :name, GraphQL::Types::String,
required: false,
description: 'Filter the container repositories by their name.'
diff --git a/app/graphql/resolvers/design_management/design_at_version_resolver.rb b/app/graphql/resolvers/design_management/design_at_version_resolver.rb
index 533692e2b12..c87670bc24c 100644
--- a/app/graphql/resolvers/design_management/design_at_version_resolver.rb
+++ b/app/graphql/resolvers/design_management/design_at_version_resolver.rb
@@ -11,7 +11,7 @@ module Resolvers
argument :id, ::Types::GlobalIDType[::DesignManagement::DesignAtVersion],
required: true,
- description: 'The Global ID of the design at this version.'
+ description: 'Global ID of the design at this version.'
def resolve(id:)
authorized_find!(id: id)
diff --git a/app/graphql/resolvers/design_management/design_resolver.rb b/app/graphql/resolvers/design_management/design_resolver.rb
index e640f57f04a..d9e5203ef0e 100644
--- a/app/graphql/resolvers/design_management/design_resolver.rb
+++ b/app/graphql/resolvers/design_management/design_resolver.rb
@@ -11,7 +11,7 @@ module Resolvers
required: false,
description: 'Find a design by its ID.'
- argument :filename, GraphQL::STRING_TYPE,
+ argument :filename, GraphQL::Types::String,
required: false,
description: 'Find a design by its filename.'
diff --git a/app/graphql/resolvers/design_management/designs_resolver.rb b/app/graphql/resolvers/design_management/designs_resolver.rb
index c45e4d01f6e..dec778fac80 100644
--- a/app/graphql/resolvers/design_management/designs_resolver.rb
+++ b/app/graphql/resolvers/design_management/designs_resolver.rb
@@ -11,7 +11,7 @@ module Resolvers
argument :ids, [DesignID],
required: false,
description: 'Filters designs by their ID.'
- argument :filenames, [GraphQL::STRING_TYPE],
+ argument :filenames, [GraphQL::Types::String],
required: false,
description: 'Filters designs by their filename.'
argument :at_version, VersionID,
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 fea74cbfb0b..d879c1434dc 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
@@ -19,13 +19,13 @@ module Resolvers
argument :id, DesignAtVersionID,
required: false,
as: :design_at_version_id,
- description: 'The ID of the DesignAtVersion.'
+ description: 'ID of the DesignAtVersion.'
argument :design_id, DesignID,
required: false,
- description: 'The ID of a specific design.'
- argument :filename, GraphQL::STRING_TYPE,
+ description: 'ID of a specific design.'
+ argument :filename, GraphQL::Types::String,
required: false,
- description: 'The filename of a specific design.'
+ description: 'Filename of a specific design.'
def self.single
self
diff --git a/app/graphql/resolvers/design_management/version/designs_at_version_resolver.rb b/app/graphql/resolvers/design_management/version/designs_at_version_resolver.rb
index 930b1b60d0e..254f1efa0a5 100644
--- a/app/graphql/resolvers/design_management/version/designs_at_version_resolver.rb
+++ b/app/graphql/resolvers/design_management/version/designs_at_version_resolver.rb
@@ -17,7 +17,7 @@ module Resolvers
required: false,
description: 'Filters designs by their ID.'
argument :filenames,
- [GraphQL::STRING_TYPE],
+ [GraphQL::Types::String],
required: false,
description: 'Filters designs by their filename.'
diff --git a/app/graphql/resolvers/design_management/version_in_collection_resolver.rb b/app/graphql/resolvers/design_management/version_in_collection_resolver.rb
index 593974beb04..80db15755d3 100644
--- a/app/graphql/resolvers/design_management/version_in_collection_resolver.rb
+++ b/app/graphql/resolvers/design_management/version_in_collection_resolver.rb
@@ -15,13 +15,13 @@ module Resolvers
VersionID = ::Types::GlobalIDType[::DesignManagement::Version]
- argument :sha, GraphQL::STRING_TYPE,
+ argument :sha, GraphQL::Types::String,
required: false,
- description: "The SHA256 of a specific version."
+ description: "SHA256 of a specific version."
argument :id, VersionID,
as: :version_id,
required: false,
- description: 'The Global ID of the version.'
+ description: 'Global ID of the version.'
def resolve(version_id: nil, sha: nil)
# TODO: remove this line when the compatibility layer is removed
diff --git a/app/graphql/resolvers/design_management/version_resolver.rb b/app/graphql/resolvers/design_management/version_resolver.rb
index 2144e588208..a6403fbd69f 100644
--- a/app/graphql/resolvers/design_management/version_resolver.rb
+++ b/app/graphql/resolvers/design_management/version_resolver.rb
@@ -11,7 +11,7 @@ module Resolvers
argument :id, ::Types::GlobalIDType[::DesignManagement::Version],
required: true,
- description: 'The Global ID of the version.'
+ description: 'Global ID of the version.'
def resolve(id:)
authorized_find!(id: id)
diff --git a/app/graphql/resolvers/design_management/versions_resolver.rb b/app/graphql/resolvers/design_management/versions_resolver.rb
index 08b29d884b0..23ba3c86d98 100644
--- a/app/graphql/resolvers/design_management/versions_resolver.rb
+++ b/app/graphql/resolvers/design_management/versions_resolver.rb
@@ -11,15 +11,15 @@ module Resolvers
extras [:parent]
- argument :earlier_or_equal_to_sha, GraphQL::STRING_TYPE,
+ argument :earlier_or_equal_to_sha, GraphQL::Types::String,
as: :sha,
required: false,
- description: 'The SHA256 of the most recent acceptable version.'
+ description: 'SHA256 of the most recent acceptable version.'
argument :earlier_or_equal_to_id, VersionID,
as: :id,
required: false,
- description: 'The Global ID of the most recent acceptable version.'
+ description: 'Global ID of the most recent acceptable version.'
# This resolver has a custom singular resolver
def self.single
diff --git a/app/graphql/resolvers/echo_resolver.rb b/app/graphql/resolvers/echo_resolver.rb
index a09b0a1fd87..856e6873a65 100644
--- a/app/graphql/resolvers/echo_resolver.rb
+++ b/app/graphql/resolvers/echo_resolver.rb
@@ -2,11 +2,11 @@
module Resolvers
class EchoResolver < BaseResolver
- type ::GraphQL::STRING_TYPE, null: false
+ type ::GraphQL::Types::String, null: false
description 'Testing endpoint to validate the API with'
argument :text,
- type: GraphQL::STRING_TYPE,
+ type: GraphQL::Types::String,
required: true,
description: 'Text to echo back.'
diff --git a/app/graphql/resolvers/environments_resolver.rb b/app/graphql/resolvers/environments_resolver.rb
index ee604e7b307..1823eb65d44 100644
--- a/app/graphql/resolvers/environments_resolver.rb
+++ b/app/graphql/resolvers/environments_resolver.rb
@@ -2,15 +2,15 @@
module Resolvers
class EnvironmentsResolver < BaseResolver
- argument :name, GraphQL::STRING_TYPE,
+ argument :name, GraphQL::Types::String,
required: false,
description: 'Name of the environment.'
- argument :search, GraphQL::STRING_TYPE,
+ argument :search, GraphQL::Types::String,
required: false,
description: 'Search query for environment name.'
- argument :states, [GraphQL::STRING_TYPE],
+ argument :states, [GraphQL::Types::String],
required: false,
description: 'States of environments that should be included in result.'
diff --git a/app/graphql/resolvers/error_tracking/sentry_errors_resolver.rb b/app/graphql/resolvers/error_tracking/sentry_errors_resolver.rb
index 4cd65daa655..793b73342ab 100644
--- a/app/graphql/resolvers/error_tracking/sentry_errors_resolver.rb
+++ b/app/graphql/resolvers/error_tracking/sentry_errors_resolver.rb
@@ -6,12 +6,12 @@ module Resolvers
type Types::ErrorTracking::SentryErrorType.connection_type, null: true
extension Gitlab::Graphql::Extensions::ExternallyPaginatedArrayExtension
- argument :search_term, ::GraphQL::STRING_TYPE,
+ argument :search_term, ::GraphQL::Types::String,
description: 'Search query for the Sentry error details.',
required: false
# TODO: convert to Enum
- argument :sort, ::GraphQL::STRING_TYPE,
+ argument :sort, ::GraphQL::Types::String,
description: 'Attribute to sort on. Options are frequency, first_seen, last_seen. last_seen is default.',
required: false
diff --git a/app/graphql/resolvers/full_path_resolver.rb b/app/graphql/resolvers/full_path_resolver.rb
index b5e90da78b2..b8df54f49ab 100644
--- a/app/graphql/resolvers/full_path_resolver.rb
+++ b/app/graphql/resolvers/full_path_resolver.rb
@@ -5,9 +5,9 @@ module Resolvers
extend ActiveSupport::Concern
prepended do
- argument :full_path, GraphQL::ID_TYPE,
+ argument :full_path, GraphQL::Types::ID,
required: true,
- description: 'The full path of the project, group or namespace, e.g., `gitlab-org/gitlab-foss`.'
+ description: 'Full path of the project, group, or namespace. For example, `gitlab-org/gitlab-foss`.'
end
def model_by_full_path(model, full_path)
diff --git a/app/graphql/resolvers/group_labels_resolver.rb b/app/graphql/resolvers/group_labels_resolver.rb
index 5c2f950bbc0..a22fa9761d6 100644
--- a/app/graphql/resolvers/group_labels_resolver.rb
+++ b/app/graphql/resolvers/group_labels_resolver.rb
@@ -4,12 +4,12 @@ module Resolvers
class GroupLabelsResolver < LabelsResolver
type Types::LabelType.connection_type, null: true
- argument :include_descendant_groups, GraphQL::BOOLEAN_TYPE,
+ argument :include_descendant_groups, GraphQL::Types::Boolean,
required: false,
description: 'Include labels from descendant groups.',
default_value: false
- argument :only_group_labels, GraphQL::BOOLEAN_TYPE,
+ argument :only_group_labels, GraphQL::Types::Boolean,
required: false,
description: 'Include only group level labels.',
default_value: false
diff --git a/app/graphql/resolvers/group_milestones_resolver.rb b/app/graphql/resolvers/group_milestones_resolver.rb
index 31280b36278..44192b6f4bf 100644
--- a/app/graphql/resolvers/group_milestones_resolver.rb
+++ b/app/graphql/resolvers/group_milestones_resolver.rb
@@ -2,10 +2,10 @@
module Resolvers
class GroupMilestonesResolver < MilestonesResolver
- argument :include_descendants, GraphQL::BOOLEAN_TYPE,
+ argument :include_descendants, GraphQL::Types::Boolean,
required: false,
description: 'Include milestones from all subgroups and subprojects.'
- argument :include_ancestors, GraphQL::BOOLEAN_TYPE,
+ argument :include_ancestors, GraphQL::Types::Boolean,
required: false,
description: 'Include milestones from all parent groups.'
diff --git a/app/graphql/resolvers/groups_resolver.rb b/app/graphql/resolvers/groups_resolver.rb
new file mode 100644
index 00000000000..b090fdc49d4
--- /dev/null
+++ b/app/graphql/resolvers/groups_resolver.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class GroupsResolver < BaseResolver
+ type Types::GroupType, null: true
+
+ argument :include_parent_descendants, GraphQL::Types::Boolean,
+ required: false,
+ description: 'List of descendant groups of the parent group.',
+ default_value: true
+
+ argument :owned, GraphQL::Types::Boolean,
+ required: false,
+ description: 'Limit result to groups owned by authenticated user.'
+
+ argument :search, GraphQL::Types::String,
+ required: false,
+ description: 'Search query for group name or group full path.'
+
+ alias_method :parent, :object
+
+ def resolve(**args)
+ return [] unless parent.present?
+
+ find_groups(args)
+ end
+
+ private
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def find_groups(args)
+ GroupsFinder
+ .new(context[:current_user], args.merge(parent: parent))
+ .execute
+ .reorder('name ASC')
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+end
diff --git a/app/graphql/resolvers/issues_resolver.rb b/app/graphql/resolvers/issues_resolver.rb
index 2017eb7decd..47e4e3c0b32 100644
--- a/app/graphql/resolvers/issues_resolver.rb
+++ b/app/graphql/resolvers/issues_resolver.rb
@@ -37,7 +37,8 @@ module Resolvers
[
{
project: [:project_feature]
- }
+ },
+ :author
]
end
diff --git a/app/graphql/resolvers/labels_resolver.rb b/app/graphql/resolvers/labels_resolver.rb
index 1b523b8a240..505d1dff8d2 100644
--- a/app/graphql/resolvers/labels_resolver.rb
+++ b/app/graphql/resolvers/labels_resolver.rb
@@ -8,11 +8,11 @@ module Resolvers
type Types::LabelType.connection_type, null: true
- argument :search_term, GraphQL::STRING_TYPE,
+ argument :search_term, GraphQL::Types::String,
required: false,
description: 'A search term to find labels with.'
- argument :include_ancestor_groups, GraphQL::BOOLEAN_TYPE,
+ argument :include_ancestor_groups, GraphQL::Types::Boolean,
required: false,
description: 'Include labels from ancestor groups.',
default_value: false
diff --git a/app/graphql/resolvers/members_resolver.rb b/app/graphql/resolvers/members_resolver.rb
index 2b731d54cdd..827db54134a 100644
--- a/app/graphql/resolvers/members_resolver.rb
+++ b/app/graphql/resolvers/members_resolver.rb
@@ -7,7 +7,7 @@ module Resolvers
type Types::MemberInterface.connection_type, null: true
- argument :search, GraphQL::STRING_TYPE,
+ argument :search, GraphQL::Types::String,
required: false,
description: 'Search query.'
diff --git a/app/graphql/resolvers/merge_request_resolver.rb b/app/graphql/resolvers/merge_request_resolver.rb
index c431d079beb..0f0f3ee3772 100644
--- a/app/graphql/resolvers/merge_request_resolver.rb
+++ b/app/graphql/resolvers/merge_request_resolver.rb
@@ -8,7 +8,7 @@ module Resolvers
type ::Types::MergeRequestType, null: true
- argument :iid, GraphQL::STRING_TYPE,
+ argument :iid, GraphQL::Types::String,
required: true,
as: :iids,
description: 'IID of the merge request, for example `1`.'
diff --git a/app/graphql/resolvers/merge_requests_count_resolver.rb b/app/graphql/resolvers/merge_requests_count_resolver.rb
new file mode 100644
index 00000000000..fc5b442db03
--- /dev/null
+++ b/app/graphql/resolvers/merge_requests_count_resolver.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class MergeRequestsCountResolver < BaseResolver
+ type GraphQL::Types::Int, null: true
+
+ def resolve
+ BatchLoader::GraphQL.for(object.id).batch do |ids, loader, args|
+ counts = MergeRequestsClosingIssues.count_for_collection(ids, context[:current_user]).to_h
+
+ ids.each do |id|
+ loader.call(id, counts[id] || 0)
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/resolvers/merge_requests_resolver.rb b/app/graphql/resolvers/merge_requests_resolver.rb
index a9eea4ae4b8..8f2c7847a2e 100644
--- a/app/graphql/resolvers/merge_requests_resolver.rb
+++ b/app/graphql/resolvers/merge_requests_resolver.rb
@@ -10,28 +10,28 @@ module Resolvers
alias_method :project, :object
def self.accept_assignee
- argument :assignee_username, GraphQL::STRING_TYPE,
+ argument :assignee_username, GraphQL::Types::String,
required: false,
description: 'Username of the assignee.'
end
def self.accept_author
- argument :author_username, GraphQL::STRING_TYPE,
+ argument :author_username, GraphQL::Types::String,
required: false,
description: 'Username of the author.'
end
def self.accept_reviewer
- argument :reviewer_username, GraphQL::STRING_TYPE,
+ argument :reviewer_username, GraphQL::Types::String,
required: false,
description: 'Username of the reviewer.'
end
- argument :iids, [GraphQL::STRING_TYPE],
+ argument :iids, [GraphQL::Types::String],
required: false,
description: 'Array of IIDs of merge requests, for example `[1, 2]`.'
- argument :source_branches, [GraphQL::STRING_TYPE],
+ argument :source_branches, [GraphQL::Types::String],
required: false,
as: :source_branch,
description: <<~DESC
@@ -39,7 +39,7 @@ module Resolvers
All resolved merge requests will have one of these branches as their source.
DESC
- argument :target_branches, [GraphQL::STRING_TYPE],
+ argument :target_branches, [GraphQL::Types::String],
required: false,
as: :target_branch,
description: <<~DESC
@@ -51,7 +51,7 @@ module Resolvers
required: false,
description: 'A merge request state. If provided, all resolved merge requests will have this state.'
- argument :labels, [GraphQL::STRING_TYPE],
+ argument :labels, [GraphQL::Types::String],
required: false,
as: :label_name,
description: 'Array of label names. All resolved merge requests will have all of these labels.'
@@ -61,7 +61,7 @@ module Resolvers
argument :merged_before, Types::TimeType,
required: false,
description: 'Merge requests merged before this date.'
- argument :milestone_title, GraphQL::STRING_TYPE,
+ argument :milestone_title, GraphQL::Types::String,
required: false,
description: 'Title of the milestone.'
argument :sort, Types::MergeRequestSortEnum,
@@ -70,11 +70,11 @@ module Resolvers
default_value: :created_desc
negated do
- argument :labels, [GraphQL::STRING_TYPE],
+ argument :labels, [GraphQL::Types::String],
required: false,
as: :label_name,
description: 'Array of label names. All resolved merge requests will not have these labels.'
- argument :milestone_title, GraphQL::STRING_TYPE,
+ argument :milestone_title, GraphQL::Types::String,
required: false,
description: 'Title of the milestone.'
end
diff --git a/app/graphql/resolvers/metrics/dashboard_resolver.rb b/app/graphql/resolvers/metrics/dashboard_resolver.rb
index 0669fececd5..d2be9fcdd89 100644
--- a/app/graphql/resolvers/metrics/dashboard_resolver.rb
+++ b/app/graphql/resolvers/metrics/dashboard_resolver.rb
@@ -6,7 +6,7 @@ module Resolvers
type Types::Metrics::DashboardType, null: true
calls_gitaly!
- argument :path, GraphQL::STRING_TYPE,
+ argument :path, GraphQL::Types::String,
required: true,
description: <<~MD
Path to a file which defines a metrics dashboard eg: `"config/prometheus/common_metrics.yml"`.
diff --git a/app/graphql/resolvers/milestones_resolver.rb b/app/graphql/resolvers/milestones_resolver.rb
index 4fa4c939a23..84f7d66ec19 100644
--- a/app/graphql/resolvers/milestones_resolver.rb
+++ b/app/graphql/resolvers/milestones_resolver.rb
@@ -5,7 +5,7 @@ module Resolvers
include Gitlab::Graphql::Authorize::AuthorizeResource
include TimeFrameArguments
- argument :ids, [GraphQL::ID_TYPE],
+ argument :ids, [GraphQL::Types::ID],
required: false,
description: 'Array of global milestone IDs, e.g., `"gid://gitlab/Milestone/1"`.'
@@ -13,11 +13,11 @@ module Resolvers
required: false,
description: 'Filter milestones by state.'
- argument :title, GraphQL::STRING_TYPE,
+ argument :title, GraphQL::Types::String,
required: false,
description: 'The title of the milestone.'
- argument :search_title, GraphQL::STRING_TYPE,
+ argument :search_title, GraphQL::Types::String,
required: false,
description: 'A search string for the title.'
diff --git a/app/graphql/resolvers/namespace_projects_resolver.rb b/app/graphql/resolvers/namespace_projects_resolver.rb
index 86286a744bd..c3c61d31e8d 100644
--- a/app/graphql/resolvers/namespace_projects_resolver.rb
+++ b/app/graphql/resolvers/namespace_projects_resolver.rb
@@ -2,12 +2,12 @@
module Resolvers
class NamespaceProjectsResolver < BaseResolver
- argument :include_subgroups, GraphQL::BOOLEAN_TYPE,
+ argument :include_subgroups, GraphQL::Types::Boolean,
required: false,
default_value: false,
description: 'Include also subgroup projects.'
- argument :search, GraphQL::STRING_TYPE,
+ argument :search, GraphQL::Types::String,
required: false,
default_value: nil,
description: 'Search project with most similar names or paths.'
@@ -17,7 +17,7 @@ module Resolvers
default_value: nil,
description: 'Sort projects by this criteria.'
- argument :ids, [GraphQL::ID_TYPE],
+ argument :ids, [GraphQL::Types::ID],
required: false,
default_value: nil,
description: 'Filter projects by IDs.'
diff --git a/app/graphql/resolvers/packages_base_resolver.rb b/app/graphql/resolvers/packages_base_resolver.rb
index 3378cc32c9f..7d153d16910 100644
--- a/app/graphql/resolvers/packages_base_resolver.rb
+++ b/app/graphql/resolvers/packages_base_resolver.rb
@@ -9,7 +9,7 @@ module Resolvers
required: false,
default_value: :created_desc
- argument :package_name, GraphQL::STRING_TYPE,
+ argument :package_name, GraphQL::Types::String,
description: 'Search a package by name.',
required: false,
default_value: nil
@@ -24,7 +24,7 @@ module Resolvers
required: false,
default_value: nil
- argument :include_versionless, GraphQL::BOOLEAN_TYPE,
+ argument :include_versionless, GraphQL::Types::Boolean,
description: 'Include versionless packages.',
required: false,
default_value: false
diff --git a/app/graphql/resolvers/paginated_tree_resolver.rb b/app/graphql/resolvers/paginated_tree_resolver.rb
new file mode 100644
index 00000000000..d1b4e75169c
--- /dev/null
+++ b/app/graphql/resolvers/paginated_tree_resolver.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class PaginatedTreeResolver < BaseResolver
+ type Types::Tree::TreeType.connection_type, null: true
+ extension Gitlab::Graphql::Extensions::ExternallyPaginatedArrayExtension
+
+ calls_gitaly!
+
+ argument :path, GraphQL::Types::String,
+ required: false,
+ default_value: '', # root of the repository
+ description: 'The path to get the tree for. Default value is the root of the repository.'
+ argument :ref, GraphQL::Types::String,
+ required: false,
+ default_value: :head,
+ description: 'The commit ref to get the tree for. Default value is HEAD.'
+ argument :recursive, GraphQL::Types::Boolean,
+ required: false,
+ default_value: false,
+ description: 'Used to get a recursive tree. Default is false.'
+
+ alias_method :repository, :object
+
+ def resolve(**args)
+ return unless repository.exists?
+
+ cursor = args.delete(:after)
+
+ pagination_params = {
+ limit: @field.max_page_size || 100,
+ page_token: cursor
+ }
+
+ tree = repository.tree(args[:ref], args[:path], recursive: args[:recursive], pagination_params: pagination_params)
+
+ next_cursor = tree.cursor&.next_cursor
+ Gitlab::Graphql::ExternallyPaginatedArray.new(cursor, next_cursor, *tree)
+ rescue Gitlab::Git::CommandError => e
+ raise Gitlab::Graphql::Errors::ArgumentError, e
+ end
+
+ def self.field_options
+ super.merge(connection: false) # we manage the pagination manually, so opt out of the connection field extension
+ end
+ end
+end
diff --git a/app/graphql/resolvers/project_milestones_resolver.rb b/app/graphql/resolvers/project_milestones_resolver.rb
index 4cd9cb53f56..567a55aa09b 100644
--- a/app/graphql/resolvers/project_milestones_resolver.rb
+++ b/app/graphql/resolvers/project_milestones_resolver.rb
@@ -3,7 +3,7 @@
module Resolvers
class ProjectMilestonesResolver < MilestonesResolver
- argument :include_ancestors, GraphQL::BOOLEAN_TYPE,
+ argument :include_ancestors, GraphQL::Types::Boolean,
required: false,
description: "Also return milestones in the project's parent group and its ancestors."
diff --git a/app/graphql/resolvers/project_pipeline_resolver.rb b/app/graphql/resolvers/project_pipeline_resolver.rb
index aa8808b15ac..ce4b6ac6b0c 100644
--- a/app/graphql/resolvers/project_pipeline_resolver.rb
+++ b/app/graphql/resolvers/project_pipeline_resolver.rb
@@ -6,11 +6,11 @@ module Resolvers
alias_method :project, :object
- argument :iid, GraphQL::ID_TYPE,
+ argument :iid, GraphQL::Types::ID,
required: false,
description: 'IID of the Pipeline. For example, "1".'
- argument :sha, GraphQL::STRING_TYPE,
+ argument :sha, GraphQL::Types::String,
required: false,
description: 'SHA of the Pipeline. For example, "dyd0f15ay83993f5ab66k927w28673882x99100b".'
diff --git a/app/graphql/resolvers/projects/jira_projects_resolver.rb b/app/graphql/resolvers/projects/jira_projects_resolver.rb
index 864acb6d759..56432585015 100644
--- a/app/graphql/resolvers/projects/jira_projects_resolver.rb
+++ b/app/graphql/resolvers/projects/jira_projects_resolver.rb
@@ -9,7 +9,7 @@ module Resolvers
authorize :admin_project
argument :name,
- GraphQL::STRING_TYPE,
+ GraphQL::Types::String,
required: false,
description: 'Project name or key.'
diff --git a/app/graphql/resolvers/projects/services_resolver.rb b/app/graphql/resolvers/projects/services_resolver.rb
index 3674aa97e1f..99de4df945c 100644
--- a/app/graphql/resolvers/projects/services_resolver.rb
+++ b/app/graphql/resolvers/projects/services_resolver.rb
@@ -10,7 +10,7 @@ module Resolvers
authorizes_object!
argument :active,
- GraphQL::BOOLEAN_TYPE,
+ GraphQL::Types::Boolean,
required: false,
description: 'Indicates if the integration is active.'
argument :type,
diff --git a/app/graphql/resolvers/projects_resolver.rb b/app/graphql/resolvers/projects_resolver.rb
index 665ec796cd3..b846248458f 100644
--- a/app/graphql/resolvers/projects_resolver.rb
+++ b/app/graphql/resolvers/projects_resolver.rb
@@ -4,27 +4,27 @@ module Resolvers
class ProjectsResolver < BaseResolver
type Types::ProjectType, null: true
- argument :membership, GraphQL::BOOLEAN_TYPE,
+ argument :membership, GraphQL::Types::Boolean,
required: false,
description: 'Limit projects that the current user is a member of.'
- argument :search, GraphQL::STRING_TYPE,
+ argument :search, GraphQL::Types::String,
required: false,
description: 'Search query for project name, path, or description.'
- argument :ids, [GraphQL::ID_TYPE],
+ argument :ids, [GraphQL::Types::ID],
required: false,
description: 'Filter projects by IDs.'
- argument :search_namespaces, GraphQL::BOOLEAN_TYPE,
+ argument :search_namespaces, GraphQL::Types::Boolean,
required: false,
description: 'Include namespace in project search.'
- argument :sort, GraphQL::STRING_TYPE,
+ argument :sort, GraphQL::Types::String,
required: false,
description: 'Sort order of results.'
- argument :topics, type: [GraphQL::STRING_TYPE],
+ argument :topics, type: [GraphQL::Types::String],
required: false,
description: 'Filters projects by topics.'
diff --git a/app/graphql/resolvers/release_resolver.rb b/app/graphql/resolvers/release_resolver.rb
index 67ff5fed0bb..0374a1103de 100644
--- a/app/graphql/resolvers/release_resolver.rb
+++ b/app/graphql/resolvers/release_resolver.rb
@@ -4,7 +4,7 @@ module Resolvers
class ReleaseResolver < BaseResolver
type Types::ReleaseType, null: true
- argument :tag_name, GraphQL::STRING_TYPE,
+ argument :tag_name, GraphQL::Types::String,
required: true,
description: 'The name of the tag associated to the release.'
diff --git a/app/graphql/resolvers/repository_branch_names_resolver.rb b/app/graphql/resolvers/repository_branch_names_resolver.rb
index c0a5ea0366f..e9aacda2652 100644
--- a/app/graphql/resolvers/repository_branch_names_resolver.rb
+++ b/app/graphql/resolvers/repository_branch_names_resolver.rb
@@ -2,19 +2,19 @@
module Resolvers
class RepositoryBranchNamesResolver < BaseResolver
- type ::GraphQL::STRING_TYPE, null: false
+ type ::GraphQL::Types::String, null: false
calls_gitaly!
- argument :search_pattern, GraphQL::STRING_TYPE,
+ argument :search_pattern, GraphQL::Types::String,
required: true,
description: 'The pattern to search for branch names by.'
- argument :offset, GraphQL::INT_TYPE,
+ argument :offset, GraphQL::Types::Int,
required: true,
description: 'The number of branch names to skip.'
- argument :limit, GraphQL::INT_TYPE,
+ argument :limit, GraphQL::Types::Int,
required: true,
description: 'The number of branch names to return.'
diff --git a/app/graphql/resolvers/snippets/blobs_resolver.rb b/app/graphql/resolvers/snippets/blobs_resolver.rb
index 4328d38d485..00f41517422 100644
--- a/app/graphql/resolvers/snippets/blobs_resolver.rb
+++ b/app/graphql/resolvers/snippets/blobs_resolver.rb
@@ -12,7 +12,7 @@ module Resolvers
alias_method :snippet, :object
- argument :paths, [GraphQL::STRING_TYPE],
+ argument :paths, [GraphQL::Types::String],
required: false,
description: 'Paths of the blobs.'
diff --git a/app/graphql/resolvers/snippets_resolver.rb b/app/graphql/resolvers/snippets_resolver.rb
index 7153c919062..7d18c9c6fea 100644
--- a/app/graphql/resolvers/snippets_resolver.rb
+++ b/app/graphql/resolvers/snippets_resolver.rb
@@ -3,6 +3,7 @@
module Resolvers
class SnippetsResolver < BaseResolver
+ include ResolvesIds
include ResolvesSnippets
ERROR_MESSAGE = 'Filtering by both an author and a project is not supported'
@@ -22,7 +23,7 @@ module Resolvers
description: 'The type of snippet.'
argument :explore,
- GraphQL::BOOLEAN_TYPE,
+ GraphQL::Types::Boolean,
required: false,
description: 'Explore personal snippets.'
diff --git a/app/graphql/resolvers/terraform/states_resolver.rb b/app/graphql/resolvers/terraform/states_resolver.rb
index f543eb182e8..69785cfc794 100644
--- a/app/graphql/resolvers/terraform/states_resolver.rb
+++ b/app/graphql/resolvers/terraform/states_resolver.rb
@@ -8,7 +8,7 @@ module Resolvers
alias_method :project, :object
when_single do
- argument :name, GraphQL::STRING_TYPE,
+ argument :name, GraphQL::Types::String,
required: true,
description: 'Name of the Terraform state.'
end
diff --git a/app/graphql/resolvers/timelog_resolver.rb b/app/graphql/resolvers/timelog_resolver.rb
index 8ac30c4cb5d..14831a29d90 100644
--- a/app/graphql/resolvers/timelog_resolver.rb
+++ b/app/graphql/resolvers/timelog_resolver.rb
@@ -3,33 +3,50 @@
module Resolvers
class TimelogResolver < BaseResolver
include LooksAhead
+ include ResolvesIds
type ::Types::TimelogType.connection_type, null: false
argument :start_date, Types::TimeType,
required: false,
- description: 'List time logs within a date range where the logged date is equal to or after startDate.'
+ description: 'List timelogs within a date range where the logged date is equal to or after startDate.'
argument :end_date, Types::TimeType,
required: false,
- description: 'List time logs within a date range where the logged date is equal to or before endDate.'
+ description: 'List timelogs within a date range where the logged date is equal to or before endDate.'
argument :start_time, Types::TimeType,
required: false,
- description: 'List time-logs within a time range where the logged time is equal to or after startTime.'
+ description: 'List timelogs within a time range where the logged time is equal to or after startTime.'
argument :end_time, Types::TimeType,
required: false,
- description: 'List time-logs within a time range where the logged time is equal to or before endTime.'
+ description: 'List timelogs within a time range where the logged time is equal to or before endTime.'
+
+ argument :project_id, ::Types::GlobalIDType[::Project],
+ required: false,
+ description: 'List timelogs for a project.'
+
+ argument :group_id, ::Types::GlobalIDType[::Group],
+ required: false,
+ description: 'List timelogs for a group.'
+
+ argument :username, GraphQL::Types::String,
+ required: false,
+ description: 'List timelogs for a user.'
def resolve_with_lookahead(**args)
- build_timelogs
+ validate_args!(object, args)
+
+ timelogs = object&.timelogs || Timelog.limit(GitlabSchema.default_max_page_size)
if args.any?
- validate_args!(args)
- build_parsed_args(args)
- validate_time_difference!
- apply_time_filter
+ args = parse_datetime_args(args)
+
+ timelogs = apply_user_filter(timelogs, args)
+ timelogs = apply_project_filter(timelogs, args)
+ timelogs = apply_time_filter(timelogs, args)
+ timelogs = apply_group_filter(timelogs, args)
end
apply_lookahead(timelogs)
@@ -37,30 +54,32 @@ module Resolvers
private
- attr_reader :parsed_args, :timelogs
-
def preloads
{
note: [:note]
}
end
- def validate_args!(args)
- if args[:start_time] && args[:start_date]
+ def validate_args!(object, args)
+ if args.empty? && object.nil?
+ raise_argument_error('Provide at least one argument')
+ elsif args[:start_time] && args[:start_date]
raise_argument_error('Provide either a start date or time, but not both')
elsif args[:end_time] && args[:end_date]
raise_argument_error('Provide either an end date or time, but not both')
end
end
- def build_parsed_args(args)
+ def parse_datetime_args(args)
if times_provided?(args)
- @parsed_args = args
+ args
else
- @parsed_args = args.except(:start_date, :end_date)
+ parsed_args = args.except(:start_date, :end_date)
- @parsed_args[:start_time] = args[:start_date].beginning_of_day if args[:start_date]
- @parsed_args[:end_time] = args[:end_date].end_of_day if args[:end_date]
+ parsed_args[:start_time] = args[:start_date].beginning_of_day if args[:start_date]
+ parsed_args[:end_time] = args[:end_date].end_of_day if args[:end_date]
+
+ parsed_args
end
end
@@ -68,23 +87,51 @@ module Resolvers
args[:start_time] && args[:end_time]
end
- def validate_time_difference!
- return unless end_time_before_start_time?
+ def validate_time_difference!(args)
+ return unless end_time_before_start_time?(args)
raise_argument_error('Start argument must be before End argument')
end
- def end_time_before_start_time?
- times_provided?(parsed_args) && parsed_args[:end_time] < parsed_args[:start_time]
+ def end_time_before_start_time?(args)
+ times_provided?(args) && args[:end_time] < args[:start_time]
end
- def build_timelogs
- @timelogs = Timelog.in_group(object)
+ def apply_project_filter(timelogs, args)
+ return timelogs unless args[:project_id]
+
+ project = resolve_ids(args[:project_id], ::Types::GlobalIDType[::Project])
+ timelogs.in_project(project)
end
- def apply_time_filter
- @timelogs = timelogs.at_or_after(parsed_args[:start_time]) if parsed_args[:start_time]
- @timelogs = timelogs.at_or_before(parsed_args[:end_time]) if parsed_args[:end_time]
+ def apply_group_filter(timelogs, args)
+ return timelogs unless args[:group_id]
+
+ group = Group.find_by_id(resolve_ids(args[:group_id], ::Types::GlobalIDType[::Group]))
+ timelogs.in_group(group)
+ end
+
+ def apply_user_filter(timelogs, args)
+ return timelogs unless args[:username]
+
+ user = UserFinder.new(args[:username]).find_by_username!
+ timelogs.for_user(user)
+ end
+
+ def apply_time_filter(timelogs, args)
+ return timelogs unless args[:start_time] || args[:end_time]
+
+ validate_time_difference!(args)
+
+ if args[:start_time]
+ timelogs = timelogs.at_or_after(args[:start_time])
+ end
+
+ if args[:end_time]
+ timelogs = timelogs.at_or_before(args[:end_time])
+ end
+
+ timelogs
end
def raise_argument_error(message)
diff --git a/app/graphql/resolvers/todo_resolver.rb b/app/graphql/resolvers/todo_resolver.rb
index af48ceefd6f..263b190c74e 100644
--- a/app/graphql/resolvers/todo_resolver.rb
+++ b/app/graphql/resolvers/todo_resolver.rb
@@ -10,15 +10,15 @@ module Resolvers
required: false,
description: 'The action to be filtered.'
- argument :author_id, [GraphQL::ID_TYPE],
+ argument :author_id, [GraphQL::Types::ID],
required: false,
description: 'The ID of an author.'
- argument :project_id, [GraphQL::ID_TYPE],
+ argument :project_id, [GraphQL::Types::ID],
required: false,
description: 'The ID of a project.'
- argument :group_id, [GraphQL::ID_TYPE],
+ argument :group_id, [GraphQL::Types::ID],
required: false,
description: 'The ID of a group.'
diff --git a/app/graphql/resolvers/tree_resolver.rb b/app/graphql/resolvers/tree_resolver.rb
index c07d9187d4d..70b4d81845c 100644
--- a/app/graphql/resolvers/tree_resolver.rb
+++ b/app/graphql/resolvers/tree_resolver.rb
@@ -6,15 +6,15 @@ module Resolvers
calls_gitaly!
- argument :path, GraphQL::STRING_TYPE,
+ argument :path, GraphQL::Types::String,
required: false,
default_value: '',
description: 'The path to get the tree for. Default value is the root of the repository.'
- argument :ref, GraphQL::STRING_TYPE,
+ argument :ref, GraphQL::Types::String,
required: false,
default_value: :head,
description: 'The commit ref to get the tree for. Default value is HEAD.'
- argument :recursive, GraphQL::BOOLEAN_TYPE,
+ argument :recursive, GraphQL::Types::Boolean,
required: false,
default_value: false,
description: 'Used to get a recursive tree. Default is false.'
diff --git a/app/graphql/resolvers/user_discussions_count_resolver.rb b/app/graphql/resolvers/user_discussions_count_resolver.rb
index 115997ec666..0a04e8df0b8 100644
--- a/app/graphql/resolvers/user_discussions_count_resolver.rb
+++ b/app/graphql/resolvers/user_discussions_count_resolver.rb
@@ -4,7 +4,7 @@ module Resolvers
class UserDiscussionsCountResolver < BaseResolver
include Gitlab::Graphql::Authorize::AuthorizeResource
- type GraphQL::INT_TYPE, null: true
+ type GraphQL::Types::Int, null: true
def resolve
authorize!(object)
diff --git a/app/graphql/resolvers/user_merge_requests_resolver_base.rb b/app/graphql/resolvers/user_merge_requests_resolver_base.rb
index 221a43f691d..e0201e45664 100644
--- a/app/graphql/resolvers/user_merge_requests_resolver_base.rb
+++ b/app/graphql/resolvers/user_merge_requests_resolver_base.rb
@@ -5,7 +5,7 @@ module Resolvers
include ResolvesProject
argument :project_path,
- type: GraphQL::STRING_TYPE,
+ type: GraphQL::Types::String,
required: false,
description: <<~DESC
The full-path of the project the authored merge requests should be in.
diff --git a/app/graphql/resolvers/user_notes_count_resolver.rb b/app/graphql/resolvers/user_notes_count_resolver.rb
index 2cb61104c18..b91815c72f5 100644
--- a/app/graphql/resolvers/user_notes_count_resolver.rb
+++ b/app/graphql/resolvers/user_notes_count_resolver.rb
@@ -4,7 +4,7 @@ module Resolvers
class UserNotesCountResolver < BaseResolver
include Gitlab::Graphql::Authorize::AuthorizeResource
- type GraphQL::INT_TYPE, null: true
+ type GraphQL::Types::Int, null: true
def resolve
authorize!(object)
diff --git a/app/graphql/resolvers/user_resolver.rb b/app/graphql/resolvers/user_resolver.rb
index 84bc03091d9..99fd0d4927d 100644
--- a/app/graphql/resolvers/user_resolver.rb
+++ b/app/graphql/resolvers/user_resolver.rb
@@ -10,7 +10,7 @@ module Resolvers
required: false,
description: 'ID of the User.'
- argument :username, GraphQL::STRING_TYPE,
+ argument :username, GraphQL::Types::String,
required: false,
description: 'Username of the User.'
diff --git a/app/graphql/resolvers/user_starred_projects_resolver.rb b/app/graphql/resolvers/user_starred_projects_resolver.rb
index a8abe759f27..07c6611e41d 100644
--- a/app/graphql/resolvers/user_starred_projects_resolver.rb
+++ b/app/graphql/resolvers/user_starred_projects_resolver.rb
@@ -4,7 +4,7 @@ module Resolvers
class UserStarredProjectsResolver < BaseResolver
type Types::ProjectType.connection_type, null: true
- argument :search, GraphQL::STRING_TYPE,
+ argument :search, GraphQL::Types::String,
required: false,
description: 'Search query.'
diff --git a/app/graphql/resolvers/users/group_count_resolver.rb b/app/graphql/resolvers/users/group_count_resolver.rb
index ebfe594d31d..592436ac546 100644
--- a/app/graphql/resolvers/users/group_count_resolver.rb
+++ b/app/graphql/resolvers/users/group_count_resolver.rb
@@ -3,7 +3,7 @@
module Resolvers
module Users
class GroupCountResolver < BaseResolver
- type GraphQL::INT_TYPE, null: true
+ type GraphQL::Types::Int, null: true
alias_method :user, :object
diff --git a/app/graphql/resolvers/users_resolver.rb b/app/graphql/resolvers/users_resolver.rb
index 95ced131504..c6de3dba41a 100644
--- a/app/graphql/resolvers/users_resolver.rb
+++ b/app/graphql/resolvers/users_resolver.rb
@@ -7,11 +7,11 @@ module Resolvers
type Types::UserType.connection_type, null: true
description 'Find Users'
- argument :ids, [GraphQL::ID_TYPE],
+ argument :ids, [GraphQL::Types::ID],
required: false,
description: 'List of user Global IDs.'
- argument :usernames, [GraphQL::STRING_TYPE], required: false,
+ argument :usernames, [GraphQL::Types::String], required: false,
description: 'List of usernames.'
argument :sort, Types::SortEnum,
@@ -19,11 +19,11 @@ module Resolvers
required: false,
default_value: :created_desc
- argument :search, GraphQL::STRING_TYPE,
+ argument :search, GraphQL::Types::String,
required: false,
description: "Query to search users by name, username, or primary email."
- argument :admins, GraphQL::BOOLEAN_TYPE,
+ argument :admins, GraphQL::Types::Boolean,
required: false,
default_value: false,
description: 'Return only admin users.'