nylas_v2 5.14.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/nylas_v2/account.rb +56 -0
- data/lib/nylas_v2/api.rb +244 -0
- data/lib/nylas_v2/application_details.rb +13 -0
- data/lib/nylas_v2/calendar.rb +46 -0
- data/lib/nylas_v2/calendar_collection.rb +144 -0
- data/lib/nylas_v2/categorize.rb +14 -0
- data/lib/nylas_v2/collection.rb +175 -0
- data/lib/nylas_v2/component.rb +35 -0
- data/lib/nylas_v2/component_collection.rb +10 -0
- data/lib/nylas_v2/constraints.rb +56 -0
- data/lib/nylas_v2/contact.rb +53 -0
- data/lib/nylas_v2/contact_group.rb +23 -0
- data/lib/nylas_v2/current_account.rb +23 -0
- data/lib/nylas_v2/delta.rb +56 -0
- data/lib/nylas_v2/deltas.rb +19 -0
- data/lib/nylas_v2/deltas_collection.rb +40 -0
- data/lib/nylas_v2/draft.rb +100 -0
- data/lib/nylas_v2/email_address.rb +12 -0
- data/lib/nylas_v2/errors.rb +111 -0
- data/lib/nylas_v2/event.rb +141 -0
- data/lib/nylas_v2/event_collection.rb +15 -0
- data/lib/nylas_v2/event_conferencing.rb +12 -0
- data/lib/nylas_v2/event_conferencing_autocreate.rb +10 -0
- data/lib/nylas_v2/event_conferencing_details.rb +14 -0
- data/lib/nylas_v2/event_notification.rb +17 -0
- data/lib/nylas_v2/file.rb +75 -0
- data/lib/nylas_v2/filter_attributes.rb +25 -0
- data/lib/nylas_v2/folder.rb +26 -0
- data/lib/nylas_v2/free_busy.rb +13 -0
- data/lib/nylas_v2/free_busy_collection.rb +48 -0
- data/lib/nylas_v2/http_client.rb +279 -0
- data/lib/nylas_v2/im_address.rb +11 -0
- data/lib/nylas_v2/job_status.rb +27 -0
- data/lib/nylas_v2/job_status_collection.rb +21 -0
- data/lib/nylas_v2/label.rb +27 -0
- data/lib/nylas_v2/logging.rb +41 -0
- data/lib/nylas_v2/message.rb +98 -0
- data/lib/nylas_v2/message_headers.rb +27 -0
- data/lib/nylas_v2/message_tracking.rb +13 -0
- data/lib/nylas_v2/model/attributable.rb +89 -0
- data/lib/nylas_v2/model/attribute_definition.rb +24 -0
- data/lib/nylas_v2/model/attributes.rb +97 -0
- data/lib/nylas_v2/model/list_attribute_definition.rb +39 -0
- data/lib/nylas_v2/model/transferable.rb +53 -0
- data/lib/nylas_v2/model.rb +217 -0
- data/lib/nylas_v2/native_authentication.rb +39 -0
- data/lib/nylas_v2/neural.rb +87 -0
- data/lib/nylas_v2/neural_categorizer.rb +29 -0
- data/lib/nylas_v2/neural_clean_conversation.rb +33 -0
- data/lib/nylas_v2/neural_contact_link.rb +11 -0
- data/lib/nylas_v2/neural_contact_name.rb +11 -0
- data/lib/nylas_v2/neural_message_options.rb +35 -0
- data/lib/nylas_v2/neural_ocr.rb +16 -0
- data/lib/nylas_v2/neural_sentiment_analysis.rb +17 -0
- data/lib/nylas_v2/neural_signature_contact.rb +81 -0
- data/lib/nylas_v2/neural_signature_extraction.rb +18 -0
- data/lib/nylas_v2/new_message.rb +39 -0
- data/lib/nylas_v2/nylas_date.rb +25 -0
- data/lib/nylas_v2/open_hours.rb +15 -0
- data/lib/nylas_v2/outbox.rb +116 -0
- data/lib/nylas_v2/outbox_job_status.rb +19 -0
- data/lib/nylas_v2/outbox_message.rb +17 -0
- data/lib/nylas_v2/participant.rb +13 -0
- data/lib/nylas_v2/phone_number.rb +11 -0
- data/lib/nylas_v2/physical_address.rb +17 -0
- data/lib/nylas_v2/raw_message.rb +25 -0
- data/lib/nylas_v2/recurrence.rb +11 -0
- data/lib/nylas_v2/registry.rb +42 -0
- data/lib/nylas_v2/room_resource.rb +19 -0
- data/lib/nylas_v2/rsvp.rb +24 -0
- data/lib/nylas_v2/scheduler.rb +51 -0
- data/lib/nylas_v2/scheduler_booking_confirmation.rb +24 -0
- data/lib/nylas_v2/scheduler_booking_request.rb +17 -0
- data/lib/nylas_v2/scheduler_collection.rb +104 -0
- data/lib/nylas_v2/scheduler_config.rb +20 -0
- data/lib/nylas_v2/scheduler_time_slot.rb +14 -0
- data/lib/nylas_v2/search_collection.rb +10 -0
- data/lib/nylas_v2/send_grid_verified_status.rb +12 -0
- data/lib/nylas_v2/thread.rb +66 -0
- data/lib/nylas_v2/time_slot.rb +16 -0
- data/lib/nylas_v2/time_slot_capacity.rb +13 -0
- data/lib/nylas_v2/timespan.rb +20 -0
- data/lib/nylas_v2/token_info.rb +20 -0
- data/lib/nylas_v2/types.rb +168 -0
- data/lib/nylas_v2/version.rb +5 -0
- data/lib/nylas_v2/web_page.rb +11 -0
- data/lib/nylas_v2/webhook.rb +98 -0
- data/lib/nylas_v2/when.rb +75 -0
- data/lib/nylas_v2.rb +162 -0
- metadata +415 -0
@@ -0,0 +1,111 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NylasV2
|
4
|
+
Error = Class.new(::StandardError)
|
5
|
+
|
6
|
+
class ModelActionError < Error; end
|
7
|
+
class ModelNotFilterableError < ModelActionError; end
|
8
|
+
class ModelNotCreatableError < ModelActionError; end
|
9
|
+
class ModelNotShowableError < ModelActionError; end
|
10
|
+
class ModelNotAvailableAsRawError < ModelActionError; end
|
11
|
+
class ModelNotListableError < ModelActionError; end
|
12
|
+
class ModelNotFilterableError < ModelActionError; end
|
13
|
+
class ModelNotSearchableError < ModelActionError; end
|
14
|
+
class ModelNotUpdatableError < ModelActionError; end
|
15
|
+
class ModelNotDestroyableError < ModelActionError; end
|
16
|
+
|
17
|
+
class JsonParseError < Error; end
|
18
|
+
|
19
|
+
# Raised when attempting to set a field that is not on a model with mass assignment
|
20
|
+
class ModelMissingFieldError < ModelActionError
|
21
|
+
def initialize(field, model)
|
22
|
+
super("#{field} is not a valid attribute for #{model.class.name}")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Indicates that a given method needs an access token to work.
|
27
|
+
class NoAuthToken < Error
|
28
|
+
def initialize(method_name)
|
29
|
+
super "No access token was provided and the #{method_name} method requires one"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
UnexpectedAccountAction = Class.new(Error)
|
34
|
+
UnexpectedResponse = Class.new(Error)
|
35
|
+
|
36
|
+
# Base class to inflate the standard errors returned from the Nylas API
|
37
|
+
class APIError < Error
|
38
|
+
attr_accessor :type
|
39
|
+
attr_accessor :message
|
40
|
+
attr_accessor :server_error
|
41
|
+
|
42
|
+
def initialize(type, message, server_error = nil)
|
43
|
+
super(message)
|
44
|
+
self.type = type
|
45
|
+
self.message = message
|
46
|
+
self.server_error = server_error
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.parse_error_response(response)
|
50
|
+
new(
|
51
|
+
response["type"],
|
52
|
+
response["message"],
|
53
|
+
response["server_error"]
|
54
|
+
)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Error class representing a 429 error response, with details on the rate limit
|
59
|
+
class RateLimitError < APIError
|
60
|
+
attr_accessor :rate_limit
|
61
|
+
attr_accessor :rate_limit_reset
|
62
|
+
|
63
|
+
RATE_LIMIT_LIMIT_HEADER = "x_ratelimit_limit"
|
64
|
+
RATE_LIMIT_RESET_HEADER = "x_ratelimit_reset"
|
65
|
+
|
66
|
+
def initialize(type, message, server_error = nil, rate_limit = nil, rate_limit_reset = nil)
|
67
|
+
super(type, message, server_error)
|
68
|
+
self.rate_limit = rate_limit
|
69
|
+
self.rate_limit_reset = rate_limit_reset
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.parse_error_response(response)
|
73
|
+
rate_limit, rate_limit_rest = extract_rate_limit_details(response)
|
74
|
+
|
75
|
+
new(
|
76
|
+
response["type"],
|
77
|
+
response["message"],
|
78
|
+
response["server_error"],
|
79
|
+
rate_limit,
|
80
|
+
rate_limit_rest
|
81
|
+
)
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.extract_rate_limit_details(response)
|
85
|
+
return nil, nil unless response.respond_to?(:headers)
|
86
|
+
|
87
|
+
rate_limit = response.headers[RATE_LIMIT_LIMIT_HEADER.to_sym].to_i
|
88
|
+
rate_limit_rest = response.headers[RATE_LIMIT_RESET_HEADER.to_sym].to_i
|
89
|
+
|
90
|
+
[rate_limit, rate_limit_rest]
|
91
|
+
end
|
92
|
+
|
93
|
+
private_class_method :extract_rate_limit_details
|
94
|
+
end
|
95
|
+
|
96
|
+
AccessDenied = Class.new(APIError)
|
97
|
+
ResourceNotFound = Class.new(APIError)
|
98
|
+
MethodNotAllowed = Class.new(APIError)
|
99
|
+
InvalidRequest = Class.new(APIError)
|
100
|
+
UnauthorizedRequest = Class.new(APIError)
|
101
|
+
ResourceRemoved = Class.new(APIError)
|
102
|
+
TeapotError = Class.new(APIError)
|
103
|
+
RequestTimedOut = Class.new(APIError)
|
104
|
+
MessageRejected = Class.new(APIError)
|
105
|
+
SendingQuotaExceeded = Class.new(RateLimitError)
|
106
|
+
ServiceUnavailable = Class.new(APIError)
|
107
|
+
BadGateway = Class.new(APIError)
|
108
|
+
InternalError = Class.new(APIError)
|
109
|
+
EndpointNotYetImplemented = Class.new(APIError)
|
110
|
+
MailProviderError = Class.new(APIError)
|
111
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NylasV2
|
4
|
+
# Structure to represent a the Event Schema.
|
5
|
+
# @see https://docs.nylas.com/reference#events
|
6
|
+
class Event
|
7
|
+
include Model
|
8
|
+
self.resources_path = "/events"
|
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, read_only: true
|
19
|
+
attribute :object, :string, read_only: true
|
20
|
+
attribute :account_id, :string, read_only: true
|
21
|
+
attribute :calendar_id, :string
|
22
|
+
attribute :master_event_id, :string
|
23
|
+
attribute :message_id, :string
|
24
|
+
attribute :ical_uid, :string
|
25
|
+
attribute :event_collection_id, :string
|
26
|
+
|
27
|
+
attribute :capacity, :integer
|
28
|
+
attribute :busy, :boolean
|
29
|
+
attribute :description, :string
|
30
|
+
attribute :location, :string
|
31
|
+
attribute :owner, :string
|
32
|
+
attribute :recurrence, :recurrence
|
33
|
+
has_n_of_attribute :participants, :participant
|
34
|
+
attribute :read_only, :boolean
|
35
|
+
attribute :status, :string
|
36
|
+
attribute :title, :string
|
37
|
+
attribute :when, :when
|
38
|
+
attribute :metadata, :hash
|
39
|
+
attribute :conferencing, :event_conferencing
|
40
|
+
has_n_of_attribute :notifications, :event_notification
|
41
|
+
has_n_of_attribute :round_robin_order, :string
|
42
|
+
attribute :original_start_time, :unix_timestamp
|
43
|
+
attribute :reminder_minutes, :string
|
44
|
+
attribute :reminder_method, :string
|
45
|
+
attribute :job_status_id, :string, read_only: true
|
46
|
+
attribute :visibility, :string
|
47
|
+
|
48
|
+
attr_accessor :notify_participants
|
49
|
+
|
50
|
+
def busy?
|
51
|
+
busy
|
52
|
+
end
|
53
|
+
|
54
|
+
def read_only?
|
55
|
+
read_only
|
56
|
+
end
|
57
|
+
|
58
|
+
def save
|
59
|
+
validate
|
60
|
+
format_reminder_minutes
|
61
|
+
|
62
|
+
super
|
63
|
+
end
|
64
|
+
|
65
|
+
def rsvp(status, notify_participants:)
|
66
|
+
rsvp = Rsvp.new(api: api, status: status, notify_participants: notify_participants,
|
67
|
+
event_id: id, account_id: account_id)
|
68
|
+
rsvp.save
|
69
|
+
end
|
70
|
+
|
71
|
+
# Generate an ICS file server-side, from an Event
|
72
|
+
# @param ical_uid [String] Unique identifier used events across calendaring systems
|
73
|
+
# @param method [String] Description of invitation and response methods for attendees
|
74
|
+
# @param prodid [String] Company-specific unique product identifier
|
75
|
+
# @return [String] String for writing directly into an ICS file
|
76
|
+
def generate_ics(ical_uid: nil, method: nil, prodid: nil)
|
77
|
+
raise ArgumentError, "Cannot generate an ICS file for an event without a Calendar ID or when set" unless
|
78
|
+
calendar_id && self.when
|
79
|
+
|
80
|
+
payload = build_ics_event_payload(ical_uid, method, prodid)
|
81
|
+
response = api.execute(
|
82
|
+
method: :post,
|
83
|
+
path: "#{resources_path}/to-ics",
|
84
|
+
payload: JSON.dump(payload)
|
85
|
+
)
|
86
|
+
|
87
|
+
response[:ics]
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def validate
|
93
|
+
if conferencing
|
94
|
+
body = to_h
|
95
|
+
if body.dig(:conferencing, :details) && body.dig(:conferencing, :autocreate)
|
96
|
+
raise ArgumentError, "Cannot set both 'details' and 'autocreate' in conferencing object."
|
97
|
+
end
|
98
|
+
end
|
99
|
+
return unless capacity && capacity != -1 && participants && participants.length > capacity
|
100
|
+
|
101
|
+
raise ArgumentError, "The number of participants in the event exceeds the set capacity."
|
102
|
+
end
|
103
|
+
|
104
|
+
def build_ics_event_payload(ical_uid, method, prodid)
|
105
|
+
payload = {}
|
106
|
+
if id
|
107
|
+
payload[:event_id] = id
|
108
|
+
else
|
109
|
+
payload = to_h(enforce_read_only: true)
|
110
|
+
end
|
111
|
+
ics_options = build_ics_options_payload(ical_uid, method, prodid)
|
112
|
+
payload["ics_options"] = ics_options unless ics_options.empty?
|
113
|
+
payload
|
114
|
+
end
|
115
|
+
|
116
|
+
def build_ics_options_payload(ical_uid, method, prodid)
|
117
|
+
payload = {}
|
118
|
+
payload["ical_uid"] = ical_uid if ical_uid
|
119
|
+
payload["method"] = method if method
|
120
|
+
payload["prodid"] = prodid if prodid
|
121
|
+
payload
|
122
|
+
end
|
123
|
+
|
124
|
+
# Formats the reminder minute field to match the API format: "[%d]"
|
125
|
+
def format_reminder_minutes
|
126
|
+
return if reminder_minutes.nil? || reminder_minutes.empty? || reminder_minutes.match(/\[\d+\]/)
|
127
|
+
|
128
|
+
self.reminder_minutes = "[#{reminder_minutes}]"
|
129
|
+
end
|
130
|
+
|
131
|
+
def query_params
|
132
|
+
if notify_participants.nil?
|
133
|
+
{}
|
134
|
+
else
|
135
|
+
{
|
136
|
+
notify_participants: notify_participants
|
137
|
+
}
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NylasV2
|
4
|
+
# Syntactical sugar methods for some of the Event's filters
|
5
|
+
# @see https://docs.nylas.com/reference#get-events
|
6
|
+
class EventCollection < Collection
|
7
|
+
def expand_recurring
|
8
|
+
where(expand_recurring: true)
|
9
|
+
end
|
10
|
+
|
11
|
+
def show_cancelled
|
12
|
+
where(show_cancelled: true)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NylasV2
|
4
|
+
# Structure to represent the Event Conferencing object
|
5
|
+
# @see https://developer.nylas.com/docs/connectivity/calendar/conference-sync-beta
|
6
|
+
class EventConferencing
|
7
|
+
include Model::Attributable
|
8
|
+
attribute :provider, :string
|
9
|
+
attribute :details, :event_conferencing_details
|
10
|
+
attribute :autocreate, :event_conferencing_autocreate
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NylasV2
|
4
|
+
# Structure to represent the autocreate object within the Event Conferencing object
|
5
|
+
# @see https://developer.nylas.com/docs/connectivity/calendar/conference-sync-beta
|
6
|
+
class EventConferencingAutocreate
|
7
|
+
include Model::Attributable
|
8
|
+
attribute :settings, :hash, default: {}
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NylasV2
|
4
|
+
# Structure to represent the details object within the Event Conferencing object
|
5
|
+
# @see https://developer.nylas.com/docs/connectivity/calendar/conference-sync-beta
|
6
|
+
class EventConferencingDetails
|
7
|
+
include Model::Attributable
|
8
|
+
attribute :meeting_code, :string
|
9
|
+
attribute :password, :string
|
10
|
+
attribute :pin, :string
|
11
|
+
attribute :url, :string
|
12
|
+
has_n_of_attribute :phone, :string
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NylasV2
|
4
|
+
# Structure to represent the Event Notification object
|
5
|
+
# @see https://developer.nylas.com/docs/connectivity/calendar/event-notifications
|
6
|
+
class EventNotification
|
7
|
+
include Model::Attributable
|
8
|
+
|
9
|
+
attribute :type, :string
|
10
|
+
attribute :minutes_before_event, :integer
|
11
|
+
attribute :url, :string
|
12
|
+
attribute :payload, :string
|
13
|
+
attribute :subject, :string
|
14
|
+
attribute :body, :string
|
15
|
+
attribute :message, :string
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NylasV2
|
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
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NylasV2
|
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
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NylasV2
|
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
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NylasV2
|
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
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NylasV2
|
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
|