Class: Nylas::API

Inherits:
Object
  • Object
show all
Defined in:
lib/nylas.rb

Constant Summary collapse

OBJECTS_TABLE =
{
  "account" => Nylas::Account,
  "calendar" => Nylas::Calendar,
  "draft" => Nylas::Draft,
  "thread" => Nylas::Thread,
  "contact" => Nylas::Contact,
  "event" => Nylas::Event,
  "file" => Nylas::File,
  "message" => Nylas::Message,
  "folder" => Nylas::Folder,
  "label" => Nylas::Label,
}
EXPANDED_OBJECTS_TABLE =

It’s possible to ask the API to expand objects. In this case, we do the right thing and return an expanded object.

{
  "message" => Nylas::ExpandedMessage,
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app_id, app_secret, access_token = nil, api_server = 'https://api.nylas.com', service_domain = 'api.nylas.com') ⇒ API

Returns a new instance of API.



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/nylas.rb', line 105

def initialize(app_id, app_secret, access_token = nil, api_server = 'https://api.nylas.com',
               service_domain = 'api.nylas.com')
  raise "When overriding the Nylas API server address, you must include https://" unless api_server.include?('://')
  @api_server = api_server
  @access_token = access_token
  @app_secret = app_secret
  @app_id = app_id
  @service_domain = service_domain
  @version = Nylas::VERSION

  if ::RestClient.before_execution_procs.empty?
    ::RestClient.add_before_execution_proc do |req, params|
      req.add_field('X-Inbox-API-Wrapper', 'ruby')
      req['User-Agent'] = "Nylas Ruby SDK #{@version} - #{RUBY_VERSION}"
    end
  end
end

Instance Attribute Details

#access_tokenObject (readonly)

Returns the value of attribute access_token.



101
102
103
# File 'lib/nylas.rb', line 101

def access_token
  @access_token
end

#api_serverObject

Returns the value of attribute api_server.



100
101
102
# File 'lib/nylas.rb', line 100

def api_server
  @api_server
end

#app_idObject (readonly)

Returns the value of attribute app_id.



102
103
104
# File 'lib/nylas.rb', line 102

def app_id
  @app_id
end

#app_secretObject (readonly)

Returns the value of attribute app_secret.



103
104
105
# File 'lib/nylas.rb', line 103

def app_secret
  @app_secret
end

Instance Method Details

#_build_exclude_types(exclude_types) ⇒ Object



271
272
273
274
275
276
277
278
279
280
281
282
283
# File 'lib/nylas.rb', line 271

def _build_exclude_types(exclude_types)
  exclude_string = "&exclude_types="

  exclude_types.each do |value|
    count = 0
    if OBJECTS_TABLE.has_value?(value)
      param_name = OBJECTS_TABLE.key(value)
      exclude_string += "#{param_name},"
    end
  end

  exclude_string = exclude_string[0..-2]
end

#accountObject



214
215
216
217
218
219
220
221
222
223
# File 'lib/nylas.rb', line 214

def 
  path = self.url_for_path("/account")

  RestClient.get(path, {}) do |response,request,result|
    json = Nylas.interpret_response(result, response, {:expected_class => Object})
    model = APIAccount.new(self)
    model.inflate(json)
    model
  end
end

#accountsObject



229
230
231
232
233
234
235
# File 'lib/nylas.rb', line 229

def accounts
      if self.using_hosted_api?
           @accounts ||= ManagementModelCollection.new(Account, self)
      else
           @accounts ||= RestfulModelCollection.new(APIAccount, self)
      end
end

#calendarsObject



198
199
200
# File 'lib/nylas.rb', line 198

def calendars
  @calendars ||= RestfulModelCollection.new(Calendar, self)
end

#contactsObject



194
195
196
# File 'lib/nylas.rb', line 194

def contacts
  @contacts ||= RestfulModelCollection.new(Contact, self)
end

#delta_stream(cursor, exclude_types = [], timeout = 0, expanded_view = false) ⇒ Object



339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
# File 'lib/nylas.rb', line 339

def delta_stream(cursor, exclude_types=[], timeout=0, expanded_view=false)
  raise 'Please provide a block for receiving the delta objects' if !block_given?

  exclude_string = ""

  if exclude_types.any?
    exclude_string = _build_exclude_types(exclude_types)
  end

  # loop and yield deltas indefinitely.
  path = self.url_for_path("/delta/streaming?exclude_folders=false&cursor=#{cursor}#{exclude_string}")
  if expanded_view
    path += '&view=expanded'
  end

  parser = Yajl::Parser.new(:symbolize_keys => false)
  parser.on_parse_complete = proc do |data|
    delta = Nylas.interpret_response(OpenStruct.new(:code => '200'), data, {:expected_class => Object, :result_parsed => true})

    if not OBJECTS_TABLE.has_key?(delta['object'])
      next
    end

    cls = OBJECTS_TABLE[delta['object']]
    if EXPANDED_OBJECTS_TABLE.has_key?(delta['object']) and expanded_view
      cls = EXPANDED_OBJECTS_TABLE[delta['object']]
    end

    obj = cls.new(self)

    case delta["event"]
      when 'create', 'modify'
        obj.inflate(delta['attributes'])
        obj.cursor = delta["cursor"]
        yield delta["event"], obj
      when 'delete'
        obj.id = delta["id"]
        obj.cursor = delta["cursor"]
        yield delta["event"], obj
    end
  end

  http = EventMachine::HttpRequest.new(path, :connect_timeout => 0, :inactivity_timeout => timeout).get(:keepalive => true)

  # set a callback on the HTTP stream that parses incoming chunks as they come in
  http.stream do |chunk|
    parser << chunk
  end

  http.errback do
    raise UnexpectedResponse.new http.error
  end

end

#deltas(cursor, exclude_types = [], expanded_view = false) ⇒ Object



285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
# File 'lib/nylas.rb', line 285

def deltas(cursor, exclude_types=[], expanded_view=false)
  return enum_for(:deltas, cursor, exclude_types, expanded_view) unless block_given?

  exclude_string = ""

  if exclude_types.any?
    exclude_string = _build_exclude_types(exclude_types)
  end

  # loop and yield deltas until we've come to the end.
  loop do
    path = self.url_for_path("/delta?exclude_folders=false&cursor=#{cursor}#{exclude_string}")
    if expanded_view
      path += '&view=expanded'
    end

    json = nil

    RestClient.get(path) do |response,request,result|
      json = Nylas.interpret_response(result, response, {:expected_class => Object})
    end

    start_cursor = json["cursor_start"]
    end_cursor = json["cursor_end"]

    json["deltas"].each do |delta|
      if not OBJECTS_TABLE.has_key?(delta['object'])
        next
      end

      cls = OBJECTS_TABLE[delta['object']]
      if EXPANDED_OBJECTS_TABLE.has_key?(delta['object']) and expanded_view
        cls = EXPANDED_OBJECTS_TABLE[delta['object']]
      end

      obj = cls.new(self)

      case delta["event"]
      when 'create', 'modify'
          obj.inflate(delta['attributes'])
          obj.cursor = delta["cursor"]
          yield delta["event"], obj
      when 'delete'
          obj.id = delta["id"]
          obj.cursor = delta["cursor"]
          yield delta["event"], obj
      end
    end

    break if start_cursor == end_cursor
    cursor = end_cursor
  end
end

#draftsObject



190
191
192
# File 'lib/nylas.rb', line 190

def drafts
  @drafts ||= RestfulModelCollection.new(Draft, self)
end

#eventsObject



202
203
204
# File 'lib/nylas.rb', line 202

def events
  @events ||= RestfulModelCollection.new(Event, self)
end

#filesObject



186
187
188
# File 'lib/nylas.rb', line 186

def files
  @files ||= RestfulModelCollection.new(File, self)
end

#foldersObject



206
207
208
# File 'lib/nylas.rb', line 206

def folders
  @folders ||= RestfulModelCollection.new(Folder, self)
end

#labelsObject



210
211
212
# File 'lib/nylas.rb', line 210

def labels
  @labels ||= RestfulModelCollection.new(Label, self)
end

#latest_cursorObject



237
238
239
240
241
242
243
244
245
246
247
248
249
# File 'lib/nylas.rb', line 237

def latest_cursor
  # Get the cursor corresponding to a specific timestamp.
  path = self.url_for_path("/delta/latest_cursor")

  cursor = nil

  RestClient.post(path, :content_type => :json) do |response,request,result|
    json = Nylas.interpret_response(result, response, {:expected_class => Object})
    cursor = json["cursor"]
  end

  cursor
end

#messages(expanded: false) ⇒ Object



174
175
176
177
178
179
180
181
182
183
184
# File 'lib/nylas.rb', line 174

def messages(expanded: false)
  @messages ||= Hash.new do |h, is_expanded|
    h[is_expanded] = \
      if is_expanded
        RestfulModelCollection.new(ExpandedMessage, self, view: 'expanded')
      else
        RestfulModelCollection.new(Message, self)
      end
  end
  @messages[expanded]
end

#set_access_token(token) ⇒ Object



151
152
153
# File 'lib/nylas.rb', line 151

def set_access_token(token)
  @access_token = token
end

#threadsObject

API Methods



170
171
172
# File 'lib/nylas.rb', line 170

def threads
  @threads ||= RestfulModelCollection.new(Thread, self)
end

#token_for_code(code) ⇒ Object



155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/nylas.rb', line 155

def token_for_code(code)
  data = {
      'client_id' => app_id,
      'client_secret' => app_secret,
      'grant_type' => 'authorization_code',
      'code' => code
  }

  ::RestClient.post("https://#{@service_domain}/oauth/token", data) do |response, request, result|
    json = Nylas.interpret_response(result, response, :expected_class => Object)
    return json['access_token']
  end
end

#url_for_authentication(redirect_uri, login_hint = '', options = {}) ⇒ Object



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/nylas.rb', line 129

def url_for_authentication(redirect_uri,  = '', options = {})
  params = {
    :client_id => @app_id,
    :trial => options.fetch(:trial, false),
    :response_type => 'code',
    :scope => 'email',
    :login_hint => ,
    :redirect_uri => redirect_uri,
  }

  if options.has_key?(:state) then
    params[:state] = options[:state]
  end

  "https://#{@service_domain}/oauth/authorize?" + params.to_query
end

#url_for_managementObject



146
147
148
149
# File 'lib/nylas.rb', line 146

def url_for_management
  protocol, domain = @api_server.split('//')
  accounts_path = "#{protocol}//#{@app_secret}:@#{domain}/a/#{@app_id}/accounts"
end

#url_for_path(path) ⇒ Object

Raises:



123
124
125
126
127
# File 'lib/nylas.rb', line 123

def url_for_path(path)
  raise NoAuthToken.new if @access_token == nil and (@app_secret != nil or @app_id != nil)
  protocol, domain = @api_server.split('//')
  "#{protocol}//#{@access_token}:@#{domain}#{path}"
end

#using_hosted_api?Boolean

Returns:

  • (Boolean)


225
226
227
# File 'lib/nylas.rb', line 225

def using_hosted_api?
   return !@app_id.nil?
end