Class: Trevl::DataSource::Api

Inherits:
Base
  • Object
show all
Includes:
HTTParty
Defined in:
lib/trevl/data_source/api.rb

Overview

Generic REST API data source.

Trevl::DataSource.register("my_api", Trevl::DataSource::Api.new(
base_url: "https://api.example.com/v1",
auth: Trevl::Auth::BearerToken.new("my-token")
))

Constant Summary collapse

EMPTY_RESULT =
{"data" => [], "meta" => {}}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#field_names

Constructor Details

#initialize(base_url:, auth: nil, default_resource: nil) ⇒ Api

Returns a new instance of Api.



21
22
23
24
25
26
# File 'lib/trevl/data_source/api.rb', line 21

def initialize(base_url:, auth: nil, default_resource: nil, **)
  super()
  @base_url = base_url.to_s.chomp("/")
  @auth = auth
  @default_resource = default_resource
end

Instance Attribute Details

#base_urlObject (readonly)

Returns the value of attribute base_url.



19
20
21
# File 'lib/trevl/data_source/api.rb', line 19

def base_url
  @base_url
end

Instance Method Details

#fetch(endpoint, params = {}, resource: nil) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/trevl/data_source/api.rb', line 28

def fetch(endpoint, params = {}, resource: nil)
  resource = (resource || @default_resource).to_s
  url = build_url(resource, endpoint)
  headers = build_headers(url)
  body = params.is_a?(Hash) ? params : {}

  Trevl.logger.info("[Trevl::DataSource::Api] POST #{url}")

  response = self.class.post(url, body: body.to_json, headers: headers, timeout: 15)

  unless response.success?
    Trevl.logger.error("[Trevl::DataSource::Api] HTTP #{response.code} from #{url}")
    return EMPTY_RESULT.dup
  end

  parse_response(response.body)
rescue JSON::ParserError, Timeout::Error, Errno::ECONNREFUSED => e
  Trevl.logger.error("[Trevl::DataSource::Api] Error: #{e.message}")
  EMPTY_RESULT.dup
end