nylas 4.0.0.rc2 → 4.0.0.rc3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/nylas.rb +48 -5
- data/lib/nylas/account.rb +31 -0
- data/lib/nylas/api.rb +86 -2
- data/lib/nylas/calendar.rb +27 -0
- data/lib/nylas/collection.rb +46 -19
- data/lib/nylas/constraints.rb +12 -4
- data/lib/nylas/contact.rb +10 -2
- data/lib/nylas/current_account.rb +1 -4
- data/lib/nylas/delta.rb +46 -0
- data/lib/nylas/deltas.rb +17 -0
- data/lib/nylas/deltas_collection.rb +36 -0
- data/lib/nylas/draft.rb +51 -0
- data/lib/nylas/email_address.rb +1 -5
- data/lib/nylas/errors.rb +13 -0
- data/lib/nylas/event.rb +42 -0
- data/lib/nylas/event_collection.rb +13 -0
- data/lib/nylas/file.rb +58 -0
- data/lib/nylas/folder.rb +22 -0
- data/lib/nylas/http_client.rb +38 -29
- data/lib/nylas/im_address.rb +0 -5
- data/lib/nylas/label.rb +22 -0
- data/lib/nylas/message.rb +45 -0
- data/lib/nylas/message_headers.rb +25 -0
- data/lib/nylas/message_tracking.rb +11 -0
- data/lib/nylas/model.rb +75 -24
- data/lib/nylas/model/attributable.rb +2 -2
- data/lib/nylas/model/attributes.rb +3 -1
- data/lib/nylas/native_authentication.rb +31 -0
- data/lib/nylas/new_message.rb +29 -0
- data/lib/nylas/nylas_date.rb +5 -2
- data/lib/nylas/participant.rb +10 -0
- data/lib/nylas/phone_number.rb +0 -5
- data/lib/nylas/physical_address.rb +0 -5
- data/lib/nylas/raw_message.rb +15 -0
- data/lib/nylas/recurrence.rb +9 -0
- data/lib/nylas/rsvp.rb +18 -0
- data/lib/nylas/search_collection.rb +8 -0
- data/lib/nylas/thread.rb +52 -0
- data/lib/nylas/timespan.rb +18 -0
- data/lib/nylas/types.rb +62 -9
- data/lib/nylas/version.rb +1 -1
- data/lib/nylas/web_page.rb +0 -5
- data/lib/nylas/webhook.rb +19 -0
- metadata +31 -7
data/lib/nylas/delta.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
module Nylas
|
2
|
+
# Ruby object to represent a single change. Used both when receiving a webhook, as well as the deltas API.
|
3
|
+
# @see https://docs.nylas.com/reference#receiving-notifications
|
4
|
+
# @see https://docs.nylas.com/reference#deltas
|
5
|
+
class Delta
|
6
|
+
include Model::Attributable
|
7
|
+
attribute :id, :string
|
8
|
+
attribute :type, :string
|
9
|
+
attribute :object, :string
|
10
|
+
attribute :event, :string
|
11
|
+
attribute :cursor, :string
|
12
|
+
attribute :namespace_id, :string
|
13
|
+
attribute :account_id, :string
|
14
|
+
|
15
|
+
attribute :date, :unix_timestamp
|
16
|
+
attribute :metadata, :hash
|
17
|
+
attribute :object_attributes, :hash
|
18
|
+
|
19
|
+
def model
|
20
|
+
return nil if object.nil?
|
21
|
+
@model ||= Types.registry[object.to_sym].cast(object_attributes_with_ids)
|
22
|
+
end
|
23
|
+
|
24
|
+
def object_attributes_with_ids
|
25
|
+
(object_attributes || {}).merge(id: id, account_id: account_id)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Casts Delta data from either a webhook or a delta stream to a Delta
|
30
|
+
class DeltaType < Types::ModelType
|
31
|
+
def initialize
|
32
|
+
super(model: Delta)
|
33
|
+
end
|
34
|
+
|
35
|
+
def cast(data)
|
36
|
+
data = if data.key?(:object_data)
|
37
|
+
object_data = data.delete(:object_data)
|
38
|
+
data.merge(object_data)
|
39
|
+
else
|
40
|
+
data
|
41
|
+
end
|
42
|
+
data[:object_attributes] = data.delete(:attributes)
|
43
|
+
super(data)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/nylas/deltas.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Nylas
|
2
|
+
# Ruby object to represent a collection of changes. Used both when receiving a webhook, as well as the
|
3
|
+
# deltas API.
|
4
|
+
# @see https://docs.nylas.com/reference#receiving-notifications
|
5
|
+
# @see https://docs.nylas.com/reference#deltas
|
6
|
+
class Deltas
|
7
|
+
include Model
|
8
|
+
self.resources_path = "/delta"
|
9
|
+
allows_operations(filterable: true)
|
10
|
+
has_n_of_attribute :deltas, :delta
|
11
|
+
attribute :cursor_start, :string
|
12
|
+
attribute :cursor_end, :string
|
13
|
+
|
14
|
+
extend Forwardable
|
15
|
+
def_delegators :deltas, :count, :length, :each, :map, :first, :to_a, :empty?
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Nylas
|
2
|
+
# Special collection for delta objects
|
3
|
+
class DeltasCollection < Collection
|
4
|
+
attr_accessor :deltas
|
5
|
+
extend Forwardable
|
6
|
+
def_delegators :execute, :cursor_start, :cursor_end,
|
7
|
+
:count, :each, :to_h, :to_a, :empty?
|
8
|
+
|
9
|
+
def initialize(api:, constraints: nil, model: Deltas)
|
10
|
+
super(api: api, model: model, constraints: constraints)
|
11
|
+
end
|
12
|
+
|
13
|
+
def latest_cursor
|
14
|
+
api.execute(method: :post, path: "#{resources_path}/latest_cursor")[:cursor]
|
15
|
+
end
|
16
|
+
|
17
|
+
def latest
|
18
|
+
since(latest_cursor)
|
19
|
+
end
|
20
|
+
|
21
|
+
def since(cursor)
|
22
|
+
where(cursor: cursor)
|
23
|
+
end
|
24
|
+
|
25
|
+
def next_page(*)
|
26
|
+
return nil if empty?
|
27
|
+
where(cursor: cursor_end)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Retrieves the data from the API for the particular constraints
|
31
|
+
# @return [Detlas]
|
32
|
+
def execute
|
33
|
+
self.deltas ||= Deltas.new(api.execute(to_be_executed))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/nylas/draft.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
module Nylas
|
2
|
+
# Ruby representatin of a Nylas Draft object
|
3
|
+
# @see https://docs.nylas.com/reference#drafts
|
4
|
+
class Draft
|
5
|
+
include Model
|
6
|
+
self.resources_path = "/drafts"
|
7
|
+
allows_operations(creatable: true, showable: true, listable: true, updatable: true, destroyable: true)
|
8
|
+
|
9
|
+
attribute :id, :string
|
10
|
+
attribute :object, :string
|
11
|
+
attribute :version, :integer
|
12
|
+
attribute :account_id, :string
|
13
|
+
attribute :thread_id, :string
|
14
|
+
attribute :reply_to_message_id, :string
|
15
|
+
|
16
|
+
has_n_of_attribute :to, :email_address
|
17
|
+
has_n_of_attribute :from, :email_address
|
18
|
+
has_n_of_attribute :cc, :email_address
|
19
|
+
has_n_of_attribute :bcc, :email_address
|
20
|
+
has_n_of_attribute :reply_to, :email_address
|
21
|
+
|
22
|
+
attribute :date, :unix_timestamp
|
23
|
+
attribute :subject, :string
|
24
|
+
attribute :snippet, :string
|
25
|
+
attribute :body, :string
|
26
|
+
attribute :starred, :boolean
|
27
|
+
attribute :unread, :boolean
|
28
|
+
|
29
|
+
has_n_of_attribute :events, :event
|
30
|
+
has_n_of_attribute :files, :file
|
31
|
+
attribute :folder, :label
|
32
|
+
has_n_of_attribute :labels, :label
|
33
|
+
|
34
|
+
def send!
|
35
|
+
save
|
36
|
+
execute(method: :post, path: "/send", payload: JSON.dump(draft_id: id, version: version))
|
37
|
+
end
|
38
|
+
|
39
|
+
def starred?
|
40
|
+
starred
|
41
|
+
end
|
42
|
+
|
43
|
+
def unread?
|
44
|
+
unread
|
45
|
+
end
|
46
|
+
|
47
|
+
def destroy
|
48
|
+
execute(method: :delete, path: resource_path, payload: attributes.serialize(keys: [:version]))
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/nylas/email_address.rb
CHANGED
@@ -5,10 +5,6 @@ module Nylas
|
|
5
5
|
include Model::Attributable
|
6
6
|
attribute :type, :string
|
7
7
|
attribute :email, :string
|
8
|
-
|
9
|
-
|
10
|
-
# Serializes, Deserializes between {EmailAddress} objects and a {Hash}
|
11
|
-
class EmailAddressType < Types::HashType
|
12
|
-
casts_to EmailAddress
|
8
|
+
attribute :name, :string
|
13
9
|
end
|
14
10
|
end
|
data/lib/nylas/errors.rb
CHANGED
@@ -1,6 +1,17 @@
|
|
1
1
|
module Nylas
|
2
2
|
Error = Class.new(::StandardError)
|
3
3
|
|
4
|
+
class ModelActionError < Error; end
|
5
|
+
class ModelNotFilterableError < ModelActionError; end
|
6
|
+
class ModelNotCreatableError < ModelActionError; end
|
7
|
+
class ModelNotShowableError < ModelActionError; end
|
8
|
+
class ModelNotAvailableAsRawError < ModelActionError; end
|
9
|
+
class ModelNotListableError < ModelActionError; end
|
10
|
+
class ModelNotFilterableError < ModelActionError; end
|
11
|
+
class ModelNotSearchableError < ModelActionError; end
|
12
|
+
class ModelNotUpdatableError < ModelActionError; end
|
13
|
+
class ModelNotDestroyableError < ModelActionError; end
|
14
|
+
|
4
15
|
# Indicates that a given method needs an access token to work.
|
5
16
|
class NoAuthToken < Error
|
6
17
|
def initialize(method_name)
|
@@ -26,11 +37,13 @@ module Nylas
|
|
26
37
|
end
|
27
38
|
AccessDenied = Class.new(APIError)
|
28
39
|
ResourceNotFound = Class.new(APIError)
|
40
|
+
MethodNotAllowed = Class.new(APIError)
|
29
41
|
InvalidRequest = Class.new(APIError)
|
30
42
|
MessageRejected = Class.new(APIError)
|
31
43
|
SendingQuotaExceeded = Class.new(APIError)
|
32
44
|
ServiceUnavailable = Class.new(APIError)
|
33
45
|
BadGateway = Class.new(APIError)
|
34
46
|
InternalError = Class.new(APIError)
|
47
|
+
EndpointNotYetImplemented = Class.new(APIError)
|
35
48
|
MailProviderError = Class.new(APIError)
|
36
49
|
end
|
data/lib/nylas/event.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
module Nylas
|
2
|
+
# Structure to represent a the Event Schema.
|
3
|
+
# @see https://docs.nylas.com/reference#events
|
4
|
+
class Event
|
5
|
+
include Model
|
6
|
+
self.resources_path = "/events"
|
7
|
+
allows_operations(creatable: true, listable: true, filterable: true, showable: true, updatable: true,
|
8
|
+
destroyable: true)
|
9
|
+
|
10
|
+
attribute :id, :string
|
11
|
+
attribute :object, :string
|
12
|
+
attribute :account_id, :string
|
13
|
+
attribute :calendar_id, :string
|
14
|
+
attribute :master_event_id, :string
|
15
|
+
attribute :message_id, :string
|
16
|
+
|
17
|
+
attribute :busy, :boolean
|
18
|
+
attribute :description, :string
|
19
|
+
attribute :location, :string
|
20
|
+
attribute :owner, :string
|
21
|
+
attribute :recurrence, :recurrence
|
22
|
+
has_n_of_attribute :participants, :participant
|
23
|
+
attribute :read_only, :boolean
|
24
|
+
attribute :status, :string
|
25
|
+
attribute :title, :string
|
26
|
+
attribute :when, :timespan
|
27
|
+
|
28
|
+
def busy?
|
29
|
+
busy
|
30
|
+
end
|
31
|
+
|
32
|
+
def read_only?
|
33
|
+
read_only
|
34
|
+
end
|
35
|
+
|
36
|
+
def rsvp(status, notify_participants:)
|
37
|
+
rsvp = Rsvp.new(api: api, status: status, notify_participants: notify_participants,
|
38
|
+
event_id: id, account_id: account_id)
|
39
|
+
rsvp.save
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Nylas
|
2
|
+
# Syntactical sugar methods for some of the Event's filters
|
3
|
+
# @see https://docs.nylas.com/reference#get-events
|
4
|
+
class EventCollection < Collection
|
5
|
+
def expand_recurring
|
6
|
+
where(expand_recurring: true)
|
7
|
+
end
|
8
|
+
|
9
|
+
def show_cancelled
|
10
|
+
where(show_cancelled: true)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/nylas/file.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
module Nylas
|
2
|
+
# Structure to represent a the File Schema.
|
3
|
+
# @see https://docs.nylas.com/reference#events
|
4
|
+
class File
|
5
|
+
include Model
|
6
|
+
self.resources_path = "/files"
|
7
|
+
allows_operations(listable: true, showable: true, filterable: true, creatable: true)
|
8
|
+
|
9
|
+
attribute :id, :string
|
10
|
+
attribute :account_id, :string
|
11
|
+
attribute :content_id, :string
|
12
|
+
has_n_of_attribute :message_ids, :string
|
13
|
+
|
14
|
+
attribute :object, :string
|
15
|
+
|
16
|
+
attribute :content_type, :string
|
17
|
+
attribute :filename, :string
|
18
|
+
attribute :size, :integer
|
19
|
+
|
20
|
+
attr_accessor :file
|
21
|
+
# Downloads and caches a local copy of the file.
|
22
|
+
# @return [Tempfile] - Local copy of the file
|
23
|
+
def download
|
24
|
+
return file if file
|
25
|
+
self.file = retrieve_file
|
26
|
+
end
|
27
|
+
|
28
|
+
# Redownloads a file even if it's been cached. Closes and unlinks the tempfile to help memory usage.
|
29
|
+
def download!
|
30
|
+
return download if file.nil?
|
31
|
+
file.close
|
32
|
+
file.unlink
|
33
|
+
self.file = nil
|
34
|
+
download
|
35
|
+
end
|
36
|
+
|
37
|
+
def create
|
38
|
+
save
|
39
|
+
end
|
40
|
+
|
41
|
+
def save
|
42
|
+
raise ModelNotUpdatableError if persisted?
|
43
|
+
response = api.execute(path: "/files", method: :post, headers: { multipart: true },
|
44
|
+
payload: { file: file })
|
45
|
+
attributes.merge(response.first)
|
46
|
+
true
|
47
|
+
end
|
48
|
+
|
49
|
+
private def retrieve_file
|
50
|
+
response = api.get(path: "#{resource_path}/download")
|
51
|
+
filename = response.headers.fetch(:content_disposition, "").gsub("attachment; filename=", "")
|
52
|
+
temp_file = Tempfile.new(filename)
|
53
|
+
temp_file.write(response.body)
|
54
|
+
temp_file.seek(0)
|
55
|
+
temp_file
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/nylas/folder.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module Nylas
|
2
|
+
# Structure to represent the Folder Schema
|
3
|
+
# @see https://docs.nylas.com/reference#folders
|
4
|
+
class Folder
|
5
|
+
include Model
|
6
|
+
self.resources_path = "/folders"
|
7
|
+
self.creatable = true
|
8
|
+
self.listable = true
|
9
|
+
self.showable = true
|
10
|
+
self.filterable = false
|
11
|
+
self.updatable = true
|
12
|
+
self.destroyable = true
|
13
|
+
|
14
|
+
attribute :id, :string
|
15
|
+
attribute :account_id, :string
|
16
|
+
|
17
|
+
attribute :object, :string
|
18
|
+
|
19
|
+
attribute :name, :string
|
20
|
+
attribute :display_name, :string
|
21
|
+
end
|
22
|
+
end
|
data/lib/nylas/http_client.rb
CHANGED
@@ -6,15 +6,18 @@ module Nylas
|
|
6
6
|
402 => MessageRejected,
|
7
7
|
403 => AccessDenied,
|
8
8
|
404 => ResourceNotFound,
|
9
|
+
405 => MethodNotAllowed,
|
9
10
|
422 => MailProviderError,
|
10
11
|
429 => SendingQuotaExceeded,
|
11
12
|
500 => InternalError,
|
13
|
+
501 => EndpointNotYetImplemented,
|
12
14
|
502 => BadGateway,
|
13
15
|
503 => ServiceUnavailable
|
14
16
|
}.freeze
|
15
17
|
|
16
18
|
include Logging
|
17
|
-
attr_accessor :api_server, :
|
19
|
+
attr_accessor :api_server, :service_domain
|
20
|
+
attr_writer :default_headers
|
18
21
|
attr_reader :access_token
|
19
22
|
attr_reader :app_id
|
20
23
|
attr_reader :app_secret
|
@@ -25,7 +28,7 @@ module Nylas
|
|
25
28
|
# @param api_server [String] (Optional) Which Nylas API Server to connect to. Only change this if
|
26
29
|
# you're using a self-hosted Nylas instance.
|
27
30
|
# @param service_domain [String] (Optional) Host you are authenticating OAuth against.
|
28
|
-
# @return [Nylas::
|
31
|
+
# @return [Nylas::HttpClient]
|
29
32
|
def initialize(app_id:, app_secret:, access_token: nil, api_server: "https://api.nylas.com",
|
30
33
|
service_domain: "api.nylas.com")
|
31
34
|
unless api_server.include?("://")
|
@@ -38,10 +41,14 @@ module Nylas
|
|
38
41
|
@service_domain = service_domain
|
39
42
|
end
|
40
43
|
|
44
|
+
# @return [Nylas::HttpClient[]
|
45
|
+
def as(access_token)
|
46
|
+
HttpClient.new(app_id: app_id, access_token: access_token,
|
47
|
+
app_secret: app_secret, api_server: api_server, service_domain: service_domain)
|
48
|
+
end
|
49
|
+
|
41
50
|
# Sends a request to the Nylas API and rai
|
42
51
|
# @param method [Symbol] HTTP method for the API call. Either :get, :post, :delete, or :patch
|
43
|
-
# @param url [String] (Optional, defaults to nil) - Full URL to access. Deprecated and will be removed in
|
44
|
-
# 5.0.
|
45
52
|
# @param path [String] (Optional, defaults to nil) - Relative path from the API Base. Preferred way to
|
46
53
|
# execute arbitrary or-not-yet-SDK-ified API commands.
|
47
54
|
# @param headers [Hash] (Optional, defaults to {}) - Additional HTTP headers to include in the payload.
|
@@ -49,45 +56,47 @@ module Nylas
|
|
49
56
|
# section of the URI fragment
|
50
57
|
# @param payload [String,Hash] (Optional, defaults to nil) - Body to send with the request.
|
51
58
|
# @return [Array Hash Stringn]
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
url ||= url_for_path(path)
|
56
|
-
resulting_headers = default_headers.merge(headers)
|
57
|
-
rest_client_execute(method: method, url: url, payload: payload,
|
58
|
-
headers: resulting_headers) do |response, _request, result|
|
59
|
-
|
59
|
+
def execute(method:, path: nil, headers: {}, query: {}, payload: nil)
|
60
|
+
request = build_request(method: method, path: path, headers: headers, query: query, payload: payload)
|
61
|
+
rest_client_execute(**request) do |response, _request, result|
|
60
62
|
response = parse_response(response)
|
61
63
|
handle_failed_response(result: result, response: response)
|
62
64
|
response
|
63
65
|
end
|
64
66
|
end
|
65
|
-
# rubocop:enable Metrics/ParameterLists
|
66
67
|
inform_on :execute, level: :debug,
|
67
|
-
also_log: { result: true, values: %i
|
68
|
+
also_log: { result: true, values: %i[method url path headers query payload] }
|
69
|
+
|
70
|
+
def build_request(method:, path: nil, headers: {}, query: {}, payload: nil)
|
71
|
+
headers[:params] = query
|
72
|
+
url ||= url_for_path(path)
|
73
|
+
resulting_headers = default_headers.merge(headers)
|
74
|
+
{ method: method, url: url, payload: payload, headers: resulting_headers }
|
75
|
+
end
|
76
|
+
# rubocop:enable Metrics/ParameterLists
|
68
77
|
|
69
78
|
# Syntactical sugar for making GET requests via the API.
|
70
79
|
# @see #execute
|
71
|
-
def get(path: nil,
|
72
|
-
execute(method: :get, path: path, query: query,
|
80
|
+
def get(path: nil, headers: {}, query: {})
|
81
|
+
execute(method: :get, path: path, query: query, headers: headers)
|
73
82
|
end
|
74
83
|
|
75
84
|
# Syntactical sugar for making POST requests via the API.
|
76
85
|
# @see #execute
|
77
|
-
def post(path: nil,
|
78
|
-
execute(method: :post, path: path,
|
86
|
+
def post(path: nil, payload: nil, headers: {}, query: {})
|
87
|
+
execute(method: :post, path: path, headers: headers, query: query, payload: payload)
|
79
88
|
end
|
80
89
|
|
81
90
|
# Syntactical sugar for making PUT requests via the API.
|
82
91
|
# @see #execute
|
83
|
-
def put(path: nil,
|
84
|
-
execute(method: :put, path: path,
|
92
|
+
def put(path: nil, payload:, headers: {}, query: {})
|
93
|
+
execute(method: :put, path: path, headers: headers, query: query, payload: payload)
|
85
94
|
end
|
86
95
|
|
87
96
|
# Syntactical sugar for making DELETE requests via the API.
|
88
97
|
# @see #execute
|
89
|
-
def delete(path: nil,
|
90
|
-
execute(method: :delete, path: path,
|
98
|
+
def delete(path: nil, payload: nil, headers: {}, query: {})
|
99
|
+
execute(method: :delete, path: path, headers: headers, query: query, payload: payload)
|
91
100
|
end
|
92
101
|
# rubocop:enable Metrics/ParameterList
|
93
102
|
|
@@ -96,7 +105,7 @@ module Nylas
|
|
96
105
|
headers: headers, &block)
|
97
106
|
end
|
98
107
|
inform_on :rest_client_execute, level: :debug,
|
99
|
-
also_log: { result: true, values: %i
|
108
|
+
also_log: { result: true, values: %i[method url headers payload] }
|
100
109
|
|
101
110
|
def default_headers
|
102
111
|
@default_headers ||= {
|
@@ -106,16 +115,16 @@ module Nylas
|
|
106
115
|
}
|
107
116
|
end
|
108
117
|
|
109
|
-
|
118
|
+
def parse_response(response)
|
110
119
|
response.is_a?(Enumerable) ? response : JSON.parse(response, symbolize_names: true)
|
111
120
|
rescue JSON::ParserError
|
112
121
|
response
|
113
122
|
end
|
123
|
+
inform_on :parse_response, level: :debug, also_log: { result: true }
|
114
124
|
|
115
|
-
|
116
|
-
|
117
|
-
protocol
|
118
|
-
"#{protocol}//#{@access_token}:@#{domain}#{path}"
|
125
|
+
def url_for_path(path)
|
126
|
+
protocol, domain = api_server.split("//")
|
127
|
+
"#{protocol}//#{access_token}:@#{domain}#{path}"
|
119
128
|
end
|
120
129
|
|
121
130
|
private def handle_failed_response(result:, response:)
|
@@ -129,7 +138,7 @@ module Nylas
|
|
129
138
|
return if http_code == 200
|
130
139
|
return unless response.is_a?(Hash)
|
131
140
|
exception = HTTP_CODE_TO_EXCEPTIONS.fetch(http_code, APIError)
|
132
|
-
raise exception.new(response[
|
141
|
+
raise exception.new(response[:type], response[:message], response.fetch(:server_error, nil))
|
133
142
|
end
|
134
143
|
end
|
135
144
|
end
|