1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
# frozen_string_literal: true
module Resolvers
class ProjectsResolver < BaseResolver
include ProjectSearchArguments
include LooksAhead
type Types::ProjectType.connection_type, null: true
argument :ids, [GraphQL::Types::ID],
required: false,
description: 'Filter projects by IDs.'
argument :full_paths, [GraphQL::Types::String],
required: false,
description: 'Filter projects by full paths. You cannot provide more than 50 full paths.'
argument :with_issues_enabled, GraphQL::Types::Boolean,
required: false,
description: "Return only projects with issues enabled."
argument :with_merge_requests_enabled, GraphQL::Types::Boolean,
required: false,
description: "Return only projects with merge requests enabled."
argument :archived, ::Types::Projects::ArchivedEnum,
required: false,
description: 'Filter projects by archived status.'
argument :min_access_level, ::Types::AccessLevelEnum,
required: false,
description: 'Return only projects where current user has at least the specified access level.'
argument :programming_language_name, GraphQL::Types::String,
required: false,
description: 'Filter projects by programming language name (case insensitive). For example: "css" or "ruby".'
def resolve_with_lookahead(**args)
validate_args!(args)
projects = ProjectsFinder
.new(current_user: current_user, params: finder_params(args), project_ids_relation: parse_gids(args[:ids]))
.execute
apply_lookahead(projects)
end
private
def validate_args!(args)
return unless args[:full_paths].present? && args[:full_paths].length > 50
raise Gitlab::Graphql::Errors::ArgumentError, 'You cannot provide more than 50 full_paths'
end
def unconditional_includes
[:creator, :group, :invited_groups, :project_setting]
end
def preloads
{
full_path: [:route],
topics: [:topics],
import_status: [:import_state],
service_desk_address: [:project_feature, :service_desk_setting],
jira_import_status: [:jira_imports],
container_repositories: [:container_repositories],
container_repositories_count: [:container_repositories],
web_url: { namespace: [:route] },
is_catalog_resource: [:catalog_resource]
}
end
def finder_params(args)
{
**project_finder_params(args),
with_issues_enabled: args[:with_issues_enabled],
with_merge_requests_enabled: args[:with_merge_requests_enabled],
full_paths: args[:full_paths],
archived: args[:archived],
min_access_level: args[:min_access_level],
language_name: args[:programming_language_name]
}
end
def parse_gids(gids)
gids&.map { |gid| GitlabSchema.parse_gid(gid, expected_type: ::Project).model_id }
end
end
end
Resolvers::ProjectsResolver.prepend_mod_with('Resolvers::ProjectsResolver')
|