Completed
Push — master ( f40ce3...513254 )
by John
01:04
created

Platform.send_request()   A

Complexity

Conditions 3

Size

Total Lines 14

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 3
dl 0
loc 14
rs 9.4286
1
require 'base64'
2
require 'faraday'
3
require 'faraday_middleware'
4
require 'faraday_middleware/oauth2_refresh'
5
require 'oauth2'
6
7
module RingCentralSdk
8
  class Platform
9
10
    ACCESS_TOKEN_TTL  = 600             # 10 minutes
11
    REFRESH_TOKEN_TTL = 36000           # 10 hours
12
    REFRESH_TOKEN_TTL_REMEMBER = 604800 # 1 week
13
    ACCOUNT_PREFIX    = '/account/'
14
    ACCOUNT_ID        = '~'
15
    AUTHZ_ENDPOINT    = '/restapi/oauth/authorize'
16
    TOKEN_ENDPOINT    = '/restapi/oauth/token'
17
    REVOKE_ENDPOINT   = '/restapi/oauth/revoke'
18
    API_VERSION       = 'v1.0'
19
    URL_PREFIX        = '/restapi'
20
21
    attr_accessor :server_url
22
23
    attr_reader   :client
24
    attr_reader   :oauth2client
25
    attr_reader   :token
26
    attr_reader   :user_agent
27
    attr_reader   :redirect_uri
28
29
    def initialize(app_key, app_secret, server_url=RingCentralSdk::RC_SERVER_SANDBOX, opts={})
30
      @app_key      = app_key.to_s
31
      @app_secret   = app_secret.to_s
32
      @server_url   = server_url
33
      @token        = nil
34
      @client       = nil
35
      @redirect_uri = ''
36
      @user_agent   = get_user_agent()
37
      @oauth2client = new_oauth2_client()
38
      if opts.is_a?(Hash)
39
        @redirect_uri = opts.has_key?(:redirect_uri) ? opts[:redirect_uri] : ''
40
        if opts.has_key?(:username) && opts.has_key?(:password)
41
          extension = opts.has_key?(:extension) ? opts[:extension] : ''
42
          authorize_password(opts[:username], extension, opts[:password])
43
        end
44
      end
45
    end
46
47
    def get_api_version_url()
48
      return @server_url + URL_PREFIX + '/' + API_VERSION 
49
    end
50
51
    def create_url(url, add_server=false, add_method=nil, add_token=false)
52
      built_url = ''
53
      has_http = !url.index('http://').nil? && !url.index('https://').nil?
54
55
      if add_server && ! has_http
56
        built_url += @server_url
57
      end
58
59
      if url.index(URL_PREFIX).nil? && ! has_http
60
        built_url += URL_PREFIX + '/' + API_VERSION + '/'
61
      end
62
63
      if url.index('/') == 0
64
        if built_url =~ /\/$/
65
          built_url += url.gsub(/^\//, '')
66
        else
67
          built_url += url
68
        end
69
      else # no /
70
        if built_url =~ /\/$/
71
          built_url += url
72
        else
73
          built_url += '/' + url
74
        end
75
      end
76
77
      return built_url
78
    end
79
80
    def create_urls(urls, add_server=false, add_method=nil, add_token=false)
81
      unless urls.is_a?(Array)
82
        raise "URLs is not an array"
83
      end
84
      built_urls = []
85
      urls.each do |url|
86
        built_urls.push(create_url(url, add_server, add_method, add_token))
87
      end
88
      return built_urls
89
    end
90
91
    def authorize_url(opts={})
92
      if ! opts.has_key?(:redirect_uri) && @redirect_uri.to_s.length>0
93
        opts[:redirect_uri] = @redirect_uri.to_s
94
      end
95
      @oauth2client.auth_code.authorize_url(opts)
96
    end
97
98
    def authorize_code(code, opts={})
99
      if ! opts.has_key?(:redirect_uri) && @redirect_uri.to_s.length>0
100
        opts[:redirect_uri] = @redirect_uri.to_s
101
      end
102
      token = @oauth2client.auth_code.get_token(code, opts)
103
      set_token(token)
104
      return token
105
    end
106
107
    def authorize_password(username, extension='', password='', remember=false)
108
      token = @oauth2client.password.get_token(username, password, {
109
        :extension => extension,
110
        :headers   => { 'Authorization' => 'Basic ' + get_api_key() } })
111
      set_token(token)
112
      return token
113
    end
114
115
    def set_token(token)
116
      if token.is_a?(Hash)
117
        token = OAuth2::AccessToken::from_hash(@oauth2client, token)
118
      end
119
120
      unless token.is_a?(OAuth2::AccessToken)
121
        raise "Token is not a OAuth2::AccessToken"
122
      end
123
124
      @token  = token
125
126
      @client = Faraday.new(:url => get_api_version_url()) do |conn|
127
        conn.request  :oauth2_refresh, @token
128
        conn.request  :json
129
        conn.request  :url_encoded
130
        conn.headers['User-Agent'] = @user_agent
131
        conn.headers['Rc-User-Agent'] = @user_agent
132
        conn.response :json, :content_type => /\bjson$/
133
        conn.adapter  Faraday.default_adapter
134
      end
135
    end
136
137
    def new_oauth2_client()
138
      return OAuth2::Client.new(@app_key, @app_secret,
139
        :site          => @server_url,
140
        :authorize_url => AUTHZ_ENDPOINT,
141
        :token_url     => TOKEN_ENDPOINT)
142
    end
143
144
    def set_oauth2_client(client=nil)
145
      if client.nil?
146
        @oauth2client = new_oauth2_client()
147
      elsif client.is_a?(OAuth2::Client)
148
        @oauth2client = client
149
      else
150
        raise "client is not an OAuth2::Client"
151
      end
152
    end
153
154
    def get_api_key()
155
      api_key = (@app_key.is_a?(String) && @app_secret.is_a?(String)) \
156
        ? Base64.encode64("#{@app_key}:#{@app_secret}").gsub(/[\s\t\r\n]/,'') : ''
157
      return api_key
158
    end
159
160
    def send_request(helper=nil)
161
      unless helper.is_a?(RingCentralSdk::Helpers::Request)
162
        raise 'Request is not a RingCentralSdk::Helpers::Request'
163
      end
164
165
      if helper.method.downcase == 'post'
166
        resp       =  @client.post do |req|
167
          req.url helper.url
168
          req.headers['Content-Type'] = helper.content_type if helper.content_type
169
          req.body = helper.body if helper.body
170
        end
171
        return resp
172
      end
173
    end
174
175
    def get_user_agent()
176
      ua = "ringcentral-sdk-ruby/#{RingCentralSdk::VERSION} %s/%s %s" % [
177
        (RUBY_ENGINE rescue nil or "ruby"),
178
        RUBY_VERSION,
179
        RUBY_PLATFORM
180
      ]
181
      return ua.strip
182
    end
183
184
    def create_subscription()
185
      return RingCentralSdk::Subscription.new(self)
186
    end
187
188
    alias_method :authorize, :authorize_password
189
    alias_method :login, :authorize_password
190
    alias_method :request, :send_request
191
    private :get_api_version_url
192
  end
193
end
194