nylas-legacy 5.17.0 → 5.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/lib/nylas-legacy/account.rb +56 -0
  3. data/lib/nylas-legacy/api.rb +265 -0
  4. data/lib/nylas-legacy/application_details.rb +13 -0
  5. data/lib/nylas-legacy/calendar.rb +46 -0
  6. data/lib/nylas-legacy/calendar_collection.rb +144 -0
  7. data/lib/nylas-legacy/categorize.rb +14 -0
  8. data/lib/nylas-legacy/collection.rb +175 -0
  9. data/lib/nylas-legacy/component.rb +35 -0
  10. data/lib/nylas-legacy/component_collection.rb +10 -0
  11. data/lib/nylas-legacy/constraints.rb +56 -0
  12. data/lib/nylas-legacy/contact.rb +53 -0
  13. data/lib/nylas-legacy/contact_group.rb +23 -0
  14. data/lib/nylas-legacy/current_account.rb +23 -0
  15. data/lib/nylas-legacy/delta.rb +56 -0
  16. data/lib/nylas-legacy/deltas.rb +19 -0
  17. data/lib/nylas-legacy/deltas_collection.rb +40 -0
  18. data/lib/nylas-legacy/draft.rb +101 -0
  19. data/lib/nylas-legacy/email_address.rb +12 -0
  20. data/lib/nylas-legacy/errors.rb +111 -0
  21. data/lib/nylas-legacy/event.rb +144 -0
  22. data/lib/nylas-legacy/event_collection.rb +15 -0
  23. data/lib/nylas-legacy/event_conferencing.rb +12 -0
  24. data/lib/nylas-legacy/event_conferencing_autocreate.rb +10 -0
  25. data/lib/nylas-legacy/event_conferencing_details.rb +14 -0
  26. data/lib/nylas-legacy/event_notification.rb +17 -0
  27. data/lib/nylas-legacy/file.rb +75 -0
  28. data/lib/nylas-legacy/filter_attributes.rb +25 -0
  29. data/lib/nylas-legacy/folder.rb +26 -0
  30. data/lib/nylas-legacy/free_busy.rb +13 -0
  31. data/lib/nylas-legacy/free_busy_collection.rb +48 -0
  32. data/lib/nylas-legacy/http_client.rb +280 -0
  33. data/lib/nylas-legacy/im_address.rb +11 -0
  34. data/lib/nylas-legacy/job_status.rb +27 -0
  35. data/lib/nylas-legacy/job_status_collection.rb +21 -0
  36. data/lib/nylas-legacy/label.rb +27 -0
  37. data/lib/nylas-legacy/logging.rb +41 -0
  38. data/lib/nylas-legacy/message.rb +98 -0
  39. data/lib/nylas-legacy/message_headers.rb +27 -0
  40. data/lib/nylas-legacy/message_tracking.rb +13 -0
  41. data/lib/nylas-legacy/model/attributable.rb +89 -0
  42. data/lib/nylas-legacy/model/attribute_definition.rb +24 -0
  43. data/lib/nylas-legacy/model/attributes.rb +97 -0
  44. data/lib/nylas-legacy/model/list_attribute_definition.rb +39 -0
  45. data/lib/nylas-legacy/model/transferable.rb +53 -0
  46. data/lib/nylas-legacy/model.rb +217 -0
  47. data/lib/nylas-legacy/native_authentication.rb +39 -0
  48. data/lib/nylas-legacy/neural.rb +87 -0
  49. data/lib/nylas-legacy/neural_categorizer.rb +29 -0
  50. data/lib/nylas-legacy/neural_clean_conversation.rb +33 -0
  51. data/lib/nylas-legacy/neural_contact_link.rb +11 -0
  52. data/lib/nylas-legacy/neural_contact_name.rb +11 -0
  53. data/lib/nylas-legacy/neural_message_options.rb +35 -0
  54. data/lib/nylas-legacy/neural_ocr.rb +16 -0
  55. data/lib/nylas-legacy/neural_sentiment_analysis.rb +17 -0
  56. data/lib/nylas-legacy/neural_signature_contact.rb +81 -0
  57. data/lib/nylas-legacy/neural_signature_extraction.rb +18 -0
  58. data/lib/nylas-legacy/new_message.rb +41 -0
  59. data/lib/nylas-legacy/nylas_date.rb +25 -0
  60. data/lib/nylas-legacy/open_hours.rb +15 -0
  61. data/lib/nylas-legacy/outbox.rb +116 -0
  62. data/lib/nylas-legacy/outbox_job_status.rb +19 -0
  63. data/lib/nylas-legacy/outbox_message.rb +17 -0
  64. data/lib/nylas-legacy/participant.rb +13 -0
  65. data/lib/nylas-legacy/phone_number.rb +11 -0
  66. data/lib/nylas-legacy/physical_address.rb +17 -0
  67. data/lib/nylas-legacy/raw_message.rb +25 -0
  68. data/lib/nylas-legacy/recurrence.rb +11 -0
  69. data/lib/nylas-legacy/registry.rb +42 -0
  70. data/lib/nylas-legacy/room_resource.rb +19 -0
  71. data/lib/nylas-legacy/rsvp.rb +24 -0
  72. data/lib/nylas-legacy/scheduler.rb +51 -0
  73. data/lib/nylas-legacy/scheduler_booking_confirmation.rb +24 -0
  74. data/lib/nylas-legacy/scheduler_booking_request.rb +17 -0
  75. data/lib/nylas-legacy/scheduler_collection.rb +104 -0
  76. data/lib/nylas-legacy/scheduler_config.rb +20 -0
  77. data/lib/nylas-legacy/scheduler_time_slot.rb +14 -0
  78. data/lib/nylas-legacy/search_collection.rb +14 -0
  79. data/lib/nylas-legacy/send_grid_verified_status.rb +12 -0
  80. data/lib/nylas-legacy/services/tunnel.rb +128 -0
  81. data/lib/nylas-legacy/thread.rb +66 -0
  82. data/lib/nylas-legacy/time_slot.rb +16 -0
  83. data/lib/nylas-legacy/time_slot_capacity.rb +13 -0
  84. data/lib/nylas-legacy/timespan.rb +20 -0
  85. data/lib/nylas-legacy/token_info.rb +20 -0
  86. data/lib/nylas-legacy/types.rb +169 -0
  87. data/lib/nylas-legacy/version.rb +5 -0
  88. data/lib/nylas-legacy/web_page.rb +11 -0
  89. data/lib/nylas-legacy/webhook.rb +111 -0
  90. data/lib/nylas-legacy/when.rb +75 -0
  91. data/lib/nylas-legacy.rb +164 -0
  92. metadata +175 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ea515f4849901e54b4d638a8a9ad507b559c37c730f385836c0b560787edd20
