nylas 5.17.0 → 6.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/lib/nylas/client.rb +62 -0
  3. data/lib/nylas/config.rb +19 -0
  4. data/lib/nylas/errors.rb +41 -89
  5. data/lib/nylas/handler/admin_api_operations.rb +95 -0
  6. data/lib/nylas/handler/api_operations.rb +138 -0
  7. data/lib/nylas/handler/grants_api_operations.rb +99 -0
  8. data/lib/nylas/handler/http_client.rb +179 -0
  9. data/lib/nylas/resources/applications.rb +27 -0
  10. data/lib/nylas/resources/auth.rb +197 -0
  11. data/lib/nylas/resources/calendars.rb +31 -0
  12. data/lib/nylas/resources/events.rb +20 -0
  13. data/lib/nylas/resources/grants.rb +20 -0
  14. data/lib/nylas/resources/redirect_uris.rb +20 -0
  15. data/lib/nylas/resources/resource.rb +18 -0
  16. data/lib/nylas/resources/webhooks.rb +37 -0
  17. data/lib/nylas/version.rb +1 -1
  18. data/lib/nylas.rb +20 -148
  19. metadata +70 -257
  20. data/lib/nylas/account.rb +0 -56
  21. data/lib/nylas/api.rb +0 -246
  22. data/lib/nylas/application_details.rb +0 -13
  23. data/lib/nylas/calendar.rb +0 -46
  24. data/lib/nylas/calendar_collection.rb +0 -144
  25. data/lib/nylas/categorize.rb +0 -14
  26. data/lib/nylas/collection.rb +0 -175
  27. data/lib/nylas/component.rb +0 -35
  28. data/lib/nylas/component_collection.rb +0 -10
  29. data/lib/nylas/constraints.rb +0 -56
  30. data/lib/nylas/contact.rb +0 -53
  31. data/lib/nylas/contact_group.rb +0 -23
  32. data/lib/nylas/current_account.rb +0 -23
  33. data/lib/nylas/delta.rb +0 -56
  34. data/lib/nylas/deltas.rb +0 -19
  35. data/lib/nylas/deltas_collection.rb +0 -40
  36. data/lib/nylas/draft.rb +0 -100
  37. data/lib/nylas/email_address.rb +0 -12
  38. data/lib/nylas/event.rb +0 -144
  39. data/lib/nylas/event_collection.rb +0 -15
  40. data/lib/nylas/event_conferencing.rb +0 -12
  41. data/lib/nylas/event_conferencing_autocreate.rb +0 -10
  42. data/lib/nylas/event_conferencing_details.rb +0 -14
  43. data/lib/nylas/event_notification.rb +0 -17
  44. data/lib/nylas/file.rb +0 -75
  45. data/lib/nylas/filter_attributes.rb +0 -25
  46. data/lib/nylas/folder.rb +0 -26
  47. data/lib/nylas/free_busy.rb +0 -13
  48. data/lib/nylas/free_busy_collection.rb +0 -48
  49. data/lib/nylas/http_client.rb +0 -279
  50. data/lib/nylas/im_address.rb +0 -11
  51. data/lib/nylas/job_status.rb +0 -27
  52. data/lib/nylas/job_status_collection.rb +0 -21
  53. data/lib/nylas/label.rb +0 -27
  54. data/lib/nylas/logging.rb +0 -41
  55. data/lib/nylas/message.rb +0 -98
  56. data/lib/nylas/message_headers.rb +0 -27
  57. data/lib/nylas/message_tracking.rb +0 -13
  58. data/lib/nylas/model/attributable.rb +0 -89
  59. data/lib/nylas/model/attribute_definition.rb +0 -24
  60. data/lib/nylas/model/attributes.rb +0 -97
  61. data/lib/nylas/model/list_attribute_definition.rb +0 -39
  62. data/lib/nylas/model/transferable.rb +0 -53
  63. data/lib/nylas/model.rb +0 -217
  64. data/lib/nylas/native_authentication.rb +0 -39
  65. data/lib/nylas/neural.rb +0 -87
  66. data/lib/nylas/neural_categorizer.rb +0 -29
  67. data/lib/nylas/neural_clean_conversation.rb +0 -33
  68. data/lib/nylas/neural_contact_link.rb +0 -11
  69. data/lib/nylas/neural_contact_name.rb +0 -11
  70. data/lib/nylas/neural_message_options.rb +0 -35
  71. data/lib/nylas/neural_ocr.rb +0 -16
  72. data/lib/nylas/neural_sentiment_analysis.rb +0 -17
  73. data/lib/nylas/neural_signature_contact.rb +0 -81
  74. data/lib/nylas/neural_signature_extraction.rb +0 -18
  75. data/lib/nylas/new_message.rb +0 -39
  76. data/lib/nylas/nylas_date.rb +0 -25
  77. data/lib/nylas/open_hours.rb +0 -15
  78. data/lib/nylas/outbox.rb +0 -116
  79. data/lib/nylas/outbox_job_status.rb +0 -19
  80. data/lib/nylas/outbox_message.rb +0 -17
  81. data/lib/nylas/participant.rb +0 -13
  82. data/lib/nylas/phone_number.rb +0 -11
  83. data/lib/nylas/physical_address.rb +0 -17
  84. data/lib/nylas/raw_message.rb +0 -25
  85. data/lib/nylas/recurrence.rb +0 -11
  86. data/lib/nylas/registry.rb +0 -42
  87. data/lib/nylas/room_resource.rb +0 -19
  88. data/lib/nylas/rsvp.rb +0 -24
  89. data/lib/nylas/scheduler.rb +0 -51
  90. data/lib/nylas/scheduler_booking_confirmation.rb +0 -24
  91. data/lib/nylas/scheduler_booking_request.rb +0 -17
  92. data/lib/nylas/scheduler_collection.rb +0 -104
  93. data/lib/nylas/scheduler_config.rb +0 -20
  94. data/lib/nylas/scheduler_time_slot.rb +0 -14
  95. data/lib/nylas/search_collection.rb +0 -10
  96. data/lib/nylas/send_grid_verified_status.rb +0 -12
  97. data/lib/nylas/services/tunnel.rb +0 -128
  98. data/lib/nylas/thread.rb +0 -66
  99. data/lib/nylas/time_slot.rb +0 -16
  100. data/lib/nylas/time_slot_capacity.rb +0 -13
  101. data/lib/nylas/timespan.rb +0 -20
  102. data/lib/nylas/token_info.rb +0 -20
  103. data/lib/nylas/types.rb +0 -168
  104. data/lib/nylas/web_page.rb +0 -11
  105. data/lib/nylas/webhook.rb +0 -111
  106. data/lib/nylas/when.rb +0 -75
