grokify/ringcentral-sdk-ruby

View on GitHub
lib/ringcentral_sdk/rest/configuration.rb

Summary

Maintainability
A
3 hrs
Test Coverage
require 'dotenv'
require 'fiddle'
require 'logger'
require 'multi_json'
require 'ringcentral_sdk'
require 'uri'

module RingCentralSdk
  module REST
    # Configuration class populated by Client constructor block
    class Configuration
      attr_accessor :server_url
      attr_accessor :client_id
      attr_accessor :client_secret
      attr_accessor :redirect_url

      attr_accessor :username
      attr_accessor :extension
      attr_accessor :password
      attr_accessor :token
      attr_accessor :token_file

      attr_accessor :load_env
      attr_accessor :headers
      attr_accessor :retry
      attr_accessor :retry_options
      attr_accessor :logger

      def inflate
        @logger = default_logger if !defined?(@logger) || @logger.nil?
        load_environment if load_env
        inflate_headers
        inflate_retry
        inflate_retry_options
        inflate_token
      end

      def default_logger
        logger = Logger.new STDOUT
        logger.level = Logger::WARN
        logger
      end

      def load_environment
        Dotenv.load
        @server_url    = ENV['RINGCENTRAL_SERVER_URL']    if ENV.key? 'RINGCENTRAL_SERVER_URL'
        @client_id     = ENV['RINGCENTRAL_CLIENT_ID']     if ENV.key? 'RINGCENTRAL_CLIENT_ID'
        @client_secret = ENV['RINGCENTRAL_CLIENT_SECRET'] if ENV.key? 'RINGCENTRAL_CLIENT_SECRET'
        @redirect_url  = ENV['RINGCENTRAL_REDIRECT_URL']  if ENV.key? 'RINGCENTRAL_REDIRECT_URL'
        @username      = ENV['RINGCENTRAL_USERNAME']      if ENV.key? 'RINGCENTRAL_USERNAME'
        @extension     = ENV['RINGCENTRAL_EXTENSION']     if ENV.key? 'RINGCENTRAL_EXTENSION'
        @password      = ENV['RINGCENTRAL_PASSWORD']      if ENV.key? 'RINGCENTRAL_PASSWORD'
        @token         = ENV['RINGCENTRAL_TOKEN']         if ENV.key? 'RINGCENTRAL_TOKEN'
        @token_file    = ENV['RINGCENTRAL_TOKEN_FILE']    if ENV.key? 'RINGCENTRAL_TOKEN_FILE'
        @retry         = ENV['RINGCENTRAL_RETRY']         if ENV.key? 'RINGCENTRAL_RETRY'
        @retry_options = ENV['RINGCENTRAL_RETRY_OPTIONS'] if ENV.key? 'RINGCENTRAL_RETRY_OPTIONS'
        @headers       = ENV['RINGCENTRAL_HEADERS']       if ENV.key? 'RINGCENTRAL_HEADERS'
      end

      def inflate_retry
        if !defined?(@retry) || @retry.nil?
          @retry = false
        elsif @retry.is_a? String
          @retry = @retry.to_s.strip.downcase == 'true' ? true : false
        elsif ![true, false].include? @retry
          @retry = @retry ? true : false
        end
      end

      def inflate_retry_options
        if @retry == false
          @retry_options = {}
          return
        end
        if !@retry_options.nil? && @retry_options.to_s =~ /^\s*{/
          @retry_options = MultiJson.decode @retry_options.to_s, symbolize_keys: true
        else
          @retry_options = {}
        end
        @retry_options[:error_codes] = [429, 503, 504] unless @retry_options.key? :error_codes
        @retry_options[:logger] = @logger
      end

      def inflate_headers
        @headers = {} unless defined? @headers
        if !@headers.nil? && @headers.is_a?(String) && @headers =~ /^\s*{/
          @headers = MultiJson.decode @headers, symbolize_keys: true
        end
      end

      def inflate_token
        @token = nil unless defined? @token

        if (@token.nil? || @token.empty?) && !token_file.nil? && !@token_file.empty?
          @token = IO.read @token_file if File.exist? @token_file
        end

        if !defined?(@token) && !@token.nil? && @token.is_a?(String) && @token =~ /^\s*{/
          @token = MultiJson.decode @token
        end
      end

      def authorize_url
        URI.join @server_url, RingCentralSdk::REST::Client::AUTHZ_ENDPOINT
      end
    end
  end
end