class Megaplan::Api

Attributes

endpoint[R]
login[R]
password[R]

Public Class Methods

bad_response(response, parsed_body) click to toggle source
# File lib/megaplan/api.rb, line 171
def bad_response(response, parsed_body)
  puts parsed_body

  if response.class == HTTParty::Response
    raise HTTParty::ResponseError, response
  end
  raise StandardError, (parsed_body['status']['message'] rescue 'unknown error')
end
card(client, query = {}) click to toggle source
# File lib/megaplan/api.rb, line 116
def card(client, query = {})
  make_get_req('card.api', client, query, nil)
end
check_response(response) click to toggle source
# File lib/megaplan/api.rb, line 77
def check_response(response)
  if response.success?
    parsed_body(response)
  else
    bad_response(response, parsed_body(response))
  end
end
create(client, query = {}) click to toggle source
# File lib/megaplan/api.rb, line 120
def create(client, query = {})
  make_post_req('create.api', client, query, nil)
end
custom_get(client, custom_path, query = {}) click to toggle source
# File lib/megaplan/api.rb, line 136
def custom_get(client, custom_path, query = {})
  make_get_req(nil, client, query, custom_path)
end
custom_post(client, custom_path, query = {}) click to toggle source
# File lib/megaplan/api.rb, line 140
def custom_post(client, custom_path, query = {})
  make_post_req(nil, client, query, custom_path)
end
delete(client, query = {}) click to toggle source
# File lib/megaplan/api.rb, line 132
def delete(client, query = {})
  make_post_req('delete.api', client, query, nil)
end
edit(client, query = {}) click to toggle source
# File lib/megaplan/api.rb, line 128
def edit(client, query = {})
  make_post_req('edit.api', client, query, nil)
end
find(client, query) click to toggle source
# File lib/megaplan/api.rb, line 85
def find(client, query)
  output = []
  @arr.each do |item|
    success = if query.keys.all? { |x| item.keys.include? x }
                if query.all? { |k,v| !v.respond_to?(:keys)}
                  query.keys.all? { |i| query[i] == item[i]} ? true : false
                else
                  result = []
                  query.keys.each do |each|
                    result << if query[each].respond_to?(:keys)
                                if query[each].keys.all? { |x| item[each].keys.include? x }
                                   query[each].keys.all?{ |i| query[each][i] == item[each][i] } ? true : false
                                end
                              else
                                true if query[each] == item[each]
                              end
                  end
                  result.uniq == [true] ? true : false
                end
              else
                false
              end
    output << item if success
  end
  output
end
list(client, query = {}) click to toggle source
# File lib/megaplan/api.rb, line 112
def list(client, query = {})
  make_get_req('list.api', client, query, nil)
end
make_get_req(action, client, query, custom_path) click to toggle source
# File lib/megaplan/api.rb, line 151
def make_get_req(action, client, query, custom_path)
  path = resource_path(:get, client, action, custom_path, query)
  headers = client.get_headers(:get, path.gsub('https://', ''))
  response = HTTParty.get(path, headers: headers)
  check_response(response)
end
make_post_req(action, client, query, custom_path) click to toggle source
# File lib/megaplan/api.rb, line 144
def make_post_req(action, client, query, custom_path)
  path = resource_path(:post, client, action, custom_path, query)
  headers = client.get_headers(:post, path.gsub('https://', ''))
  response = HTTParty.post(path, body: query.to_json, headers: headers)
  check_response(response)
end
new(attrs = {}) click to toggle source
# File lib/megaplan/api.rb, line 11
def initialize(attrs = {})
  @endpoint = attrs[:endpoint]
  @login    = attrs[:login]
  @password = attrs[:password]
end
parsed_body(res) click to toggle source
# File lib/megaplan/api.rb, line 60
def parsed_body(res)
  body = JSON.parse(res.body) rescue {}
  if body["status"]["code"] != "error"
    body["data"]
  else
    body
  end
end
query_path(path, query) click to toggle source
# File lib/megaplan/api.rb, line 73
def query_path(path, query)
  path + (query.any? ? "?#{to_query(query)}" : "")
end
resource_path(type, client, action_path, custom_path, query = {}) click to toggle source
# File lib/megaplan/api.rb, line 158
def resource_path(type, client, action_path, custom_path, query = {})
  if custom_path
    url = "https://#{client.initial_path}" << custom_path
  else
    class_name = name.split('::').inject(Object) do |mod, class_name|
      mod.const_get(class_name)
    end
    class_endpoint = class_name.class_endpoint rescue "/"
    url = "https://#{client.initial_path}" << class_endpoint << action_path
  end
  query_path(url, query)
end
save(client, query = {}) click to toggle source
# File lib/megaplan/api.rb, line 124
def save(client, query = {})
  make_post_req('save.api', client, query, nil)
end
to_query(params) click to toggle source
# File lib/megaplan/api.rb, line 69
def to_query(params)
  params.to_a.map { |x| "#{CGI.escape(x[0].to_s)}=#{CGI.escape(x[1].to_s)}" }.join("&")
end

Public Instance Methods

auth_params() click to toggle source
# File lib/megaplan/api.rb, line 26
def auth_params
  require 'digest/md5'
  { Login: login, Password: Digest::MD5.hexdigest(password) }
end
auth_path() click to toggle source
# File lib/megaplan/api.rb, line 31
def auth_path
  "https://" + initial_path + "/BumsCommonApiV01/User/authorize.api"
end
authenticate() click to toggle source
# File lib/megaplan/api.rb, line 17
def authenticate
  response = HTTParty.get(auth_path, :query => auth_params)
  if response.success?
    parsed_body(response)
  else
    bad_response(response, parsed_body(response), auth_params)
  end
end
create_signature(type, key, date, path) click to toggle source
# File lib/megaplan/api.rb, line 50
def create_signature(type, key, date, path)
  require 'cgi'
  require 'openssl'

  data = "#{type == :get ? "GET" : "POST"}\n\napplication/json\n#{date}\n#{path}"
  Base64.strict_encode64(OpenSSL::HMAC.hexdigest('sha1', key, data))
end
get_headers(type, path) click to toggle source
# File lib/megaplan/api.rb, line 39
def get_headers(type, path)
  attrs = authenticate
  secret_key = attrs['SecretKey']
  date = Time.now.rfc2822
  { "Date"=> date,
    "Accept"=> "application/json",
    "Content-Type" => "application/json",
    "X-Authorization" => "#{attrs['AccessId']}:#{create_signature(type, secret_key, date, path)}"
  }
end
initial_path() click to toggle source
# File lib/megaplan/api.rb, line 35
def initial_path
  "#{endpoint}.megaplan.ru"
end