data/lib/nylas/file.rb DELETED
@@ -1,75 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nylas
4
- # Structure to represent a the File Schema.
5
- # @see https://docs.nylas.com/reference#events
6
- class File
7
- include Model
8
- self.resources_path = "/files"
9
- self.creatable = true
10
- self.listable = true
11
- self.showable = true
12
- self.filterable = true
13
- self.destroyable = true
14
- self.id_listable = true
15
- self.countable = true
16
-
17
- attribute :id, :string
18
- attribute :account_id, :string
19
- attribute :content_id, :string
20
- has_n_of_attribute :message_ids, :string
21
-
22
- attribute :object, :string
23
-
24
- attribute :content_type, :string
25
- attribute :filename, :string
26
- attribute :size, :integer
27
- attribute :content_disposition, :string
28
-
29
- attr_accessor :file
30
-
31
- # Downloads and caches a local copy of the file.
32
- # @return [Tempfile] - Local copy of the file
33
- def download
34
- return file if file
35
-
36
- self.file = retrieve_file
37
- end
38
-
39
- # Redownloads a file even if it's been cached. Closes and unlinks the tempfile to help memory usage.
40
- def download!
41
- return download if file.nil?
42
-
43
- file.close
44
- file.unlink
45
- self.file = nil
46
- download
47
- end
48
-
49
- def create
50
- save
51
- end
52
-
53
- def save
54
- raise ModelNotUpdatableError if persisted?
55
-
56
- response = api.execute(path: "/files", method: :post, headers: { multipart: true },
57
- payload: { file: file })
58
- attributes.merge(response.first)
59
- true
60
- end
61
-
62
- private
63
-
64
- def retrieve_file
65
- response = api.get(path: "#{resource_path}/download")
66
- filename = response.headers.fetch(:content_disposition, "").gsub("attachment; filename=", "")
67
- # The returned filename can be longer than 256 chars which isn't supported by rb_sysopen.
68
- # 128 chars here is more than enough given that TempFile ensure the filename will be unique.
69
- temp_file = Tempfile.new(filename[0..127], encoding: "ascii-8bit")
70
- temp_file.write(response.body)
71
- temp_file.seek(0)
72
- temp_file
73
- end
74
- end
75
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nylas
4
- # Methods to check and raise error if extra attributes are present
5
- class FilterAttributes
6
- def initialize(attributes:, allowed_attributes:)
7
- @attributes = attributes
8
- @allowed_attributes = allowed_attributes
9
- end
10
-
11
- def check
12
- return if extra_attributes.empty?
13
-
14
- raise ArgumentError, "Only #{allowed_attributes} are allowed to be sent"
15
- end
16
-
17
- private
18
-
19
- attr_reader :attributes, :allowed_attributes
20
-
21
- def extra_attributes
22
- attributes - allowed_attributes
23
- end
24
- end
25
- end
data/lib/nylas/folder.rb DELETED
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nylas
4
- # Structure to represent the Folder Schema
5
- # @see https://docs.nylas.com/reference#folders
6
- class Folder
7
- include Model
8
- self.resources_path = "/folders"
9
- self.creatable = true
10
- self.listable = true
11
- self.showable = true
12
- self.filterable = false
13
- self.updatable = true
14
- self.destroyable = true
15
- self.id_listable = true
16
- self.countable = true
17
-
18
- attribute :id, :string, read_only: true
19
- attribute :account_id, :string, read_only: true
20
- attribute :object, :string, read_only: true
21
-
22
- attribute :name, :string
23
- attribute :display_name, :string
24
- attribute :job_status_id, :string, read_only: true
25
- end
26
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nylas
4
- # Query free/busy information for a calendar during a certain time period
5
- # @see https://docs.nylas.com/reference#calendars-free-busy
6
- class FreeBusy
7
- include Model::Attributable
8
-
9
- attribute :email, :string
10
- attribute :object, :string
11
- has_n_of_attribute :time_slots, :time_slot
12
- end
13
- end
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nylas
4
- # Helper to get and build `FreeBusy` objects
5
- class FreeBusyCollection
6
- extend Forwardable
7
- def_delegators :each, :map, :select, :reject, :to_a, :take
8
- def_delegators :to_a, :first, :last, :[]
9
-
10
- def initialize(emails:, start_time:, end_time:, api:)
11
- @api = api
12
- @emails = emails
13
- @start_time = start_time
14
- @end_time = end_time
15
- end
16
-
17
- def each
18
- return enum_for(:each) unless block_given?
19
-
20
- execute.each do |result|
21
- yield(FreeBusy.new(**result))
22
- end
23
- end
24
-
25
- private
26
-
27
- attr_reader :api, :emails, :start_time, :end_time
28
-
29
- PATH = "/calendars/free-busy"
30
- private_constant :PATH
31
-
32
- def execute
33
- api.execute(
34
- method: :post,
35
- path: PATH,
36
- payload: payload
37
- )
38
- end
39
-
40
- def payload
41
- JSON.dump(
42
- emails: emails,
43
- start_time: start_time,
44
- end_time: end_time
45
- )
46
- end
47
- end
48
- end
@@ -1,279 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nylas
4
- require "yajl"
5
- require "base64"
6
-
7
- # Plain HTTP client that can be used to interact with the Nylas API sans any type casting.
8
- class HttpClient
9
- module AuthMethod
10
- BEARER = 1
11
- BASIC = 2
12
- end
13
-
14
- HTTP_SUCCESS_CODES = [200, 201, 202, 302].freeze
15
-
16
- HTTP_CODE_TO_EXCEPTIONS = {
17
- 400 => InvalidRequest,
18
- 401 => UnauthorizedRequest,
19
- 402 => MessageRejected,
20
- 403 => AccessDenied,
21
- 404 => ResourceNotFound,
22
- 405 => MethodNotAllowed,
23
- 410 => ResourceRemoved,
24
- 418 => TeapotError,
25
- 422 => MailProviderError,
26
- 429 => SendingQuotaExceeded,
27
- 500 => InternalError,
28
- 501 => EndpointNotYetImplemented,
29
- 502 => BadGateway,
30
- 503 => ServiceUnavailable,
31
- 504 => RequestTimedOut
32
- }.freeze
33
-
34
- ENDPOINT_TIMEOUTS = {
35
- "/oauth/authorize" => 345,
36
- "/messages/search" => 350,
37
- "/threads/search" => 350,
38
- "/delta" => 3650,
39
- "/delta/longpoll" => 3650,
40
- "/delta/streaming" => 3650
41
- }.freeze
42
-
43
- SUPPORTED_API_VERSION = "2.5"
44
-
45
- include Logging
46
- attr_accessor :api_server
47
- attr_writer :default_headers
48
- attr_reader :access_token
49
- attr_reader :app_id
50
- attr_reader :app_secret
51
-
52
- # @param app_id [String] Your application id from the Nylas Dashboard
53
- # @param app_secret [String] Your application secret from the Nylas Dashboard
54
- # @param access_token [String] (Optional) Your users access token.
55
- # @param api_server [String] (Optional) Which Nylas API Server to connect to. Only change this if
56
- # you're using a self-hosted Nylas instance.
57
- # @return [Nylas::HttpClient]
58
- def initialize(app_id:, app_secret:, access_token: nil, api_server: "https://api.nylas.com")
59
- unless api_server.include?("://")
60
- raise "When overriding the Nylas API server address, you must include https://"
61
- end
62
-
63
- @api_server = api_server
64
- @access_token = access_token
65
- @app_secret = app_secret
66
- @app_id = app_id
67
- end
68
-
69
- # @return [Nylas::HttpClient[]
70
- def as(access_token)
71
- HttpClient.new(app_id: app_id, access_token: access_token,
72
- app_secret: app_secret, api_server: api_server)
73
- end
74
-
75
- # Sends a request to the Nylas API and rai
76
- # @param method [Symbol] HTTP method for the API call. Either :get, :post, :delete, or :patch
77
- # @param path [String] (Optional, defaults to nil) - Relative path from the API Base. Preferred way to
78
- # execute arbitrary or-not-yet-SDK-ified API commands.
79
- # @param headers [Hash] (Optional, defaults to {}) - Additional HTTP headers to include in the payload.
80
- # @param query [Hash] (Optional, defaults to {}) - Hash of names and values to include in the query
81
- # section of the URI fragment
82
- # @param payload [String,Hash] (Optional, defaults to nil) - Body to send with the request.
83
- # @param auth_method [AuthMethod] (Optional, defaults to BEARER) - The authentication method.
84
- # @return [Array Hash Stringn]
85
- # rubocop:disable Metrics/MethodLength
86
- def execute(method:, path: nil, headers: {}, query: {}, payload: nil, auth_method: nil)
87
- timeout = ENDPOINT_TIMEOUTS.fetch(path, 230)
88
- request = build_request(
89
- method: method,
90
- path: path,
91
- headers: headers,
92
- query: query,
93
- payload: payload,
94
- timeout: timeout,
95
- auth_method: auth_method || AuthMethod::BEARER
96
- )
97
- rest_client_execute(**request) do |response, _request, result|
98
- content_type = nil
99
-
100
- if response.headers && response.headers[:content_type]
101
- content_type = response.headers[:content_type].downcase
102
- end
103
-
104
- begin
105
- response = parse_response(response) if content_type == "application/json"
106
- rescue Nylas::JsonParseError
107
- handle_failed_response(result: result, response: response)
108
- raise
109
- end
110
-
111
- handle_failed_response(result: result, response: response)
112
- response
113
- end
114
- end
115
- # rubocop:enable Metrics/MethodLength
116
- inform_on :execute, level: :debug,
117
- also_log: { result: true, values: %i[method url path headers query payload] }
118
-
119
- def build_request(
120
- method:,
121
- path: nil,
122
- headers: {},
123
- query: {},
124
- payload: nil,
125
- timeout: nil,
126
- auth_method: nil
127
- )
128
- url ||= url_for_path(path)
129
- url = add_query_params_to_url(url, query)
130
- resulting_headers = default_headers.merge(headers).merge(auth_header(auth_method))
131
- { method: method, url: url, payload: payload, headers: resulting_headers, timeout: timeout }
132
- end
133
-
134
- # Syntactical sugar for making GET requests via the API.
135
- # @see #execute
136
- def get(path: nil, headers: {}, query: {}, auth_method: nil)
137
- execute(method: :get, path: path, query: query, headers: headers, auth_method: auth_method)
138
- end
139
-
140
- # Syntactical sugar for making POST requests via the API.
141
- # @see #execute
142
- def post(path: nil, payload: nil, headers: {}, query: {}, auth_method: nil)
143
- execute(
144
- method: :post,
145
- path: path,
146
- headers: headers,
147
- query: query,
148
- payload: payload,
149
- auth_method: auth_method
150
- )
151
- end
152
-
153
- # Syntactical sugar for making PUT requests via the API.
154
- # @see #execute
155
- def put(path: nil, payload:, headers: {}, query: {}, auth_method: nil)
156
- execute(
157
- method: :put,
158
- path: path,
159
- headers: headers,
160
- query: query,
161
- payload: payload,
162
- auth_method: auth_method
163
- )
164
- end
165
-
166
- # Syntactical sugar for making DELETE requests via the API.
167
- # @see #execute
168
- def delete(path: nil, payload: nil, headers: {}, query: {}, auth_method: nil)
169
- execute(
170
- method: :delete,
171
- path: path,
172
- headers: headers,
173
- query: query,
174
- payload: payload,
175
- auth_method: auth_method
176
- )
177
- end
178
-
179
- def default_headers
180
- @default_headers ||= {
181
- "X-Nylas-API-Wrapper" => "ruby",
182
- "X-Nylas-Client-Id" => @app_id,
183
- "Nylas-API-Version" => SUPPORTED_API_VERSION,
184
- "User-Agent" => "Nylas Ruby SDK #{Nylas::VERSION} - #{RUBY_VERSION}",
185
- "Content-type" => "application/json"
186
- }
187
- end
188
-
189
- def parse_response(response)
190
- return response if response.is_a?(Enumerable)
191
-
192
- Yajl::Parser.new(symbolize_names: true).parse(response)
193
- rescue Yajl::ParseError
194
- raise Nylas::JsonParseError
195
- end
196
- inform_on :parse_response, level: :debug, also_log: { result: true }
197
-
198
- def url_for_path(path)
199
- protocol, domain = api_server.split("//")
200
- "#{protocol}//#{access_token}:@#{domain}#{path}"
201
- end
202
-
203
- private
204
-
205
- def rest_client_execute(method:, url:, headers:, payload:, timeout:, &block)
206
- ::RestClient::Request.execute(method: method, url: url, payload: payload,
207
- headers: headers, timeout: timeout, &block)
208
- end
209
-
210
- inform_on :rest_client_execute, level: :debug,
211
- also_log: { result: true, values: %i[method url headers payload] }
212
-
213
- def handle_failed_response(result:, response:)
214
- http_code = result.code.to_i
215
-
216
- handle_anticipated_failure_mode(http_code: http_code, response: response)
217
- raise UnexpectedResponse, result.msg if result.is_a?(Net::HTTPClientError)
218
- end
219
-
220
- def handle_anticipated_failure_mode(http_code:, response:)
221
- return if HTTP_SUCCESS_CODES.include?(http_code)
222
-
223
- exception = HTTP_CODE_TO_EXCEPTIONS.fetch(http_code, APIError)
224
- case response
225
- when Hash
226
- raise error_hash_to_exception(exception, response)
227
- when RestClient::Response
228
- raise exception.parse_error_response(response)
229
- else
230
- raise exception.new(http_code, response)
231
- end
232
- end
233
-
234
- def error_hash_to_exception(exception, response)
235
- exception.new(
236
- response[:type],
237
- response[:message],
238
- response.fetch(:server_error, nil)
239
- )
240
- end
241
-
242
- def add_query_params_to_url(url, query)
243
- unless query.empty?
244
- uri = URI.parse(url)
245
- query = custom_params(query)
246
- params = URI.decode_www_form(uri.query || "") + query.to_a
247
- uri.query = URI.encode_www_form(params)
248
- url = uri.to_s
249
- end
250
-
251
- url
252
- end
253
-
254
- def custom_params(query)
255
- # Convert hash to "<key>:<value>" form for metadata_pair query
256
- if query.key?(:metadata_pair)
257
- pairs = query[:metadata_pair].map do |key, value|
258
- "#{key}:#{value}"
259
- end
260
- query[:metadata_pair] = pairs
261
- end
262
-
263
- query
264
- end
265
-
266
- def auth_header(auth_method)
267
- authorization_string = case auth_method
268
- when AuthMethod::BEARER
269
- "Bearer #{access_token}"
270
- when AuthMethod::BASIC
271
- "Basic #{Base64.encode64("#{access_token}:")}"
272
- else
273
- "Bearer #{access_token}"
274
- end
275
-
276
- { "Authorization" => authorization_string }
277
- end
278
- end
279
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nylas
4
- # Structure to represent the IM Address Schema
5
- # @see https://docs.nylas.com/reference#contactsid
6
- class IMAddress
7
- include Model::Attributable
8
- attribute :type, :string
9
- attribute :im_address, :string
10
- end
11
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nylas
4
- # Ruby representation of a Nylas Job Status object
5
- # @see https://developer.nylas.com/docs/api/#tag--Job-Status
6
- class JobStatus
7
- include Model
8
- self.resources_path = "/job-statuses"
9
- self.listable = true
10
-
11
- attribute :id, :string, read_only: true
12
- attribute :account_id, :string, read_only: true
13
- attribute :job_status_id, :string, read_only: true
14
- attribute :action, :string, read_only: true
15
- attribute :object, :string, read_only: true
16
- attribute :status, :string, read_only: true
17
- attribute :created_at, :unix_timestamp, read_only: true
18
- attribute :reason, :string, read_only: true
19
- attribute :metadata, :hash, read_only: true
20
-
21
- # Returns the status of a job as a boolean
22
- # @return [Boolean] If the job was successful
23
- def successful?
24
- status == "successful"
25
- end
26
- end
27
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nylas
4
- # Additional methods for some of Calendar's other functionality
5
- # @see https://developer.nylas.com/docs/connectivity/calendar
6
- class JobStatusCollection < Collection
7
- def find_model(id)
8
- response = api.execute(
9
- **to_be_executed.merge(
10
- path: "#{resources_path}/#{id}",
11
- query: view_query
12
- )
13
- )
14
-
15
- object_type = response[:object]
16
- return OutboxJobStatus.from_hash(response, api: api) if object_type == "message"
17
-
18
- model.from_hash(response, api: api)
19
- end
20
- end
21
- end
data/lib/nylas/label.rb DELETED
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nylas
4
- # Structure to represent the Label Schema
5
- # @see https://docs.nylas.com/reference#labels
6
- class Label
7
- include Model
8
- self.resources_path = "/labels"
9
- self.creatable = true
10
- self.listable = true
11
- self.showable = true
12
- self.filterable = false
13
- self.updatable = true
14
- self.destroyable = true
15
- self.id_listable = true
16
- self.countable = true
17
-
18
- attribute :id, :string
19
- attribute :account_id, :string
20
- attribute :object, :string
21
-
22
- attribute :name, :string
23
- attribute :display_name, :string
24
- attribute :provider_id, :string
25
- attribute :job_status_id, :string, read_only: true
26
- end
27
- end
data/lib/nylas/logging.rb DELETED
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- begin
4
- require "informed"
5
- rescue LoadError
6
- end
7
-
8
- module Nylas
9
- # Exposes a shared logger for debugging purposes
10
- module Logging
11
- def self.included(object)
12
- if const_defined? :Informed
13
- object.include Informed
14
- Informed.logger = logger
15
- else
16
- object.extend NoOpInformOn
17
- end
18
- end
19
-
20
- def self.logger
21
- return @logger if @logger
22
-
23
- @logger = Logger.new(STDOUT)
24
- @logger.level = level
25
- @logger
26
- end
27
-
28
- def self.level
29
- Logger.const_get(ENV["NYLAS_LOG_LEVEL"] || :WARN)
30
- end
31
-
32
- def self.logger=(logger)
33
- @logger = logger
34
- end
35
-
36
- # No op for inform_on if user does not have the informed gem installed.
37
- module NoOpInformOn
38
- def inform_on(method, level: :debug, also_log: {}); end
39
- end
40
- end
41
- end
data/lib/nylas/message.rb DELETED
@@ -1,98 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nylas
4
- # Ruby representatin of a Nylas Message object
5
- # @see https://docs.nylas.com/reference#messages
6
- class Message
7
- include Model
8
- self.raw_mime_type = "message/rfc822"
9
- self.resources_path = "/messages"
10
- self.listable = true
11
- self.showable = true
12
- self.filterable = true
13
- self.updatable = true
14
- self.searchable = true
15
- self.id_listable = true
16
- self.countable = true
17
- UPDATABLE_ATTRIBUTES = %i[label_ids folder_id starred unread metadata].freeze
18
-
19
- attribute :id, :string
20
- attribute :object, :string
21
- attribute :account_id, :string
22
- attribute :thread_id, :string
23
-
24
- attribute :headers, :message_headers
25
-
26
- has_n_of_attribute :to, :email_address
27
- has_n_of_attribute :from, :email_address
28
- has_n_of_attribute :cc, :email_address
29
- has_n_of_attribute :bcc, :email_address
30
- has_n_of_attribute :reply_to, :email_address
31
-
32
- attribute :date, :unix_timestamp
33
- # This is only used when receiving a message received notification via a webhook
34
- attribute :received_date, :unix_timestamp
35
- attribute :subject, :string
36
- attribute :snippet, :string
37
- attribute :body, :string
38
- attribute :starred, :boolean
39
- attribute :unread, :boolean
40
-
41
- has_n_of_attribute :events, :event
42
- has_n_of_attribute :files, :file
43
- attribute :folder, :folder
44
- attribute :folder_id, :string
45
- attribute :metadata, :hash
46
- attribute :reply_to_message_id, :string, read_only: true
47
- attribute :job_status_id, :string, read_only: true
48
-
49
- has_n_of_attribute :labels, :label, read_only: true
50
- has_n_of_attribute :label_ids, :string
51
-
52
- transfer :api, to: %i[events files folder labels]
53
-
54
- def starred?
55
- starred
56
- end
57
-
58
- def unread?
59
- unread
60
- end
61
-
62
- def update(payload)
63
- FilterAttributes.new(
64
- attributes: payload.keys,
65
- allowed_attributes: UPDATABLE_ATTRIBUTES
66
- ).check
67
-
68
- super(**payload)
69
- end
70
-
71
- def update_folder(folder_id)
72
- update(folder_id: folder_id)
73
- end
74
-
75
- def expanded
76
- return self unless headers.nil?
77
-
78
- assign(**api.execute(method: :get, path: resource_path, query: { view: "expanded" }))
79
- # Transfer reference to the API to attributes that need it
80
- transfer_attributes
81
- self
82
- end
83
-
84
- def save
85
- handle_folder
86
-
87
- super
88
- end
89
-
90
- def handle_folder
91
- return if folder.nil?
92
-
93
- self.folder_id = folder.id if folder_id.nil? && !self.to_h.dig(:folder, :id).nil?
94
-
95
- self.folder = nil
96
- end
97
- end
98
- end