Class: BulkImports::Clients::HTTP

Inherits:
Object
  • Object
show all
Includes:
Gitlab::Utils::StrongMemoize
Defined in:
lib/bulk_imports/clients/http.rb

Constant Summary collapse

API_VERSION =
'v4'
DEFAULT_PAGE =
1
DEFAULT_PER_PAGE =
30
PAT_ENDPOINT_MIN_VERSION =
'15.5.0'
SIDEKIQ_REQUEST_TIMEOUT =
60

Instance Method Summary collapse

Constructor Details

#initialize(url:, token:, page: DEFAULT_PAGE, per_page: DEFAULT_PER_PAGE, api_version: API_VERSION) ⇒ HTTP

Returns a new instance of HTTP.



14
15
16
17
18
19
20
21
# File 'lib/bulk_imports/clients/http.rb', line 14

def initialize(url:, token:, page: DEFAULT_PAGE, per_page: DEFAULT_PER_PAGE, api_version: API_VERSION)
  @url = url
  @token = token&.strip
  @page = page
  @per_page = per_page
  @api_version = api_version
  @compatible_instance_version = false
end

Instance Method Details

#compatible_for_project_migration?Boolean

Returns:

  • (Boolean)


67
68
69
# File 'lib/bulk_imports/clients/http.rb', line 67

def compatible_for_project_migration?
  instance_version >= BulkImport.min_gl_version_for_project_migration
end

#each_page(method, resource, query = {}, &block) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/bulk_imports/clients/http.rb', line 39

def each_page(method, resource, query = {}, &block)
  return to_enum(__method__, method, resource, query) unless block

  next_page = @page

  while next_page
    @page = next_page.to_i

    response = self.public_send(method, resource, query) # rubocop: disable GitlabSecurity/PublicSend
    collection = response.parsed_response
    next_page = response.headers['x-next-page'].presence

    yield collection
  end
end

#get(resource, query = {}) ⇒ Object



23
24
25
# File 'lib/bulk_imports/clients/http.rb', line 23

def get(resource, query = {})
  request(:get, resource, query: query.reverse_merge(request_query))
end

#head(resource) ⇒ Object



31
32
33
# File 'lib/bulk_imports/clients/http.rb', line 31

def head(resource)
  request(:head, resource)
end

#instance_enterpriseObject



63
64
65
# File 'lib/bulk_imports/clients/http.rb', line 63

def instance_enterprise
  Gitlab::Utils.to_boolean(['enterprise'], default: true)
end

#instance_versionObject



59
60
61
# File 'lib/bulk_imports/clients/http.rb', line 59

def instance_version
  Gitlab::VersionInfo.parse(['version'])
end

#optionsObject



71
72
73
# File 'lib/bulk_imports/clients/http.rb', line 71

def options
  { headers: { 'Content-Type' => 'application/json' }, query: { private_token: @token } }
end

#post(resource, body = {}) ⇒ Object



27
28
29
# File 'lib/bulk_imports/clients/http.rb', line 27

def post(resource, body = {})
  request(:post, resource, body: body)
end

#resource_url(resource) ⇒ Object



55
56
57
# File 'lib/bulk_imports/clients/http.rb', line 55

def resource_url(resource)
  Gitlab::Utils.append_path(api_url, resource)
end

#stream(resource, &block) ⇒ Object



35
36
37
# File 'lib/bulk_imports/clients/http.rb', line 35

def stream(resource, &block)
  request(:get, resource, stream_body: true, &block)
end

#validate_import_scopes!Object



75
76
77
78
79
80
81
82
83
84
85
# File 'lib/bulk_imports/clients/http.rb', line 75

def validate_import_scopes!
  return true unless instance_version >= ::Gitlab::VersionInfo.parse(PAT_ENDPOINT_MIN_VERSION)

  response = with_error_handling do
    Gitlab::HTTP.get(resource_url("personal_access_tokens/self"), options)
  end

  return true if response['scopes']&.include?('api')

  raise ::BulkImports::Error.scope_validation_failure
end

#validate_instance_version!Object



87
88
89
90
91
92
93
# File 'lib/bulk_imports/clients/http.rb', line 87

def validate_instance_version!
  raise ::BulkImports::Error.invalid_url unless instance_version.valid?

  return true unless instance_version.major < BulkImport::MIN_MAJOR_VERSION

  raise ::BulkImports::Error.unsupported_gitlab_version
end