voucherifyio/voucherify-ruby-sdk

View on GitHub
lib/voucherify/client.rb

Summary

Maintainability
A
2 hrs
Test Coverage
require 'uri'
require 'rest-client'
require 'json'

module Voucherify

  class Client
    attr_reader :backend_url

    def initialize (options)
      @options = options
      @backend_url = (@options[:apiUrl] || @options['apiUrl'] || 'https://api.voucherify.io') + '/v1'
      @headers = {
          'X-App-Id' => @options[:applicationId] || @options['applicationId'],
          'X-App-Token' => @options[:clientSecretKey] || @options['clientSecretKey'],
          'X-Voucherify-Channel' => 'Ruby-SDK',
          'X-Voucherify-API-Version' => @options[:apiVersion] || @options['apiVersion'] || 'v2018-08-01',
          :accept => :json,
      }.reject{ |k,v| v.nil? }
      @timeout = @options[:timeout] || @options['timeout']
    end

    def async_actions
      Voucherify::Service::AsyncActions.new(self)
    end

    def vouchers
      Voucherify::Service::Vouchers.new(self)
    end

    def distributions
      Voucherify::Service::Distributions.new(self)
    end

    def validations
      Voucherify::Service::Validations.new(self)
    end

    def redemptions
      Voucherify::Service::Redemptions.new(self)
    end

    def customers
      Voucherify::Service::Customers.new(self)
    end

    def products
      Voucherify::Service::Products.new(self)
    end

    def campaigns
      Voucherify::Service::Campaigns.new(self)
    end

    def validation_rules
      Voucherify::Service::ValidationRules.new(self)
    end

    def segments
      Voucherify::Service::Segments.new(self)
    end

    def events
      Voucherify::Service::Events.new(self)
    end

    def promotions
      Voucherify::Service::Promotions.new(self)
    end

    def orders
      Voucherify::Service::Orders.new(self)
    end

    def rewards
      Voucherify::Service::Rewards.new(self)
    end

    def loyalties
      Voucherify::Service::Loyalties.new(self)
    end

    def consents
        Voucherify::Service::Consents.new(self)
      end

    def get(path, params = {})
      begin
        url = @backend_url + path
        response = RestClient::Request::execute(method: :get, url: url, headers: @headers.merge({:params => params}), read_timeout: @timeout, open_timeout: @timeout)
        JSON.parse(response.body)
      rescue RestClient::Exception => e
        raise VoucherifyError.new(e)
      end
    end

    def put(path, body, params = {})
      begin
        url = @backend_url + path
        response = RestClient::Request::execute(method: :put, url: url, payload: body, headers: @headers.merge({:params => params, :content_type => :json}), read_timeout: @timeout, open_timeout: @timeout)
        JSON.parse(response.body)
      rescue RestClient::Exception => e
        raise VoucherifyError.new(e)
      end
    end

    def post(path, body, params = {})
      begin
        url = @backend_url + path
        response = RestClient::Request::execute(method: :post, url: url, payload: body, headers: @headers.merge({:params => params, :content_type => :json}), read_timeout: @timeout, open_timeout: @timeout)
        if !response.body.empty?
          JSON.parse(response.body)
        else
          nil
        end
      rescue RestClient::Exception => e
        raise VoucherifyError.new(e)
      end
    end

    def delete(path, params = {})
      begin
        url = @backend_url + path
        RestClient::Request::execute(method: :delete, url: url, headers: @headers.merge({:params => params}), read_timeout: @timeout, open_timeout: @timeout)
        nil
      rescue RestClient::Exception => e
        raise VoucherifyError.new(e)
      end
    end
  end

  class VoucherifyError < RuntimeError
    attr_reader :response
    attr_reader :code
    attr_reader :details
    attr_reader :key

    def initialize (restClientError)
      if restClientError.is_a? RestClient::Exceptions::Timeout
        @response = restClientError
        @details = restClientError
        super(restClientError)
      else
      @response = restClientError.response
      parsedResponse = JSON.parse(@response)
      @code = parsedResponse['code']
      @details = parsedResponse['details']
      @key = parsedResponse['key']
      super(parsedResponse['message'])
    end
  end
  end

end