class DadataMetro::Search

Attributes

api_token[R]

Public Class Methods

new(api_token:) click to toggle source
# File lib/dadata_metro/search.rb, line 10
def initialize(api_token:)
  @api_token = api_token
end

Public Instance Methods

call(query:, filters: nil) click to toggle source
# File lib/dadata_metro/search.rb, line 14
def call(query:, filters: nil)
  check_api_token
  check_query(query)
  check_filters(filters)

  JSON.parse(request(query, filters))
end

Private Instance Methods

check_api_token() click to toggle source
# File lib/dadata_metro/search.rb, line 58
def check_api_token
  raise ArgumentError, 'api_token is required' unless api_token
end
check_filters(filters) click to toggle source
# File lib/dadata_metro/search.rb, line 47
def check_filters(filters)
  return unless filters
  raise ArgumentError, 'filters should be array' unless filters.is_a?(Array)
  filters.each do |field|
    pp field.keys.first
    key = field.keys.first
    next if Constants::FILTERS_FIELDS.include? key
    raise ArgumentError, "filter field #{key} not supported"
  end
end
check_query(query) click to toggle source
# File lib/dadata_metro/search.rb, line 42
def check_query(query)
  raise ArgumentError, 'query is required' unless query
  raise ArgumentError, 'query is too long' if query.length > Constants::QUERY_MAX_LENGTH
end
request(query, filters) click to toggle source
# File lib/dadata_metro/search.rb, line 28
def request(query, filters)
  req = Net::HTTP::Post.new(url)

  req['Content-Type'] = 'application/json'
  req['Accept'] = 'application/json'
  req['Authorization'] = "Token #{api_token}"

  req.body = { query: query, filters: filters }.to_json

  http = Net::HTTP.new(url.host, url.port)
  http.use_ssl = true
  http.request(req).body.force_encoding('UTF-8')
end
url() click to toggle source
# File lib/dadata_metro/search.rb, line 24
def url
  URI(Constants::BASE_URL)
end