PrimeHammer/gopay-ruby

View on GitHub
lib/gopay/client.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'rest-client'

module GoPay
  class Client
    def initialize(config)
      @config = config
    end

    def request(method, path, body_parameters: {})
      token = token get_token_scope(method, path)
      content_type = get_content_type(path)
      body_parameters = content_type == 'application/json' ? body_parameters.to_json : body_parameters
      begin
        response = RestClient::Request.execute(method: method, url: @config[:gate]+path, payload: body_parameters, headers: { "Accept" => "application/json", "Content-Type" => content_type, "Authorization" => "Bearer #{token}" })
      rescue RestClient::ExceptionWithResponse => e
        raise Error.handle_gopay_error(e.response)
      end

      unless response.code == 200
        raise Error.handle_gopay_error(response)
      end

      JSON.parse response.body
    end

    private

    def get_token_scope(method, path)
      if method == :post && path == '/api/payments/payment'
        'payment-create'
      else
        'payment-all'
      end
    end

    def get_content_type(path)
      if (path == '/api/payments/payment') || (path =~ /create-recurrence/)
        'application/json'
      else
        'application/x-www-form-urlencoded'
      end
    end

    # payment-create - for new payment
    # payment-all - for testing state etc
    def token(scope = 'payment-create')
      response = RestClient.post(
        "#{@config[:gate]}/api/oauth2/token",
        { grant_type: 'client_credentials',
          scope: scope,
        },
        {
          "Accept" => "application/json",
          "Content-Type" => "application/x-www-form-urlencoded",
          "Authorization" => "Basic #{Base64.encode64(@config[:client_id] + ':' + @config[:client_secret])}"
        })
      JSON.parse(response.body)["access_token"]
    end
   
  end
end