Sha256: dbfa3de338afd313eb44a87ad328b3faceefa68faecb5045d4dc71ce5cab6627

Contents?: true

Size: 1.63 KB

Versions: 2

Compression:

Stored size: 1.63 KB

Contents

require 'vng/connection_error'
require 'vng/error'

module Vng
  # Provides an abstract class for every Vonigo resource.
  class Resource
  private
    def self.request(path:, body: {}, query: {}, include_security_token: true)
      uri = URI::HTTPS.build host: host, path: path
      uri.query = URI.encode_www_form(query) if query.any?

      method = query.any? ? Net::HTTP::Get : Net::HTTP::Post
      request = method.new uri.request_uri
      request.initialize_http_header 'Content-Type' => 'application/json'

      if query.none?
        body = body.merge(securityToken: security_token) if include_security_token
        request.body = body.to_json
      end

      response = instrument do |data|
        data[:response] = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
          http.request request
        end
      end

      JSON(response.body).tap do |data|
        raise Vng::Error, "#{data['errMsg']} #{data['Errors']}" unless data['errNo'].zero?
      end
    rescue Errno::ECONNREFUSED, SocketError => e
      raise Vng::ConnectionError, e.message
    end

    def self.host
      Vng.configuration.host
    end

    def self.security_token
      Vng.configuration.security_token
    end

    def self.value_for_field(data, field_id)
      field = data['Fields'].find { |field| field['fieldID'] == field_id }
      field['fieldValue'] if field
    end

    def self.instrument(&block)
      data = {class_name: name} # TODO: Add path, query, ...
      if defined?(ActiveSupport::Notifications)
        ActiveSupport::Notifications.instrument 'Vng.request', data, &block
      else
        block.call(data)
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
vng-1.2.0 lib/vng/resource.rb
vng-1.1.0 lib/vng/resource.rb