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>2020-09-19 04:45:44 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-09-19 04:45:44 +0300
commit85dc423f7090da0a52c73eb66faf22ddb20efff9 (patch)
tree9160f299afd8c80c038f08e1545be119f5e3f1e1 /app/graphql/resolvers
parent15c2c8c66dbe422588e5411eee7e68f1fa440bb8 (diff)
Add latest changes from gitlab-org/gitlab@13-4-stable-ee
Diffstat (limited to 'app/graphql/resolvers')
-rw-r--r--app/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver.rb37
-rw-r--r--app/graphql/resolvers/board_list_issues_resolver.rb10
-rw-r--r--app/graphql/resolvers/concerns/board_issue_filterable.rb24
-rw-r--r--app/graphql/resolvers/concerns/issue_resolver_arguments.rb (renamed from app/graphql/resolvers/concerns/issue_resolver_fields.rb)6
-rw-r--r--app/graphql/resolvers/concerns/looks_ahead.rb2
-rw-r--r--app/graphql/resolvers/group_members_resolver.rb19
-rw-r--r--app/graphql/resolvers/issue_status_counts_resolver.rb19
-rw-r--r--app/graphql/resolvers/issues_resolver.rb14
-rw-r--r--app/graphql/resolvers/members_resolver.rb24
-rw-r--r--app/graphql/resolvers/merge_request_pipelines_resolver.rb2
-rw-r--r--app/graphql/resolvers/merge_requests_resolver.rb15
-rw-r--r--app/graphql/resolvers/metrics/dashboard_resolver.rb3
-rw-r--r--app/graphql/resolvers/namespace_projects_resolver.rb22
-rw-r--r--app/graphql/resolvers/project_members_resolver.rb16
-rw-r--r--app/graphql/resolvers/project_merge_requests_resolver.rb12
-rw-r--r--app/graphql/resolvers/projects_resolver.rb10
-rw-r--r--app/graphql/resolvers/user_starred_projects_resolver.rb17
17 files changed, 209 insertions, 43 deletions
diff --git a/app/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver.rb b/app/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver.rb
new file mode 100644
index 00000000000..aea3afa8ec5
--- /dev/null
+++ b/app/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module Resolvers
+ module Admin
+ module Analytics
+ module InstanceStatistics
+ class MeasurementsResolver < BaseResolver
+ include Gitlab::Graphql::Authorize::AuthorizeResource
+
+ type Types::Admin::Analytics::InstanceStatistics::MeasurementType, null: true
+
+ argument :identifier, Types::Admin::Analytics::InstanceStatistics::MeasurementIdentifierEnum,
+ required: true,
+ description: 'The type of measurement/statistics to retrieve'
+
+ def resolve(identifier:)
+ authorize!
+
+ ::Analytics::InstanceStatistics::Measurement
+ .with_identifier(identifier)
+ .order_by_latest
+ end
+
+ private
+
+ def authorize!
+ admin? || raise_resource_not_available_error!
+ end
+
+ def admin?
+ context[:current_user].present? && context[:current_user].admin?
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/resolvers/board_list_issues_resolver.rb b/app/graphql/resolvers/board_list_issues_resolver.rb
index a7cc367379d..dba9f99edeb 100644
--- a/app/graphql/resolvers/board_list_issues_resolver.rb
+++ b/app/graphql/resolvers/board_list_issues_resolver.rb
@@ -2,12 +2,20 @@
module Resolvers
class BoardListIssuesResolver < BaseResolver
+ include BoardIssueFilterable
+
+ argument :filters, Types::Boards::BoardIssueInputType,
+ required: false,
+ description: 'Filters applied when selecting issues in the board list'
+
type Types::IssueType, null: true
alias_method :list, :object
def resolve(**args)
- service = Boards::Issues::ListService.new(list.board.resource_parent, context[:current_user], { board_id: list.board.id, id: list.id })
+ filter_params = issue_filters(args[:filters]).merge(board_id: list.board.id, id: list.id)
+ service = Boards::Issues::ListService.new(list.board.resource_parent, context[:current_user], filter_params)
+
Gitlab::Graphql::Pagination::OffsetActiveRecordRelationConnection.new(service.execute)
end
diff --git a/app/graphql/resolvers/concerns/board_issue_filterable.rb b/app/graphql/resolvers/concerns/board_issue_filterable.rb
new file mode 100644
index 00000000000..1541738f46c
--- /dev/null
+++ b/app/graphql/resolvers/concerns/board_issue_filterable.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module BoardIssueFilterable
+ extend ActiveSupport::Concern
+
+ private
+
+ def issue_filters(args)
+ filters = args.to_h
+ set_filter_values(filters)
+
+ if filters[:not]
+ filters[:not] = filters[:not].to_h
+ set_filter_values(filters[:not])
+ end
+
+ filters
+ end
+
+ def set_filter_values(filters)
+ end
+end
+
+::BoardIssueFilterable.prepend_if_ee('::EE::Resolvers::BoardIssueFilterable')
diff --git a/app/graphql/resolvers/concerns/issue_resolver_fields.rb b/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
index bf2f510dd89..2b14d8275d1 100644
--- a/app/graphql/resolvers/concerns/issue_resolver_fields.rb
+++ b/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
@@ -1,9 +1,11 @@
# frozen_string_literal: true
-module IssueResolverFields
+module IssueResolverArguments
extend ActiveSupport::Concern
prepended do
+ include LooksAhead
+
argument :iid, GraphQL::STRING_TYPE,
required: false,
description: 'IID of the issue. For example, "1"'
@@ -49,7 +51,7 @@ module IssueResolverFields
required: false
end
- def resolve(**args)
+ def resolve_with_lookahead(**args)
# The project could have been loaded in batch by `BatchLoader`.
# At this point we need the `id` of the project to query for issues, so
# make sure it's loaded and not `nil` before continuing.
diff --git a/app/graphql/resolvers/concerns/looks_ahead.rb b/app/graphql/resolvers/concerns/looks_ahead.rb
index becc6debd33..e7230287e13 100644
--- a/app/graphql/resolvers/concerns/looks_ahead.rb
+++ b/app/graphql/resolvers/concerns/looks_ahead.rb
@@ -46,7 +46,7 @@ module LooksAhead
if lookahead.selects?(:nodes)
lookahead.selection(:nodes)
elsif lookahead.selects?(:edges)
- lookahead.selection(:edges).selection(:nodes)
+ lookahead.selection(:edges).selection(:node)
end
end
end
diff --git a/app/graphql/resolvers/group_members_resolver.rb b/app/graphql/resolvers/group_members_resolver.rb
new file mode 100644
index 00000000000..f34c873a8a9
--- /dev/null
+++ b/app/graphql/resolvers/group_members_resolver.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class GroupMembersResolver < MembersResolver
+ authorize :read_group_member
+
+ private
+
+ def preloads
+ {
+ user: [:user, :source]
+ }
+ end
+
+ def finder_class
+ GroupMembersFinder
+ end
+ end
+end
diff --git a/app/graphql/resolvers/issue_status_counts_resolver.rb b/app/graphql/resolvers/issue_status_counts_resolver.rb
index 0b26b9def54..5d0d5693244 100644
--- a/app/graphql/resolvers/issue_status_counts_resolver.rb
+++ b/app/graphql/resolvers/issue_status_counts_resolver.rb
@@ -2,26 +2,13 @@
module Resolvers
class IssueStatusCountsResolver < BaseResolver
- prepend IssueResolverFields
+ prepend IssueResolverArguments
type Types::IssueStatusCountsType, null: true
def continue_issue_resolve(parent, finder, **args)
- finder.params[parent_param(parent)] = parent if parent
- Gitlab::IssuablesCountForState.new(finder, parent)
- end
-
- private
-
- def parent_param(parent)
- case parent
- when Project
- :project_id
- when Group
- :group_id
- else
- raise "Unexpected type of parent: #{parent.class}. Must be Project or Group"
- end
+ finder.parent_param = parent
+ apply_lookahead(Gitlab::IssuablesCountForState.new(finder, parent))
end
end
end
diff --git a/app/graphql/resolvers/issues_resolver.rb b/app/graphql/resolvers/issues_resolver.rb
index e2874f6643c..396ae02ae13 100644
--- a/app/graphql/resolvers/issues_resolver.rb
+++ b/app/graphql/resolvers/issues_resolver.rb
@@ -2,7 +2,7 @@
module Resolvers
class IssuesResolver < BaseResolver
- prepend IssueResolverFields
+ prepend IssueResolverArguments
argument :state, Types::IssuableStateEnum,
required: false,
@@ -19,7 +19,7 @@ module Resolvers
milestone_due_asc milestone_due_desc].freeze
def continue_issue_resolve(parent, finder, **args)
- issues = Gitlab::Graphql::Loaders::IssuableLoader.new(parent, finder).batching_find_all
+ issues = apply_lookahead(Gitlab::Graphql::Loaders::IssuableLoader.new(parent, finder).batching_find_all)
if non_stable_cursor_sort?(args[:sort])
# Certain complex sorts are not supported by the stable cursor pagination yet.
@@ -30,6 +30,16 @@ module Resolvers
end
end
+ private
+
+ def preloads
+ {
+ alert_management_alert: [:alert_management_alert],
+ labels: [:labels],
+ assignees: [:assignees]
+ }
+ end
+
def non_stable_cursor_sort?(sort)
NON_STABLE_CURSOR_SORTS.include?(sort)
end
diff --git a/app/graphql/resolvers/members_resolver.rb b/app/graphql/resolvers/members_resolver.rb
new file mode 100644
index 00000000000..88a1ab71c45
--- /dev/null
+++ b/app/graphql/resolvers/members_resolver.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class MembersResolver < BaseResolver
+ include Gitlab::Graphql::Authorize::AuthorizeResource
+ include LooksAhead
+
+ argument :search, GraphQL::STRING_TYPE,
+ required: false,
+ description: 'Search query'
+
+ def resolve_with_lookahead(**args)
+ authorize!(object)
+
+ apply_lookahead(finder_class.new(object, current_user, params: args).execute)
+ end
+
+ private
+
+ def finder_class
+ # override in subclass
+ end
+ end
+end
diff --git a/app/graphql/resolvers/merge_request_pipelines_resolver.rb b/app/graphql/resolvers/merge_request_pipelines_resolver.rb
index b371f1335f8..b95e46d9cff 100644
--- a/app/graphql/resolvers/merge_request_pipelines_resolver.rb
+++ b/app/graphql/resolvers/merge_request_pipelines_resolver.rb
@@ -7,6 +7,8 @@ module Resolvers
alias_method :merge_request, :object
def resolve(**args)
+ return unless project
+
resolve_pipelines(project, args)
.merge(merge_request.all_pipelines)
end
diff --git a/app/graphql/resolvers/merge_requests_resolver.rb b/app/graphql/resolvers/merge_requests_resolver.rb
index d15a1ede6fe..677f84e5795 100644
--- a/app/graphql/resolvers/merge_requests_resolver.rb
+++ b/app/graphql/resolvers/merge_requests_resolver.rb
@@ -29,11 +29,18 @@ module Resolvers
as: :label_name,
description: 'Array of label names. All resolved merge requests will have all of these labels.'
argument :merged_after, Types::TimeType,
- required: false,
- description: 'Merge requests merged after this date'
+ required: false,
+ description: 'Merge requests merged after this date'
argument :merged_before, Types::TimeType,
- required: false,
- description: 'Merge requests merged before this date'
+ required: false,
+ description: 'Merge requests merged before this date'
+ argument :milestone_title, GraphQL::STRING_TYPE,
+ required: false,
+ description: 'Title of the milestone'
+ argument :sort, Types::MergeRequestSortEnum,
+ description: 'Sort merge requests by this criteria',
+ required: false,
+ default_value: 'created_desc'
def self.single
::Resolvers::MergeRequestResolver
diff --git a/app/graphql/resolvers/metrics/dashboard_resolver.rb b/app/graphql/resolvers/metrics/dashboard_resolver.rb
index 05d82ca0f46..18a654c7dc5 100644
--- a/app/graphql/resolvers/metrics/dashboard_resolver.rb
+++ b/app/graphql/resolvers/metrics/dashboard_resolver.rb
@@ -14,7 +14,8 @@ module Resolvers
def resolve(**args)
return unless environment
- ::PerformanceMonitoring::PrometheusDashboard.find_for(project: environment.project, user: context[:current_user], path: args[:path], options: { environment: environment })
+ ::PerformanceMonitoring::PrometheusDashboard
+ .find_for(project: environment.project, user: context[:current_user], path: args[:path], options: { environment: environment })
end
end
end
diff --git a/app/graphql/resolvers/namespace_projects_resolver.rb b/app/graphql/resolvers/namespace_projects_resolver.rb
index e841132eea7..c221cb9aed6 100644
--- a/app/graphql/resolvers/namespace_projects_resolver.rb
+++ b/app/graphql/resolvers/namespace_projects_resolver.rb
@@ -7,19 +7,33 @@ module Resolvers
default_value: false,
description: 'Include also subgroup projects'
+ argument :search, GraphQL::STRING_TYPE,
+ required: false,
+ default_value: nil,
+ description: 'Search project with most similar names or paths'
+
+ argument :sort, Types::Projects::NamespaceProjectSortEnum,
+ required: false,
+ default_value: nil,
+ description: 'Sort projects by this criteria'
+
type Types::ProjectType, null: true
- def resolve(include_subgroups:)
+ def resolve(include_subgroups:, sort:, search:)
# The namespace could have been loaded in batch by `BatchLoader`.
# At this point we need the `id` or the `full_path` of the namespace
# to query for projects, so make sure it's loaded and not `nil` before continuing.
namespace = object.respond_to?(:sync) ? object.sync : object
return Project.none if namespace.nil?
- if include_subgroups
- namespace.all_projects.with_route
+ query = include_subgroups ? namespace.all_projects.with_route : namespace.projects.with_route
+
+ return query unless search.present?
+
+ if sort == :similarity
+ query.sorted_by_similarity_desc(search, include_in_select: true).merge(Project.search(search))
else
- namespace.projects.with_route
+ query.merge(Project.search(search))
end
end
diff --git a/app/graphql/resolvers/project_members_resolver.rb b/app/graphql/resolvers/project_members_resolver.rb
index 3846531762e..1ca4e81f397 100644
--- a/app/graphql/resolvers/project_members_resolver.rb
+++ b/app/graphql/resolvers/project_members_resolver.rb
@@ -1,21 +1,15 @@
# frozen_string_literal: true
module Resolvers
- class ProjectMembersResolver < BaseResolver
- argument :search, GraphQL::STRING_TYPE,
- required: false,
- description: 'Search query'
+ class ProjectMembersResolver < MembersResolver
+ type Types::MemberInterface, null: true
- type Types::ProjectMemberType, null: true
+ authorize :read_project_member
- alias_method :project, :object
-
- def resolve(**args)
- return Member.none unless project.present?
+ private
+ def finder_class
MembersFinder
- .new(project, context[:current_user], params: args)
- .execute
end
end
end
diff --git a/app/graphql/resolvers/project_merge_requests_resolver.rb b/app/graphql/resolvers/project_merge_requests_resolver.rb
new file mode 100644
index 00000000000..0526ccd315f
--- /dev/null
+++ b/app/graphql/resolvers/project_merge_requests_resolver.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class ProjectMergeRequestsResolver < MergeRequestsResolver
+ argument :assignee_username, GraphQL::STRING_TYPE,
+ required: false,
+ description: 'Username of the assignee'
+ argument :author_username, GraphQL::STRING_TYPE,
+ required: false,
+ description: 'Username of the author'
+ end
+end
diff --git a/app/graphql/resolvers/projects_resolver.rb b/app/graphql/resolvers/projects_resolver.rb
index f75f591b381..3bbadf87a71 100644
--- a/app/graphql/resolvers/projects_resolver.rb
+++ b/app/graphql/resolvers/projects_resolver.rb
@@ -12,9 +12,13 @@ module Resolvers
required: false,
description: 'Search query for project name, path, or description'
+ argument :ids, [GraphQL::ID_TYPE],
+ required: false,
+ description: 'Filter projects by IDs'
+
def resolve(**args)
ProjectsFinder
- .new(current_user: current_user, params: project_finder_params(args))
+ .new(current_user: current_user, params: project_finder_params(args), project_ids_relation: parse_gids(args[:ids]))
.execute
end
@@ -27,5 +31,9 @@ module Resolvers
search: params[:search]
}.compact
end
+
+ def parse_gids(gids)
+ gids&.map { |gid| GitlabSchema.parse_gid(gid, expected_type: ::Project).model_id }
+ end
end
end
diff --git a/app/graphql/resolvers/user_starred_projects_resolver.rb b/app/graphql/resolvers/user_starred_projects_resolver.rb
new file mode 100644
index 00000000000..cc3bb90decf
--- /dev/null
+++ b/app/graphql/resolvers/user_starred_projects_resolver.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class UserStarredProjectsResolver < BaseResolver
+ type Types::ProjectType, null: true
+
+ argument :search, GraphQL::STRING_TYPE,
+ required: false,
+ description: 'Search query'
+
+ alias_method :user, :object
+
+ def resolve(**args)
+ StarredProjectsFinder.new(user, params: args, current_user: current_user).execute
+ end
+ end
+end