diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-08-19 12:08:42 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-08-19 12:08:42 +0300 |
commit | b76ae638462ab0f673e5915986070518dd3f9ad3 (patch) | |
tree | bdab0533383b52873be0ec0eb4d3c66598ff8b91 /app/graphql/resolvers | |
parent | 434373eabe7b4be9593d18a585fb763f1e5f1a6f (diff) |
Add latest changes from gitlab-org/gitlab@14-2-stable-eev14.2.0-rc42
Diffstat (limited to 'app/graphql/resolvers')
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.' |