class RequestHandler
This class is used to handle and send requests via the Brightpearl API. It then takes the responses and adds them to the queue, and logs if necessary TODO - Current Brightpearl Bugged issues include TODO - Api Documentation XML has duplicate parameters in some URLs TODO - Warehouse Location PUT having duplicate {ID} tag TODO - Warehouse Goods-Out Note Delete having duplicate {ID} tag TODO - Warehouse Goods note GET having duplicate {ID-SET} TODO - Product Type Association XML POST URI malformed TODO - Parameters need standardized TODO - API Documentation contains invalid URIs for Developer URIs
Attributes
Public Class Methods
# File lib/handlers/request_handler.rb, line 27 def initialize(appRef,appToken,accID,dataCenter,apiVersion) @currentConnection = Connection.new(appRef,appToken,accID,dataCenter,apiVersion) @requestQueue = Queue.new @responseQueue = Queue.new @requestIncrementID = 0 @throttleTime = 60000 @requestsLeft = nil end
Public Instance Methods
This method is meant to build a URI out of an input resource URI, the parameterName and the value passed from the user/developer
# File lib/handlers/request_handler.rb, line 158 def buildRequestURL(resourceURI,requestType,arrayOfParameters) arrayOfParameters ||= Array[nil] if (arrayOfParameters!= nil && arrayOfParameters.is_a?(Array) == false) puts "Array of values not entered to build request URL, please enter an array of values" end url = 'http://ws-' << @currentConnection.dataCenter<< '.brightpearl.com/' << @currentConnection.apiVersion << '/' << @currentConnection.accountID << resourceURI if(requestType.to_s.casecmp('GET') || requestType.to_s.casecmp('OPTIONS') || requestType.to_s.caseCMP('POST')|| requestType.to_s.casecmp('PATCH') || requestType.to_s.casecmp('PUT') || requestType.to_s.casecmp('DELETE')) uriparameters = url.scan(/{.+?}/)#scans the request string for all paramaters in the URI/URL uriparameters.each_with_index do |x,index| #for each paramater found we replace the value if index == 0 url.gsub!(x,arrayOfParameters[0].to_s) elsif index == 1 url.gsub!(x,arrayOfParameters[1].to_s) else puts "Invalid amount of paramaters specified in URL. Contact Developer/administrator as this application may need updated!" end end end return url end
Calls the Brightpearl API with passed in URI, or with a generated URI if a tailing URI is passed in (See documentation) Accepts parameter array, paremeterArray is the first parameter of the URI, parameterArray is the second. The parameters are used to specify what data you want in your uri. E.G. /order-service/order/100051 would take a parameter array of Array This works with URIs with two parameters as well and should be in the form of Array or similar
# File lib/handlers/request_handler.rb, line 43 def call(resourceURI, requestType,parameterArray = nil,postBody = nil) #Checks if the string includes http or https, if it does this means a full URI was passed in if (resourceURI.downcase["https"] || resourceURI.downcase["http"]) requestToAdd = Request.new(@requestIncrementID,resourceURI,requestType,@currentConnection.accountID,postBody) @requestIncrementID += 1 else requestToAdd = Request.new(@requestIncrementID,buildRequestURL(resourceURI,requestType,parameterArray),requestType,@currentConnection.accountID,postBody) end addRequestToQueue(requestToAdd) if requestToAdd != nil return @requestIncrementID - 1 end
Update method, this method allows you to specify a 'delayTime' in which the function is delayed each run. Default is '1', which means it will sleep 1 second after each run (running once every second where possible) Empties the requestQueue and sends them as HTTP requests based on the type of method (Post, get, etc) Pushes responses to responseQueue TODO: Change this from 'delayTime' to implement rate limiting
# File lib/handlers/request_handler.rb, line 61 def update(delayTime = 1) current = Thread.new do while @requestQueue.length > 0 do requestString = @requestQueue.pop uri = URI(requestString.uri.to_s) Net::HTTP.start(uri.host,uri.port) do |http| puts requestString.requestType.to_s case requestString.requestType when 'post' request = Net::HTTP::Post.new uri request.body = requestString.requestBody request.add_field('brightpearl-app-ref',@currentConnection.appRef) request.add_field('brightpearl-account-token',@currentConnection.appToken) if @apiVersion.to_s.casecmp('use') || @apiVersion.to_s.casecmp('eu1') response = http.request request @requestsLeft = response['Brightpearl-Requests-Remaining'] @throttleTime = response['Brightpearl-Next-Throttle-Period'] @responseQueue.push(Response.new(requestString,response)) else puts 'Error - Invalid datacenter supplied, please enter a valid datacenter.' end when 'get' request = Net::HTTP::Get.new uri request.add_field('brightpearl-app-ref',@currentConnection.appRef) request.add_field('brightpearl-account-token',@currentConnection.appToken) if @apiVersion.to_s.casecmp('use') || @apiVersion.to_s.casecmp('eu1') response = http.request request @requestsLeft = response['Brightpearl-Requests-Remaining'] @throttleTime = response['Brightpearl-Next-Throttle-Period'] @responseQueue.push(Response.new(requestString,response)) else puts 'Error - Invalid datacenter supplied, please enter a valid datacenter.' end when 'patch' request = Net::HTTP::Patch.new uri request.body = requestString.requestBody request.add_field('brightpearl-app-ref',@currentConnection.appRef) request.add_field('brightpearl-account-token',@currentConnection.appToken) if @apiVersion.to_s.casecmp('use') || @apiVersion.to_s.casecmp('eu1') response = http.request request @requestsLeft = response['Brightpearl-Requests-Remaining'] @throttleTime = response['Brightpearl-Next-Throttle-Period'] @responseQueue.push(Response.new(requestString,response)) else puts 'Error - Invalid datacenter supplied, please enter a valid datacenter.' end when 'put' request = Net::HTTP::Put.new uri request.body = requestString.requestBody request.add_field('brightpearl-app-ref',@currentConnection.appRef) request.add_field('brightpearl-account-token',@currentConnection.appToken) if @apiVersion.to_s.casecmp('use') || @apiVersion.to_s.casecmp('eu1') response = http.request request @requestsLeft = response['Brightpearl-Requests-Remaining'] @throttleTime = response['Brightpearl-Next-Throttle-Period'] @responseQueue.push(Response.new(requestString,response)) else puts 'Error - Invalid datacenter supplied, please enter a valid datacenter.' end when 'delete' request = Net::HTTP::Delete.new uri request.body = requestString.requestBody request.add_field('brightpearl-app-ref',@currentConnection.appRef) request.add_field('brightpearl-account-token',@currentConnection.appToken) if @apiVersion.to_s.casecmp('use') || @apiVersion.to_s.casecmp('eu1') response = http.request request @requestsLeft = response['Brightpearl-Requests-Remaining'] @throttleTime = response['Brightpearl-Next-Throttle-Period'] @responseQueue.push(Response.new(requestString,response)) else puts 'Error - Invalid datacenter supplied, please enter a valid datacenter.' end when 'search' request = Net::HTTP::Get.new uri request.add_field('brightpearl-app-ref',@currentConnection.appRef) request.add_field('brightpearl-account-token',@currentConnection.appToken) if @apiVersion.to_s.casecmp('use') || @apiVersion.to_s.casecmp('eu1') response = http.request request @requestsLeft = response['Brightpearl-Requests-Remaining'] @throttleTime = response['Brightpearl-Next-Throttle-Period'] @responseQueue.push(Response.new(requestString,response)) else puts 'Error - Invalid datacenter supplied, please enter a valid datacenter.' end else puts 'Invalid request Type, please input a valid request Type for your request...' end end sleep(delayTime) end end current.join end
Private Instance Methods
This method adds requests to the request queue
# File lib/handlers/request_handler.rb, line 181 def addRequestToQueue(data) @requestQueue.push(data) end