class Pina::RestAdapter

Constants

REQUEST_TIMEOUT
SERVICE_UNAVAILABLE

Public Class Methods

delete(resource, id = nil) click to toggle source
# File lib/pina/rest_adapter.rb, line 23
def delete(resource, id = nil)
  net_http_for(:delete, resource, id)
end
get(resource, id_or_params = nil) click to toggle source
# File lib/pina/rest_adapter.rb, line 11
def get(resource, id_or_params = nil)
  net_http_for(:get, resource, id_or_params)
end
patch(resource, id, payload) click to toggle source
# File lib/pina/rest_adapter.rb, line 19
def patch(resource, id, payload)
  net_http_for(:patch, resource, id, payload, multipart: false)
end
post(resource, payload, multipart: false) click to toggle source
# File lib/pina/rest_adapter.rb, line 15
def post(resource, payload, multipart: false)
  net_http_for(:post, resource, nil, payload, multipart: multipart)
end

Private Class Methods

auth_header() click to toggle source
# File lib/pina/rest_adapter.rb, line 56
def auth_header
  {
    'Authorization' => 'Basic ' + Base64
                                  .strict_encode64("#{Pina.configuration.email}:#{Pina.configuration.api_token}")
  }
end
headers() click to toggle source
# File lib/pina/rest_adapter.rb, line 63
def headers
  auth_header.merge('Accept-Encoding' => 'application/json',
                    'Content-Type' => 'application/json')
end
multipart_payload(payload) click to toggle source
# File lib/pina/rest_adapter.rb, line 85
def multipart_payload(payload)
  return payload unless payload.is_a? Hash

  payload.map do |key, val|
    next unless val.respond_to?(:path)

    payload[key] = UploadIO.new(val, 'application/pdf', val.path.split('/').last)
  end

  payload
end
multipart_request(uri, payload) click to toggle source
# File lib/pina/rest_adapter.rb, line 77
def multipart_request(uri, payload)
  request = Net::HTTP::Post::Multipart.new uri, multipart_payload(payload)
  auth_header.each do |k, v|
    request[k] = v
  end
  request
end
net_http_class_for(method) click to toggle source
# File lib/pina/rest_adapter.rb, line 52
def net_http_class_for(method)
  Kernel.const_get("Net::HTTP::#{method.capitalize}")
end
net_http_for(method, resource, id, payload = nil, multipart: false) click to toggle source
# File lib/pina/rest_adapter.rb, line 29
def net_http_for(method, resource, id, payload = nil, multipart: false)
  raise ConfigurationNotSet unless Pina.configuration

  uri = URI(url(resource, id))
  request = multipart ? multipart_request(uri, payload) : request(uri, method, payload)

  begin
    response = Net::HTTP.start(uri.hostname,
                               uri.port,
                               use_ssl: Pina.configuration.use_ssl) do |http|
      http.request(request)
    end
  rescue SocketError
    return Pina::Models::Error.new(status_code: SERVICE_UNAVAILABLE,
                                   message: "služba nedostupná - #{Pina.configuration.api_host}")
  rescue Net::ReadTimeout
    return Pina::Models::Error.new(status_code: REQUEST_TIMEOUT,
                                   message: "služba neodpovídá - #{Pina.configuration.api_host}")
  end

  Response.new(response.code.to_i, response.body)
end
prepare_params_for_request(params) click to toggle source
# File lib/pina/rest_adapter.rb, line 108
def prepare_params_for_request(params)
  params.map { |key, value| "#{URI.escape(key.to_s)}=#{URI.escape(value.to_s)}" }.join('&')
end
request(uri, method, payload) click to toggle source
# File lib/pina/rest_adapter.rb, line 68
def request(uri, method, payload)
  request = net_http_class_for(method).new(uri)
  headers.each do |k, v|
    request[k] = v
  end
  request.body = payload.to_json if payload
  request
end
resource_with_namespace(*resource) click to toggle source
# File lib/pina/rest_adapter.rb, line 112
def resource_with_namespace(*resource)
  resource.join('/')
end
url(resource, id_or_params) click to toggle source
# File lib/pina/rest_adapter.rb, line 97
def url(resource, id_or_params)
  resource = resource_with_namespace(resource)

  if id_or_params.is_a? Hash
    params = prepare_params_for_request(id_or_params)
    Pina.configuration.base_url + "#{resource}?#{params}"
  else
    Pina.configuration.base_url + "#{resource}/#{id_or_params}"
  end
end