58 lines
1.6 KiB
Ruby
58 lines
1.6 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Resolvers
|
||
|
class PackagePipelinesResolver < BaseResolver
|
||
|
include Gitlab::Graphql::Authorize::AuthorizeResource
|
||
|
|
||
|
type Types::Ci::PipelineType.connection_type, null: true
|
||
|
extension Gitlab::Graphql::Extensions::ExternallyPaginatedArrayExtension
|
||
|
|
||
|
authorizes_object!
|
||
|
authorize :read_pipeline
|
||
|
|
||
|
alias_method :package, :object
|
||
|
|
||
|
def resolve(first: nil, last: nil, after: nil, before: nil, lookahead:)
|
||
|
finder = ::Packages::BuildInfosFinder.new(
|
||
|
package,
|
||
|
first: first,
|
||
|
last: last,
|
||
|
after: decode_cursor(after),
|
||
|
before: decode_cursor(before),
|
||
|
max_page_size: context.schema.default_max_page_size,
|
||
|
support_next_page: lookahead.selects?(:page_info)
|
||
|
)
|
||
|
|
||
|
build_infos = finder.execute
|
||
|
|
||
|
# this .pluck_pipeline_ids can load max 101 pipelines ids
|
||
|
::Ci::Pipeline.id_in(build_infos.pluck_pipeline_ids)
|
||
|
end
|
||
|
|
||
|
# we manage the pagination manually, so opt out of the connection field extension
|
||
|
def self.field_options
|
||
|
super.merge(
|
||
|
connection: false,
|
||
|
extras: [:lookahead]
|
||
|
)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def decode_cursor(encoded)
|
||
|
return unless encoded
|
||
|
|
||
|
decoded = Gitlab::Json.parse(context.schema.cursor_encoder.decode(encoded, nonce: true))
|
||
|
id_from_cursor(decoded)
|
||
|
rescue JSON::ParserError
|
||
|
raise Gitlab::Graphql::Errors::ArgumentError, "Please provide a valid cursor"
|
||
|
end
|
||
|
|
||
|
def id_from_cursor(cursor)
|
||
|
cursor&.fetch('id')
|
||
|
rescue KeyError
|
||
|
raise Gitlab::Graphql::Errors::ArgumentError, "Please provide a valid cursor"
|
||
|
end
|
||
|
end
|
||
|
end
|