4
- data.tar.gz: 9e991d5626b8605ed85224fb478df40f5a6d71bfaa8e55c6182874ddee76d948
3
+ metadata.gz: 607e84f20f666b534f194963686cc7be6b7eb1806a383053041c7c0aa1297335
4
+ data.tar.gz: 22cce4f9c9a2cb9aec4b5f2eff2f59c95465fe5d0e790eb50e4d5eda933faf0a
5
5
  SHA512:
6
- metadata.gz: a2611625a477b896643be281f234600d49ab5781e4b1f136298f41a55f7e5987442a01c35b603399d2f53e04e6de84941fd00b390d994d5af246d79a1ef1dcfe
7
- data.tar.gz: f14c0091a59ca117f4045382bd8c5888e077af35287712b9d8552422cd128979e800779bd251a85c8fdbf9a77b77d9d4c3d12554afffc9954b2bd3414c2e097b
6
+ metadata.gz: '019a2409e905818fe5deefce5a7f68d1613d4ee0f8840bc1a72ca18fb0d084f16307f464a586104047ecfe009bb1b99fccf670f2beb519eaff55f81092639c2b'
7
+ data.tar.gz: 4f131fa1fc168e9eb729ce20aac3de5ab3502b5eb78fff5728655032de0db7c9fc47a7f32e4abe365a6656143ba024380efaa2cd1231a52b9b392519843282ef
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NylasLegacy
4
+ # Representation of the accounts for Account management purposes.
5
+ # @see https://docs.nylas.com/reference#account-management
6
+ class Account
7
+ include Model
8
+ self.listable = true
9
+ self.showable = true
10
+ self.updatable = true
11
+ self.destroyable = true
12
+ self.filterable = true
13
+ self.auth_method = HttpClient::AuthMethod::BASIC
14
+
15
+ attribute :id, :string, read_only: true
16
+ attribute :account_id, :string, read_only: true
17
+ attribute :billing_state, :string, read_only: true
18
+ attribute :sync_state, :string, read_only: true
19
+ attribute :provider, :string, read_only: true
20
+ attribute :authentication_type, :string, read_only: true
21
+
22
+ attribute :email, :string, read_only: true
23
+ attribute :trial, :boolean, read_only: true
24
+ attribute :metadata, :hash
25
+
26
+ def upgrade
27
+ response = execute(method: :post, path: "#{resource_path}/upgrade")
28
+ response[:success]
29
+ end
30
+
31
+ def downgrade
32
+ response = execute(method: :post, path: "#{resource_path}/downgrade")
33
+ response[:success]
34
+ end
35
+
36
+ def revoke_all(keep_access_token: nil)
37
+ payload = JSON.dump(keep_access_token: keep_access_token) if keep_access_token
38
+
39
+ response = execute(method: :post, path: "#{resource_path}/revoke-all", payload: payload)
40
+ response[:success]
41
+ end
42
+
43
+ # Return information about an account's access token
44
+ # @param access_token [String] The access token to inquire about
45
+ # @return [TokenInfo] The access token information
46
+ def token_info(access_token)
47
+ payload = JSON.dump(access_token: access_token)
48
+ response = execute(method: :post, path: "#{resource_path}/token-info", payload: payload)
49
+ TokenInfo.new(**response)
50
+ end
51
+
52
+ def self.resources_path(api:)
53
+ "/a/#{api.app_id}/accounts"
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,265 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NylasLegacy
4
+ # Methods to retrieve data from the Nylas API as Ruby objects
5
+ class API
6
+ attr_accessor :client
7
+
8
+ extend Forwardable
9
+ def_delegators :client, :execute, :get, :post, :put, :delete, :app_id, :api_server
10
+
11
+ include Logging
12
+
13
+ # @param client [HttpClient] Http Client to use for retrieving data
14
+ # @param app_id [String] Your application id from the Nylas Dashboard
15
+ # @param app_secret [String] Your application secret from the Nylas Dashboard
16
+ # @param access_token [String] (Optional) Your users access token.
17
+ # @param api_server [String] (Optional) Which Nylas API Server to connect to. Only change this if
18
+ # you're using a self-hosted Nylas instance.
19
+ # @return [NylasLegacy::API]
20
+ def initialize(client: nil, app_id: nil, app_secret: nil, access_token: nil,
21
+ api_server: "https://api.nylas.com")
22
+ self.client = client || HttpClient.new(app_id: app_id, app_secret: app_secret,
23
+ access_token: access_token, api_server: api_server)
24
+ end
25
+
26
+ # @return [String] A Nylas access token for that particular user.
27
+ def authenticate(name:, email_address:, provider:, settings:, reauth_account_id: nil, scopes: nil,
28
+ return_full_response: false)
29
+ NativeAuthentication.new(api: self).authenticate(
30
+ name: name,
31
+ email_address: email_address,
32
+ provider: provider,
33
+ settings: settings,
34
+ reauth_account_id: reauth_account_id,
35
+ scopes: scopes,
36
+ return_full_response: return_full_response
37
+ )
38
+ end
39
+
40
+ def authentication_url(redirect_uri:, scopes:, response_type: "code", login_hint: nil, state: nil,
41
+ provider: nil, redirect_on_error: nil, disable_provider_selection: nil)
42
+ params = { client_id: app_id, redirect_uri: redirect_uri, response_type: response_type,
43
+ login_hint: login_hint }
44
+
45
+ params[:state] = state if state
46
+ params[:scopes] = scopes.join(",") if scopes
47
+ params[:provider] = provider if provider
48
+ params[:redirect_on_error] = redirect_on_error if redirect_on_error
49
+ params[:disable_provider_selection] = disable_provider_selection if disable_provider_selection
50
+
51
+ "#{api_server}/oauth/authorize?#{URI.encode_www_form(params)}"
52
+ end
53
+
54
+ # Exchanges an authorization code for an access token
55
+ # @param code [String] The authorization code to exchange
56
+ # @param return_full_response [Boolean] If true, returns the full response body instead of just the token
57
+ # @return [String | Hash] Returns just the access token as a string, or the full response as a hash
58
+ def exchange_code_for_token(code, return_full_response: false)
59
+ data = {
60
+ "client_id" => app_id,
61
+ "client_secret" => client.app_secret,
62
+ "grant_type" => "authorization_code",
63
+ "code" => code
64
+ }
65
+
66
+ response = execute(method: :post, path: "/oauth/token", payload: data)
67
+ return_full_response ? response : response[:access_token]
68
+ end
69
+
70
+ # @return [Collection<Contact>] A queryable collection of Contacts
71
+ def contacts
72
+ @contacts ||= Collection.new(model: Contact, api: self)
73
+ end
74
+
75
+ # @return [Collection<ContactGroup>] A queryable collection of Contact Groups
76
+ def contact_groups
77
+ @contact_groups ||= Collection.new(model: ContactGroup, api: self)
78
+ end
79
+
80
+ # @return [CurrentAccount] The account details for whomevers access token is set
81
+ def current_account
82
+ prevent_calling_if_missing_access_token(:current_account)
83
+ CurrentAccount.from_hash(execute(method: :get, path: "/account"), api: self)
84
+ end
85
+
86
+ # @return [Collection<Account>] A queryable collection of {Account}s
87
+ def accounts
88
+ @accounts ||= Collection.new(model: Account, api: as(client.app_secret))
89
+ end
90
+
91
+ # @return [CalendarCollection<Calendar>] A queryable collection of {Calendar}s
92
+ def calendars
93
+ @calendars ||= CalendarCollection.new(model: Calendar, api: self)
94
+ end
95
+
96
+ # @return [DeltasCollection<Delta>] A queryable collection of Deltas, which are themselves a collection.
97
+ def deltas
98
+ @deltas ||= DeltasCollection.new(api: self)
99
+ end
100
+
101
+ # @return[Collection<Draft>] A queryable collection of {Draft} objects
102
+ def drafts
103
+ @drafts ||= Collection.new(model: Draft, api: self)
104
+ end
105
+
106
+ # @return [EventCollection<Event>] A queryable collection of {Event}s
107
+ def events
108
+ @events ||= EventCollection.new(model: Event, api: self)
109
+ end
110
+
111
+ # @return [Collection<Folder>] A queryable collection of {Folder}s
112
+ def folders
113
+ @folders ||= Collection.new(model: Folder, api: self)
114
+ end
115
+
116
+ # @return [Collection<File>] A queryable collection of {File}s
117
+ def files
118
+ @files ||= Collection.new(model: File, api: self)
119
+ end
120
+
121
+ # @return [Collection<Label>] A queryable collection of {Label} objects
122
+ def labels
123
+ @labels ||= Collection.new(model: Label, api: self)
124
+ end
125
+
126
+ # @return[Collection<Message>] A queryable collection of {Message} objects
127
+ def messages
128
+ @messages ||= Collection.new(model: Message, api: self)
129
+ end
130
+
131
+ # @return[Collection<RoomResource>] A queryable collection of {RoomResource} objects
132
+ def room_resources
133
+ @room_resources ||= Collection.new(model: RoomResource, api: self)
134
+ end
135
+
136
+ # @return[Collection<JobStatus>] A queryable collection of {JobStatus} objects
137
+ def job_statuses
138
+ @job_statuses ||= JobStatusCollection.new(model: JobStatus, api: self)
139
+ end
140
+
141
+ # @return[OutboxCollection] A collection of Outbox operations
142
+ def outbox
143
+ @outbox ||= Outbox.new(api: self)
144
+ end
145
+
146
+ # @return[SchedulerCollection<Scheduler>] A queryable collection of {Scheduler} objects
147
+ def scheduler
148
+ # Make a deep copy of the API as the scheduler API uses a different base URL
149
+ scheduler_api = Marshal.load(Marshal.dump(self))
150
+ scheduler_api.client.api_server = "https://api.schedule.nylas.com"
151
+ @scheduler ||= SchedulerCollection.new(model: Scheduler, api: scheduler_api)
152
+ end
153
+
154
+ # @return[Neural] A collection of Neural operations
155
+ def neural
156
+ @neural ||= Neural.new(api: self)
157
+ end
158
+
159
+ # @return [Collection<Component>] A queryable collection of {Component}s
160
+ def components
161
+ @components ||= ComponentCollection.new(model: Component, api: as(client.app_secret))
162
+ end
163
+
164
+ # Revokes access to the Nylas API for the given access token
165
+ # @return [Boolean]
166
+ def revoke(access_token)
167
+ response = client.as(access_token).post(path: "/oauth/revoke")
168
+ response.code == 200 && response.empty?
169
+ end
170
+
171
+ # Returns the application details
172
+ # @return [ApplicationDetail] The application details
173
+ def application_details
174
+ response = client.as(client.app_secret).execute(
175
+ method: :get,
176
+ path: "/a/#{app_id}",
177
+ auth_method: HttpClient::AuthMethod::BASIC
178
+ )
179
+ ApplicationDetail.new(**response)
180
+ end
181
+
182
+ # Updates the application details
183
+ # @param application_details [ApplicationDetail] The updated application details
184
+ # @return [ApplicationDetails] The updated application details, returned from the server
185
+ def update_application_details(application_details)
186
+ response = client.as(client.app_secret).execute(
187
+ method: :put,
188
+ path: "/a/#{app_id}",
189
+ payload: JSON.dump(application_details.to_h),
190
+ auth_method: HttpClient::AuthMethod::BASIC
191
+ )
192
+ ApplicationDetail.new(**response)
193
+ end
194
+
195
+ # Returns list of IP addresses
196
+ # @return [Hash]
197
+ # hash has keys of :updated_at (unix timestamp) and :ip_addresses (array of strings)
198
+ def ip_addresses
199
+ path = "/a/#{app_id}/ip_addresses"
200
+ client.as(client.app_secret).get(path: path, auth_method: HttpClient::AuthMethod::BASIC)
201
+ end
202
+
203
+ # Returns list of IP addresses
204
+ # @param email_address [String] The email address to detect the provider for
205
+ # @return [Hash] The provider information
206
+ # hash has keys of :updated_at (unix timestamp) and :ip_addresses (array of strings)
207
+ def detect_provider(email_address)
208
+ payload = {
209
+ "client_id" => app_id,
210
+ "client_secret" => client.app_secret,
211
+ "email_address" => email_address
212
+ }
213
+
214
+ client.as(client.app_secret).execute(
215
+ method: :post,
216
+ path: "/connect/detect-provider",
217
+ payload: JSON.dump(payload)
218
+ )
219
+ end
220
+
221
+ # @param message [Hash, String, #send!]
222
+ # @return [Message] The resulting message
223
+ def send!(message)
224
+ return message.send! if message.respond_to?(:send!)
225
+ return NewMessage.new(**message.merge(api: self)).send! if message.respond_to?(:key?)
226
+
227
+ RawMessage.new(message, api: self).send! if message.is_a? String
228
+ end
229
+
230
+ # Allows you to get an API that acts as a different user but otherwise has the same settings
231
+ # @param access_token [String] Oauth Access token or app secret used to authenticate with the API
232
+ # @return [API]
233
+ def as(access_token)
234
+ API.new(client: client.as(access_token))
235
+ end
236
+
237
+ # @return [Collection<Thread>] A queryable collection of Threads
238
+ def threads
239
+ @threads ||= Collection.new(model: Thread, api: self)
240
+ end
241
+
242
+ # @return [Collection<Webhook>] A queryable collection of {Webhook}s
243
+ def webhooks
244
+ @webhooks ||= Collection.new(model: Webhook, api: as(client.app_secret))
245
+ end
246
+
247
+ # TODO: Move this into calendar collection
248
+ def free_busy(emails:, start_time:, end_time:)
249
+ FreeBusyCollection.new(
250
+ api: self,
251
+ emails: emails,
252
+ start_time: start_time.to_i,
253
+ end_time: end_time.to_i
254
+ )
255
+ end
256
+
257
+ private
258
+
259
+ def prevent_calling_if_missing_access_token(method_name)
260
+ return if client.access_token && !client.access_token.empty?
261
+
262
+ raise NoAuthToken, method_name
263
+ end
264
+ end
265
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NylasLegacy
4
+ # Structure to represent a Nylas Application Detail object.
5
+ # @see https://developer.nylas.com/docs/api/#get/a/client_id
6
+ class ApplicationDetail
7
+ include Model::Attributable
8
+
9
+ attribute :application_name, :string
10
+ attribute :icon_url, :string
11
+ has_n_of_attribute :redirect_uris, :string
12
+ end
13
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NylasLegacy
4
+ # Ruby bindings for the Nylas Calendar API
5
+ # @see https://docs.nylas.com/reference#calendars
6
+ class Calendar
7
+ include Model
8
+ self.resources_path = "/calendars"
9
+ self.creatable = true
10
+ self.listable = true
11
+ self.showable = true
12
+ self.filterable = true
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
+
21
+ attribute :object, :string
22
+
23
+ attribute :name, :string
24
+ attribute :description, :string
25
+ attribute :is_primary, :boolean
26
+ attribute :location, :string
27
+ attribute :timezone, :string
28
+
29
+ attribute :read_only, :boolean
30
+ attribute :metadata, :hash
31
+ attribute :job_status_id, :string, read_only: true
32
+ attribute :hex_color, :string, read_only: true
33
+
34
+ def read_only?
35
+ read_only == true
36
+ end
37
+
38
+ def primary?
39
+ is_primary
40
+ end
41
+
42
+ def events
43
+ api.events.where(calendar_id: id)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NylasLegacy
4
+ # Additional methods for some of Calendar's other functionality
5
+ # @see https://developer.nylas.com/docs/connectivity/calendar
6
+ class CalendarCollection < Collection
7
+ # Check multiple calendars to find available time slots for a single meeting
8
+ # @param duration_minutes [Integer] The total number of minutes the event should last
9
+ # @param interval_minutes [Integer] How many minutes it should check for availability
10
+ # @param start_time [Integer] The timestamp for the beginning of the event
11
+ # @param end_time [Integer] The timestamp for the end of the event
12
+ # @param emails [Array<String>] Emails on the same domain to check
13
+ # @param buffer [Integer] The amount of buffer time in minutes that you want around existing meetings
14
+ # @param round_robin [String] Finds available meeting times in a round-robin style
15
+ # @param event_collection_id [String] Unique identifier for a collection of events that are created
16
+ # @param free_busy [Array<NylasLegacy::FreeBusy>] A list of free-busy data for users not in your organization
17
+ # @param open_hours [Array<NylasLegacy::OpenHours>] Additional times email accounts are available
18
+ # @param calendars [Array] Check account and calendar IDs for free/busy status
19
+ # @return [Hash] The availability information; a list of time slots where all participants are available
20
+ def availability(duration_minutes:,
21
+ interval_minutes:,
22
+ start_time:,
23
+ end_time:,
24
+ emails: [],
25
+ buffer: nil,
26
+ round_robin: nil,
27
+ event_collection_id: nil,
28
+ free_busy: [],
29
+ open_hours: [],
30
+ calendars: [])
31
+ validate_calendars_or_emails(calendars, emails)
32
+ validate_open_hours(emails, free_busy, open_hours) unless open_hours.empty?
33
+
34
+ payload = {
35
+ duration_minutes: duration_minutes,
36
+ interval_minutes: interval_minutes,
37
+ start_time: start_time,
38
+ end_time: end_time,
39
+ emails: emails,
40
+ free_busy: free_busy.map(&:to_h),
41
+ open_hours: open_hours.map(&:to_h),
42
+ calendars: calendars
43
+ }
44
+ payload[:buffer] = buffer if buffer
45
+ payload[:round_robin] = round_robin if round_robin
46
+ payload[:event_collection_id] = event_collection_id if event_collection_id
47
+
48
+ execute_availability("/calendars/availability", **payload)
49
+ end
50
+
51
+ # Check multiple calendars to find availability for multiple meetings with several participants
52
+ # @param duration_minutes [Integer] The total number of minutes the event should last
53
+ # @param interval_minutes [Integer] How many minutes it should check for availability
54
+ # @param start_time [Integer] The timestamp for the beginning of the event
55
+ # @param end_time [Integer] The timestamp for the end of the event
56
+ # @param emails [Array<Array<String>>] Emails on the same domain to check
57
+ # @param buffer [Integer] The amount of buffer time in minutes that you want around existing meetings
58
+ # @param free_busy [Array<NylasLegacy::FreeBusy>] A list of free-busy data for users not in your organization
59
+ # @param open_hours [Array<NylasLegacy::OpenHours>] Additional times email accounts are available
60
+ # @param calendars [Array] Check account and calendar IDs for free/busy status
61
+ # @return [Hash] The availability information; a list of all possible groupings that share time slots
62
+ def consecutive_availability(duration_minutes:,
63
+ interval_minutes:,
64
+ start_time:,
65
+ end_time:,
66
+ emails: [],
67
+ buffer: nil,
68
+ free_busy: [],
69
+ open_hours: [],
70
+ calendars: [])
71
+ validate_calendars_or_emails(emails, calendars)
72
+ validate_open_hours(emails, free_busy, open_hours) unless open_hours.empty?
73
+
74
+ payload = {
75
+ duration_minutes: duration_minutes,
76
+ interval_minutes: interval_minutes,
77
+ start_time: start_time,
78
+ end_time: end_time,
79
+ emails: emails,
80
+ free_busy: free_busy.map(&:to_h),
81
+ open_hours: open_hours.map(&:to_h),
82
+ calendars: calendars
83
+ }
84
+ payload[:buffer] = buffer if buffer
85
+
86
+ execute_availability("/calendars/availability/consecutive", **payload)
87
+ end
88
+
89
+ private
90
+
91
+ def execute_availability(path, **payload)
92
+ api.execute(
93
+ method: :post,
94
+ path: path,
95
+ payload: JSON.dump(payload)
96
+ )
97
+ end
98
+
99
+ def validate_calendars_or_emails(calendars, emails)
100
+ return unless calendars.empty? && emails.empty?
101
+
102
+ raise ArgumentError, "You must provide at least one of 'emails' or 'calendars'"
103
+ end
104
+
105
+ def validate_open_hours(emails, free_busy, open_hours)
106
+ raise TypeError, "open_hours' must be an array." unless open_hours.is_a?(Array)
107
+
108
+ open_hours_emails = map_open_hours_emails(open_hours)
109
+ free_busy_emails = map_free_busy_emails(free_busy)
110
+ emails = merge_arrays(emails) if emails[0].is_a?(Array)
111
+
112
+ open_hours_emails.each do |email|
113
+ next if emails.include?(email) || free_busy_emails.include?(email)
114
+
115
+ raise ArgumentError, "Open Hours cannot contain an email not present in the main email list or
116
+ the free busy email list."
117
+ end
118
+ end
119
+
120
+ def map_open_hours_emails(open_hours)
121
+ open_hours_emails = []
122
+ open_hours.map do |oh|
123
+ open_hours_emails += oh.emails
124
+ end
125
+ open_hours_emails
126
+ end
127
+
128
+ def map_free_busy_emails(free_busy)
129
+ free_busy_emails = []
130
+ free_busy.map do |fb|
131
+ free_busy_emails.append(fb.email)
132
+ end
133
+ free_busy_emails
134
+ end
135
+
136
+ def merge_arrays(array)
137
+ list = []
138
+ array.each do |x|
139
+ list += x
140
+ end
141
+ list
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NylasLegacy
4
+ # Structure to represent the Neural Categorize object.
5
+ # @see https://developer.nylas.com/docs/intelligence/categorizer/#categorize-message-response
6
+ class Categorize
7
+ include Model::Attributable
8
+
9
+ attribute :category, :string
10
+ attribute :categorized_at, :unix_timestamp
11
+ attribute :model_version, :string
12
+ has_n_of_attribute :subcategories, :string
13
+ end
14
+ end