module StarkBank::Utils::Request
Public Class Methods
fetch(method:, path:, payload: nil, query: nil, user: nil)
click to toggle source
# File lib/utils/request.rb, line 25 def self.fetch(method:, path:, payload: nil, query: nil, user: nil) user = Checks.check_user(user) language = Checks.check_language base_url = { Environment::PRODUCTION => 'https://api.starkbank.com/', Environment::SANDBOX => 'https://sandbox.api.starkbank.com/' }[user.environment] + 'v2' url = "#{base_url}/#{path}#{StarkBank::Utils::URL.urlencode(query)}" uri = URI(url) access_time = Time.now.to_i body = payload.nil? ? '' : payload.to_json message = "#{user.access_id}:#{access_time}:#{body}" signature = EllipticCurve::Ecdsa.sign(message, user.private_key).toBase64 case method when 'GET' req = Net::HTTP::Get.new(uri) when 'DELETE' req = Net::HTTP::Delete.new(uri) when 'POST' req = Net::HTTP::Post.new(uri) req.body = body when 'PATCH' req = Net::HTTP::Patch.new(uri) req.body = body when 'PUT' req = Net::HTTP::Put.new(uri) req.body = body else raise(ArgumentError, 'unknown HTTP method ' + method) end req['Access-Id'] = user.access_id req['Access-Time'] = access_time req['Access-Signature'] = signature req['Content-Type'] = 'application/json' req['User-Agent'] = "Ruby-#{RUBY_VERSION}-SDK-2.6.0" req['Accept-Language'] = language request = Net::HTTP.start(uri.hostname, use_ssl: true) { |http| http.request(req) } response = Response.new(Integer(request.code, 10), request.body) raise(StarkBank::Error::InternalServerError) if response.status == 500 raise(StarkBank::Error::InputErrors, response.json['errors']) if response.status == 400 raise(StarkBank::Error::UnknownError, response.content) unless response.status == 200 response end