Skip to content

Instantly share code, notes, and snippets.

@andflett
Created July 27, 2016 17:00
Show Gist options
  • Save andflett/96f2c4177a99c9ac5ceda8181ab981e7 to your computer and use it in GitHub Desktop.
Save andflett/96f2c4177a99c9ac5ceda8181ab981e7 to your computer and use it in GitHub Desktop.
Erply API class with added Bulk requests
require 'json'
require 'net/http'
require 'uri'
class MissingArgumentsException < Exception
end
class VerifyUserException < Exception
end
class EAPI
def initialize(url = nil, clientCode = nil, username = nil, password = nil, sslCACertPath = nil)
@url = url
@clientCode = clientCode
@username = username
@password = password
@sslCACertPath = sslCACertPath
end
#Setters and getters
def url
return @url
end
def url=(url)
@url = url
end
def clientCode
return @clientCode
end
def clientCode=(clientCode)
@clientCode = clientCode
end
def username
return @username
end
def username=(username)
@username = username
end
def password
return @password
end
def password=(password)
@password = password
end
def sslCACertPath
return @sslCACertPath
end
def sslCACertPath=(ssl)
@sslCACertPath=ssl
end
def sendRequest(request, parameters = Hash.new)
if(!@url || !@clientCode || !@username || !@password)
raise MissingArgumentsException.new("Missing parameters")
end
#add extra params
parameters['request'] = request
parameters['clientCode'] = @clientCode
parameters['version'] = '1.0'
parameters['username'] = @username
parameters['password'] = @password
if(request != "verifyUser") then
parameters['sessionKey'] = getSessionKey()
end
#create request
uri = URI.parse(url)
handle = Net::HTTP.new(uri.host,uri.port)
#create errors on timeout
handle.read_timeout = 45
#set up host and cert verification
handle.use_ssl = true
handle.verify_mode = OpenSSL::SSL::VERIFY_NONE
if(@sslCACertPath) then
handle.ca_file = @sslCACertPath
handle.verify_mode = OpenSSL::SSL::VERIFY_PEER
end
#set the payload and run
request = Net::HTTP::Post.new(uri.request_uri)
request.set_form_data(parameters)
response = handle.request(request)
return response.body
end
def sendBulkRequests(requests, parameters = Hash.new)
if(!@url || !@clientCode || !@username || !@password)
raise MissingArgumentsException.new("Missing parameters")
end
#add extra params
parameters['requests'] = requests.to_json
parameters['clientCode'] = @clientCode
parameters['version'] = '1.0'
parameters['username'] = @username
parameters['password'] = @password
parameters['sessionKey'] = getSessionKey()
#create request
uri = URI.parse(url)
handle = Net::HTTP.new(uri.host,uri.port)
#create errors on timeout
handle.read_timeout = 120
#set up host and cert verification
handle.use_ssl = true
handle.verify_mode = OpenSSL::SSL::VERIFY_NONE
if(@sslCACertPath) then
handle.ca_file = @sslCACertPath
handle.verify_mode = OpenSSL::SSL::VERIFY_PEER
end
# Set the payload and run
request = Net::HTTP::Post.new(uri.request_uri)
request.set_form_data(parameters)
response = handle.request(request)
return response.body
end
private
def getSessionKey()
#if no session key or expired, then obtain it
if(!defined?(@session['EAPISessionKey'][@clientCode][@username]) ||
!defined?(@session['EAPISessionKeyExpires'][@clientCode][@username]) ||
@session['EAPISessionKeyExpires'][@clientCode][@username] < Time.now.to_i)
#make request
result = sendRequest("verifyUser", {"username" => @username, "password" => @password})
result = JSON.parse(result)
#Check for errors
if(!defined?(result['records'][0]['sessionKey']))
raise VerifyUserException.new("Verify user failure")
end
@session = {'EAPISessionKey' =>
{
@clientCode => {
@username => result['records'][0]['sessionKey']
}
},
'EAPISessionKeyExpires' =>
{
@clientCode => {
@username => Time.now.to_i + result['records'][0]['sessionLength'] - 30
}
}
}
end
return @session['EAPISessionKey'][@clientCode][@username]
end
end
@andflett
Copy link
Author

Can be used as such:

Erply.sendBulkRequests(
  [
    {
      requestID: 1,
      requestName: 'saveProduct',
      groupID: 156,
      productID: 21,
      name: "something"
    },
    {
      requestID: 2,
      requestName: 'saveProduct',
      groupID: 156,
      productID: 212,
      name: "Oh lol"
    },
  ]
)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment