lib/inbox.rb in nylas-0.18.2 vs lib/inbox.rb in nylas-1.0.0

- old
+ new

@@ -1,12 +1,29 @@ -require 'version' -require 'rest-client' -require 'restful_model_collection' require 'json' -require 'namespace' +require 'rest-client' +require 'yajl' +require 'em-http' +require 'ostruct' + require 'account' +require 'api_account' +require 'api_thread' +require 'calendar' +require 'account' +require 'tag' +require 'message' +require 'draft' +require 'contact' +require 'file' +require 'calendar' +require 'event' +require 'folder' +require 'restful_model' +require 'restful_model_collection' +require 'version' + module Inbox class AccessDenied < StandardError; end class ResourceNotFound < StandardError; end class NoAuthToken < StandardError; end @@ -120,21 +137,221 @@ json = Inbox.interpret_response(result, response, :expected_class => Object) return json['access_token'] end end - # Convenience Methods + # API Methods + def threads + @threads ||= RestfulModelCollection.new(Thread, self) + end - def namespaces - @namespaces ||= RestfulModelCollection.new(Namespace, self, nil) - @namespaces + def tags + @tags ||= RestfulModelCollection.new(Tag, self) end - # Billing Methods + def messages + @messages ||= RestfulModelCollection.new(Message, self) + end + def files + @files ||= RestfulModelCollection.new(File, self) + end + + def drafts + @drafts ||= RestfulModelCollection.new(Draft, self) + end + + def contacts + @contacts ||= RestfulModelCollection.new(Contact, self) + end + + def calendars + @calendars ||= RestfulModelCollection.new(Calendar, self) + end + + def events + @events ||= RestfulModelCollection.new(Event, self) + end + + def folders + @folders ||= RestfulModelCollection.new(Folder, self) + end + + def labels + @labels ||= RestfulModelCollection.new(Label, self) + end + + def account + path = self.url_for_path("/account") + + RestClient.get(path, {}) do |response,request,result| + json = Inbox.interpret_response(result, response, {:expected_class => Object}) + model = APIAccount.new(self) + model.inflate(json) + model + end + end + + def using_hosted_api? + return !@app_id.nil? + end + def accounts - @accounts ||= ManagementModelCollection.new(Account, self, nil) - @accounts + if self.using_hosted_api? + @accounts ||= ManagementModelCollection.new(Account, self) + else + @accounts ||= RestfulModelCollection.new(APIAccount, self) + end + end + + def get_cursor(timestamp) + # Get the cursor corresponding to a specific timestamp. + warn "Nylas#get_cursor is deprecated. Use Nylas#latest_cursor instead." + + path = self.url_for_path("/delta/generate_cursor") + data = { :start => timestamp } + + cursor = nil + + RestClient.post(path, data.to_json, :content_type => :json) do |response,request,result| + json = Inbox.interpret_response(result, response, {:expected_class => Object}) + cursor = json["cursor"] + end + + cursor + end + + 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 = Inbox.interpret_response(result, response, {:expected_class => Object}) + cursor = json["cursor"] + end + + cursor + end + + OBJECTS_TABLE = { + "account" => Inbox::Account, + "calendar" => Inbox::Calendar, + "draft" => Inbox::Draft, + "thread" => Inbox::Thread, + "contact" => Inbox::Contact, + "event" => Inbox::Event, + "file" => Inbox::File, + "message" => Inbox::Message, + "tag" => Inbox::Tag, + "folder" => Inbox::Folder, + "label" => Inbox::Label, + } + + 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 + + def deltas(cursor, exclude_types=[]) + 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 until we've come to the end. + loop do + path = self.url_for_path("/delta?cursor=#{cursor}#{exclude_string}") + json = nil + + RestClient.get(path) do |response,request,result| + json = Inbox.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']] + 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 + + def delta_stream(cursor, exclude_types=[], timeout=0) + 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?cursor=#{cursor}#{exclude_string}") + + parser = Yajl::Parser.new(:symbolize_keys => false) + parser.on_parse_complete = proc do |data| + delta = Inbox.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']] + 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 + + EventMachine.run do + http = EventMachine::HttpRequest.new(path, :connect_timeout => 0, :inactivity_timeout => timeout).get(:keepalive => true) + http.stream do |chunk| + parser << chunk + end + http.errback do + raise UnexpectedResponse.new http.error + end + end end end end Nylas = Inbox.clone