diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 04:45:44 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 04:45:44 +0300 |
commit | 85dc423f7090da0a52c73eb66faf22ddb20efff9 (patch) | |
tree | 9160f299afd8c80c038f08e1545be119f5e3f1e1 /app/graphql/resolvers | |
parent | 15c2c8c66dbe422588e5411eee7e68f1fa440bb8 (diff) |
Add latest changes from gitlab-org/gitlab@13-4-stable-ee
Diffstat (limited to 'app/graphql/resolvers')
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 |