lib/connectors/gitlab/extractor.rb (49 lines of code) (raw):
#
# Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
# or more contributor license agreements. Licensed under the Elastic License;
# you may not use this file except in compliance with the Elastic License.
#
# frozen_string_literal: true
require 'hashie'
require 'json'
require 'rack/utils'
require 'active_support/core_ext/hash/indifferent_access'
require 'connectors/gitlab/custom_client'
module Connectors
module GitLab
class Extractor
PAGE_SIZE = 100 # max is 100
def initialize(base_url: nil, api_token: nil, owned_only: true)
super()
@base_url = base_url
@api_token = api_token
# only get projects that user owns
@owned_only = owned_only
end
def yield_projects_page(next_page_link = nil)
query_params = {
:pagination => :keyset,
:per_page => PAGE_SIZE,
:order_by => :id,
:sort => :desc,
:owned => @owned_only
}
if next_page_link.present?
if (matcher = /(https?:[^>]*)/.match(next_page_link))
clean_query = URI.parse(matcher.captures[0]).query
query_params = Rack::Utils.parse_query(clean_query)
else
raise "Next page link has unexpected format: #{next_page_link}"
end
end
response = client.get('projects', query_params)
projects_chunk = JSON.parse(response.body)
yield projects_chunk
# return next link
response.headers['Link'] || nil
end
def health_check
# let's do a simple call to get the current user
response = client.get('user')
unless response.present? && response.status == 200
raise "Health check failed with response status #{response.status} and body #{response.body}"
end
end
private
def client
@client ||= Connectors::GitLab::CustomClient.new(base_url: @base_url, api_token: @api_token)
end
end
end
end