Class: Ecoportal::API::Common::Client

Inherits:
Object
  • Object
show all
Includes:
ElasticApmIntegration
Defined in:
lib/ecoportal/api/common/client.rb

Overview

Note:
  • You can see the documentation of the HTTP module in the repository
    • it does extend the module Chainable (chainable.rb),
    • where all the http requests are dev by using HTTP::Client#request (client.rb)
    • which calls build_request (new HTTP::Request) and perform (new HTTP::Connection)
    • to return HTTP::Response (response.rb)

Constant Summary collapse

DELAY_REQUEST_RETRY =
5
RETRY_ATTEMPTS =
5

Constants included from ElasticApmIntegration

ElasticApmIntegration::APM_SERVICE_NAME

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ElasticApmIntegration

#log_unexpected_server_error

Constructor Details

#initialize(api_key:, version: "v1", host: "live.ecoportal.com", logger: nil, response_logging: false) ⇒ Client

Note:

the api_key will be automatically added as parameter X-ApiKey in the header of the http requests.

Returns an object that holds the configuration of the api connection.

Parameters:

  • api_key (String)

    the key version to stablish the api connection.

  • version (String) (defaults to: "v1")

    it is part of the base url and will determine the api version we query against.

  • host (String) (defaults to: "live.ecoportal.com")

    api server domain.

  • logger (Logger) (defaults to: nil)

    an object with Logger interface to generate logs.

  • response_logging (Boolean) (defaults to: false)

    whether or not batch responses should be logged



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/ecoportal/api/common/client.rb', line 33

def initialize(api_key:, version: "v1", host: "live.ecoportal.com", logger: nil, response_logging: false)
  @version  = version
  @api_key  = api_key
  @logger   = logger
  @host     = host
  @response_logging_enabled = response_logging

  if host.match(/^localhost|^127\.0\.0\.1/)
    @base_uri = "http://#{host}/api/"
  else
    @base_uri = "https://#{host}/api/"
  end
  log(:info) { "#{version} client initialized pointing at #{host}" }

  return unless @api_key.nil? || @api_key.match(/\A\W*\z/)

  log(:error) { "Api-key missing!" }
end

Instance Attribute Details

#hostString (readonly)

the remote target server.

Returns:

  • (String)

    the current value of host



18
19
20
# File 'lib/ecoportal/api/common/client.rb', line 18

def host
  @host
end

#loggerLogger

the logger.

Returns:

  • (Logger)

    the current value of logger



18
19
20
# File 'lib/ecoportal/api/common/client.rb', line 18

def logger
  @logger
end

Instance Method Details

#base_requestHTTP

Note:

It configures HTTP so it only allows body data in json format.

Creates a HTTP object adding the X-ApiKey or X-ECOPORTAL-API-KEY param to the header, depending on the API version.

Returns:

  • (HTTP)

    HTTP object.



141
142
143
144
145
146
147
148
149
# File 'lib/ecoportal/api/common/client.rb', line 141

def base_request
  @base_request ||=
    case @version
    when "v2"
      HTTP.headers("X-ECOPORTAL-API-KEY" => @api_key).accept(:json)
    else
      HTTP.headers("X-ApiKey" => @api_key).accept(:json)
    end
end

#delete(path) ⇒ Common::Reponse

Sends an http DELETE request against the api version using path to complete the base url.

Parameters:

  • path (String)

    the tail that completes the url of the request.

Returns:

  • (Common::Reponse)

    the basic custom response object.



112
113
114
115
116
117
118
# File 'lib/ecoportal/api/common/client.rb', line 112

def delete(path)
  instrument("DELETE", path) do
    request do |http|
      http.delete(url_for(path))
    end
  end
end

#get(path, params: {}) ⇒ Common::Reponse

Sends an http GET request against the api version using path to complete the base url, and adding the key_value pairs of params in the http header.

Parameters:

  • path (String)

    the tail that completes the url of the request.

  • params (Hash) (defaults to: {})

    the header paramters of the http request (not including the api key).

Options Hash (params:):

  • :page (String)

    the current page we are requesting with given the :per_page offset.

  • :per_page (String)

    the offset or the number of entries you get per request.

  • :q (String)

    some text to search. Omit this parameter to target all the entries.

Returns:

  • (Common::Reponse)

    the basic custom response object.



73
74
75
76
77
78
79
# File 'lib/ecoportal/api/common/client.rb', line 73

def get(path, params: {})
  instrument("GET", path, params) do
    request do |http|
      http.get(url_for(path), params: params)
    end
  end
end

#log(level) { ... } ⇒ Object

Logger interface. @example: log(:info) information on what's going on" log(:warn) is a warning that something is likely to have gone amiss" log(:error) went wrong" log(:fatal) unrecoverable error has happend"

Parameters:

  • level (Symbol)

    the level that the message should be logged.

Yields:

  • [] generates the message.

Yield Returns:

  • (String)

    the generated message.



61
62
63
# File 'lib/ecoportal/api/common/client.rb', line 61

def log(level, &block)
  logger&.send(level, &block)
end

#patch(path, data:) ⇒ Common::Reponse

Note:

it automatically adds the http header param Content-Type as application/json

Sends an http PATCH request against the api version using path to complete the base url, and the data as a body of the http request.

Parameters:

  • path (String)

    the tail that completes the url of the request.

  • data (String)

    the body of the query in json format.

Returns:

  • (Common::Reponse)

    the basic custom response object.



101
102
103
104
105
106
107
# File 'lib/ecoportal/api/common/client.rb', line 101

def patch(path, data:)
  instrument("PATCH", path, data) do
    request do |http|
      http.patch(url_for(path), json: data)
    end
  end
end

#post(path, data:) ⇒ Common::Reponse

Note:

it automatically adds the http header param Content-Type as application/json

Sends an http POST request against the api version using path to complete the base url, and the data as a body of the http request.

Parameters:

  • path (String)

    the tail that completes the url of the request.

  • data (String)

    the body of the query in json format.

Returns:

  • (Common::Reponse)

    the basic custom response object.



87
88
89
90
91
92
93
# File 'lib/ecoportal/api/common/client.rb', line 87

def post(path, data:)
  instrument("POST", path, data) do
    request do |http|
      http.post(url_for(path), json: data)
    end
  end
end

#request {|http| ... } ⇒ Common::Reponse

Allows to launch a different operation via block, providing the basic HTTP connection to the block.

Yields:

  • (http)

    launch specific http request.

Yield Parameters:

  • http (HTTP)

    the http connection.

Yield Returns:

Returns:

  • (Common::Reponse)

    the basic custom response object.



126
127
128
# File 'lib/ecoportal/api/common/client.rb', line 126

def request
  wrap_response yield(base_request)
end

#url_for(path) ⇒ String

Full URl builder of the request

Parameters:

  • path (String)

    the tail that completes the url of the request.

Returns:

  • (String)

    the final url.



154
155
156
# File 'lib/ecoportal/api/common/client.rb', line 154

def url_for(path)
  @base_uri+@version+path
end

#wrap_response(response) ⇒ Common::Reponse

Wrap with basic custom object of the gem for responses.

Parameters:

  • response (HTTP::Response)

Returns:

  • (Common::Reponse)

    the basic custom response object.



133
134
135
# File 'lib/ecoportal/api/common/client.rb', line 133

def wrap_response(response)
  Ecoportal::API::Common::Response.new(response)
end