2021-04-29 21:17:54 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module Resolvers
|
|
|
|
class BlobsResolver < BaseResolver
|
|
|
|
include Gitlab::Graphql::Authorize::AuthorizeResource
|
|
|
|
|
|
|
|
type Types::Tree::BlobType.connection_type, null: true
|
|
|
|
authorize :download_code
|
|
|
|
calls_gitaly!
|
|
|
|
|
|
|
|
alias_method :repository, :object
|
|
|
|
|
2021-10-27 15:23:28 +05:30
|
|
|
argument :paths, [GraphQL::Types::String],
|
2021-04-29 21:17:54 +05:30
|
|
|
required: true,
|
|
|
|
description: 'Array of desired blob paths.'
|
2021-10-27 15:23:28 +05:30
|
|
|
argument :ref, GraphQL::Types::String,
|
2021-04-29 21:17:54 +05:30
|
|
|
required: false,
|
|
|
|
default_value: nil,
|
2021-10-27 15:23:28 +05:30
|
|
|
description: 'Commit ref to get the blobs from. Default value is HEAD.'
|
2021-04-29 21:17:54 +05:30
|
|
|
|
|
|
|
# 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.
|
|
|
|
def self.resolver_complexity(args, child_complexity:)
|
|
|
|
super + (args[:paths] || []).size
|
|
|
|
end
|
|
|
|
|
|
|
|
def resolve(paths:, ref:)
|
|
|
|
authorize!(repository.container)
|
|
|
|
|
|
|
|
return [] if repository.empty?
|
|
|
|
|
|
|
|
ref ||= repository.root_ref
|
2022-05-07 20:08:51 +05:30
|
|
|
validate_ref(ref)
|
2021-04-29 21:17:54 +05:30
|
|
|
|
|
|
|
repository.blobs_at(paths.map { |path| [ref, path] })
|
|
|
|
end
|
2022-05-07 20:08:51 +05:30
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def validate_ref(ref)
|
|
|
|
unless Gitlab::GitRefValidator.validate(ref)
|
|
|
|
raise Gitlab::Graphql::Errors::ArgumentError, 'Ref is not valid'
|
|
|
|
end
|
|
|
|
end
|
2021-04-29 21:17:54 +05:30
|
|
|
end
|
|
|
|
end
|