nylas 6.0.0.beta.3 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5153fbe30a05d237c4e17da6ff51005ded6667ae710a50e349535079bfd5db91
4
- data.tar.gz: 21e167b02e08cbf456ca45ffd94372fe6db8bf3fc7a1b5637ecf8bd5cde361bc
3
+ metadata.gz: a84dfeb084c667f7b3e8f41e03ae5ef51be7c04fefd1e36ac357fd701a5a7a82
4
+ data.tar.gz: 14bd5db7be83cac30aadc723089dac7502198de4b7ed7a23cb58b6dc6984c870
5
5
  SHA512:
6
- metadata.gz: 232c65750e5e6027cf4414519be4e91a497c48b394d779ac2500af8bf82f3bf5317ecb1ec94261f80eb0cd46b373e88727c2aed65b036950f9d239a4276d313c
7
- data.tar.gz: ccb50fddee574741f2baf36d4f44b46e246b219e0cb9d764d1ee2f1307cf8bf1a45aaec3a3bbe363f471b98ecc646fd60b79643ab730262308e9914a199b4719
6
+ metadata.gz: ef1dd4c3a6351f885a6f7f22af3848f2e0bfdc68ac62c2d933aa0a1336e08eca0975daf9b304543ac493ea87b32636bb4d8b9139f00ca865e44486dc5cdcbb11
7
+ data.tar.gz: bb3e97a16d619377c62b9c28fbaf3b4f9e93b3d2ee80d50ad9d6687cec0821c5a5a57f36b090838a500e82a0a2705649adb50fdad5a9be821a302fb0ab800c8e
data/lib/nylas/client.rb CHANGED
@@ -18,7 +18,7 @@ module Nylas
18
18
  #
19
19
  # @param api_key [String, nil] API key to use for the client session.
20
20
  # @param api_uri [String] Client session's host.
21
- # @param timeout [String, nil] Timeout value to use for the client session.
21
+ # @param timeout [Integer, nil] Timeout value to use for the client session.
22
22
  def initialize(api_key:,
23
23
  api_uri: Config::DEFAULT_REGION_URL,
24
24
  timeout: nil)
@@ -42,8 +42,8 @@ module Nylas
42
42
 
43
43
  parse_json_evaluate_error(result.code.to_i, response, path, content_type)
44
44
  end
45
- rescue Timeout::Error => _e
46
- raise Nylas::NylasSdkTimeoutError.new(request.path, timeout)
45
+ rescue RestClient::Exceptions::OpenTimeout, RestClient::Exceptions::ReadTimeout
46
+ raise Nylas::NylasSdkTimeoutError.new(request[:path], timeout)
47
47
  end
48
48
  end
49
49
 
@@ -92,8 +92,7 @@ module Nylas
92
92
  def build_request(
93
93
  method:, path: nil, headers: {}, query: {}, payload: nil, timeout: nil, api_key: nil
94
94
  )
95
- url = path
96
- url = add_query_params_to_url(url, query)
95
+ url = build_url(path, query)
97
96
  resulting_headers = default_headers.merge(headers).merge(auth_header(api_key))
98
97
  if !payload.nil? && !payload["multipart"]
99
98
  payload = payload&.to_json
@@ -206,33 +205,43 @@ module Nylas
206
205
  end
207
206
 
208
207
  # Adds query parameters to a URL.
209
- #
208
+ # @param url [String] The base URL.
209
+ # @param query [Hash] The query parameters to add to the URL.
210
210
  # @return [String] Processed URL, including query params.
211
- def add_query_params_to_url(url, query)
211
+ def build_url(url, query = nil)
212
212
  unless query.nil? || query.empty?
213
213
  uri = URI.parse(url)
214
- query = custom_params(query)
215
- params = URI.decode_www_form(uri.query || "") + query.to_a
216
- uri.query = URI.encode_www_form(params)
214
+ uri = build_query(uri, query)
217
215
  url = uri.to_s
218
216
  end
219
217
 
220
218
  url
221
219
  end
222
220
 
223
- # Defines custom parameters for a metadata_pair query.
224
- #
225
- # @return [String] Custom parameter in "<key>:<value>" format.
226
- def custom_params(query)
227
- # Convert hash to "<key>:<value>" form for metadata_pair query.
228
- if query.key?(:metadata_pair)
229
- pairs = query[:metadata_pair].map do |key, value|
230
- "#{key}:#{value}"
221
+ # Build the query string for a URI.
222
+ # @param uri [URI] URL to add the query to.
223
+ # @param query [Hash] The query params to include in the query.
224
+ # @return [URI] The URI object with the query parameters included.
225
+ def build_query(uri, query)
226
+ query.each do |key, value|
227
+ case value
228
+ when Array
229
+ value.each do |item|
230
+ qs = "#{URI.encode_www_form_component(key)}=#{URI.encode_www_form_component(item)}"
231
+ uri.query = [uri.query, qs].compact.join("&")
232
+ end
233
+ when Hash
234
+ value.each do |k, v|
235
+ qs = "#{URI.encode_www_form_component(key)}=#{URI.encode_www_form_component("#{k}:#{v}")}"
236
+ uri.query = [uri.query, qs].compact.join("&")
237
+ end
238
+ else
239
+ qs = "#{URI.encode_www_form_component(key)}=#{URI.encode_www_form_component(value)}"
240
+ uri.query = [uri.query, qs].compact.join("&")
231
241
  end
232
- query[:metadata_pair] = pairs
233
242
  end
234
243
 
235
- query
244
+ uri
236
245
  end
237
246
 
238
247
  # Set the authorization header for an API query.
@@ -17,10 +17,10 @@ module Nylas
17
17
  @redirect_uris = RedirectUris.new(sdk_instance)
18
18
  end
19
19
 
20
- # Gets the application object.
20
+ # Get application details.
21
21
  #
22
- # @return [Array(Hash, String)] Application object and API Request ID.
23
- def info
22
+ # @return [Array(Hash, String)] Application details and API Request ID.
23
+ def get_details
24
24
  get(path: "#{api_uri}/v3/applications")
25
25
  end
26
26
  end
@@ -59,7 +59,7 @@ module Nylas
59
59
  # IMPORTANT: You must store the 'secret' returned to use it inside the CodeExchange flow.
60
60
  #
61
61
  # @param config [Hash] Configuration for building the URL.
62
- # @return [OpenStruct] URL for hosted authentication with the secret and the hashed secret.
62
+ # @return [Hash] URL for hosted authentication with the secret and the hashed secret.
63
63
  def url_for_oauth2_pkce(config)
64
64
  url = url_auth_builder(config)
65
65
 
@@ -71,7 +71,7 @@ module Nylas
71
71
  url.query = build_query_with_pkce(config, secret_hash)
72
72
 
73
73
  # Returns the URL with secret and hashed secret.
74
- OpenStruct.new(secret: secret, secret_hash: secret_hash, url: url.to_s)
74
+ { secret: secret, secret_hash: secret_hash, url: url.to_s }
75
75
  end
76
76
 
77
77
  # Builds the URL for admin consent authentication for Microsoft.
@@ -81,9 +81,7 @@ module Nylas
81
81
  def url_for_admin_consent(config)
82
82
  config_with_provider = config.merge("provider" => "microsoft")
83
83
  url = url_auth_builder(config_with_provider)
84
-
85
- query_params = build_query_with_admin_consent(config)
86
- url.query = URI.encode_www_form(query_params)
84
+ url.query = build_query_with_admin_consent(config)
87
85
 
88
86
  url.to_s
89
87
  end
@@ -102,47 +100,58 @@ module Nylas
102
100
  true
103
101
  end
104
102
 
103
+ # Detects the provider of an email address.
104
+ # @param params [Hash] Parameters to detect the provider.
105
+ # @return [Array(Hash, String)] Detected provider, if found and API Request ID.
106
+ def detect_provider(params)
107
+ post(
108
+ path: "#{api_uri}/v3/providers/detect",
109
+ query_params: params
110
+ )
111
+ end
112
+
105
113
  private
106
114
 
107
115
  # Builds the query with admin consent authentication for Microsoft.
108
116
  #
109
117
  # @param config [Hash] Configuration for the query.
110
- # @return [Array(Hash, String)] Updated list of parameters, including those specific to admin
118
+ # @return [String] Updated list of parameters, including those specific to admin
111
119
  # consent.
112
120
  def build_query_with_admin_consent(config)
113
121
  params = build_query(config)
114
122
 
115
123
  # Appends new params specific for admin consent.
116
- params["response_type"] = "adminconsent"
117
- params["credential_id"] = config["credentialId"]
124
+ params[:provider] = "microsoft"
125
+ params[:response_type] = "adminconsent"
126
+ params[:credential_id] = config[:credential_id] if config[:credential_id]
118
127
 
119
- params
128
+ URI.encode_www_form(params).gsub("+", "%20")
120
129
  end
121
130
 
122
131
  # Builds the query with PKCE.
123
132
  #
124
133
  # @param config [Hash] Configuration for the query.
125
134
  # @param secret_hash [Hash] Hashed secret.
126
- # @return [Array(Hash, String)] Updated list of encoded parameters, including those specific
135
+ # @return [String] Updated list of encoded parameters, including those specific
127
136
  # to PKCE.
128
137
  def build_query_with_pkce(config, secret_hash)
129
138
  params = build_query(config)
130
139
 
131
140
  # Appends new PKCE specific params.
132
- params["code_challenge_method"] = "s256"
133
- params["code_challenge"] = secret_hash
141
+ params[:code_challenge_method] = "s256"
142
+ params[:code_challenge] = secret_hash
134
143
 
135
- URI.encode_www_form(params)
144
+ URI.encode_www_form(params).gsub("+", "%20")
136
145
  end
137
146
 
138
147
  # Builds the authentication URL.
139
148
  #
140
149
  # @param config [Hash] Configuration for the query.
141
- # @return [Array(Hash, String)] List of components for the authentication URL.
150
+ # @return [URI] List of components for the authentication URL.
142
151
  def url_auth_builder(config)
143
152
  builder = URI.parse(api_uri)
144
153
  builder.path = "/v3/connect/auth"
145
- builder.query = build_query(config)
154
+ builder.query = URI.encode_www_form(build_query(config)).gsub!("+", "%20")
146
155
 
147
156
  builder
148
157
  end
@@ -150,40 +159,42 @@ module Nylas
150
159
  # Builds the query.
151
160
  #
152
161
  # @param config [Hash] Configuration for the query.
153
- # @return [Array(Hash, String)] List of encoded parameters for the query.
162
+ # @return [Hash] List of parameters to encode in the query.
154
163
  def build_query(config)
155
164
  params = {
156
- "client_id" => config[:client_id],
157
- "redirect_uri" => config[:redirect_uri],
158
- "access_type" => config[:access_type] || "online",
159
- "response_type" => "code"
165
+ client_id: config[:client_id],
166
+ redirect_uri: config[:redirect_uri],
167
+ access_type: config[:access_type] || "online",
168
+ response_type: "code"
160
169
  }
161
- params["provider"] = config[:provider] if config[:provider]
162
- params["prompt"] = config[:prompt] if config[:prompt]
163
- params["metadata"] = config[:metadata] if config[:metadata]
164
- params["state"] = config[:state] if config[:state]
165
- params["scope"] = config[:scope].join(" ") if config[:scope]
170
+ params[:provider] = config[:provider] if config[:provider]
171
+ params[:prompt] = config[:prompt] if config[:prompt]
172
+ params[:metadata] = config[:metadata] if config[:metadata]
173
+ params[:state] = config[:state] if config[:state]
174
+ params[:scope] = config[:scope].join(" ") if config[:scope]
166
175
  if config[:login_hint]
167
- params["login_hint"] = config[:login_hint]
168
- params["include_grant_scopes"] = config[:include_grant_scopes].to_s if config[:include_grant_scopes]
176
+ params[:login_hint] = config[:login_hint]
177
+ params[:include_grant_scopes] = config[:include_grant_scopes].to_s if config[:include_grant_scopes]
169
178
  end
170
179
 
171
- URI.encode_www_form(params)
180
+ params
172
181
  end
173
182
 
174
- # Hashes the secret for PKCE authentication.
183
+ # Hash a plain text secret for use in PKCE.
175
184
  #
176
- # @param secret [String] Randomly-generated authentication secret.
177
- # @return [Hash] Hashed authentication secret.
185
+ # @param secret [String] The plain text secret to hash.
186
+ # @return [String] The hashed secret with base64 encoding (without padding).
178
187
  def hash_pkce_secret(secret)
179
- Digest::SHA256.digest(secret).unpack1("H*")
180
- Base64.strict_encode64(Digest::SHA256.digest(secret))
188
+ sha256_hash = Digest::SHA256.hexdigest(secret)
189
+ Base64.urlsafe_encode64(sha256_hash, padding: false)
181
190
  end
182
191
 
183
192
  # Sends the token request to the Nylas API.
184
193
  #
185
194
  # @param request [Hash] Code exchange request.
186
195
  def execute_token_request(request)
196
+ request[:client_secret] = api_key if request[:client_secret].nil?
197
+
187
198
  execute(
188
199
  method: :post,
189
200
  path: "#{api_uri}/v3/connect/token",
@@ -8,7 +8,7 @@ module Nylas
8
8
  class Connectors < Resource
9
9
  include ApiOperations::Get
10
10
  include ApiOperations::Post
11
- include ApiOperations::Put
11
+ include ApiOperations::Patch
12
12
  include ApiOperations::Delete
13
13
 
14
14
  # Access the Credentials API
@@ -59,7 +59,7 @@ module Nylas
59
59
  # @param request_body [Hash] The values to update the connector with
60
60
  # @return [Array(Hash, String)] The updated connector and API Request ID.
61
61
  def update(provider:, request_body:)
62
- put(
62
+ patch(
63
63
  path: "#{api_uri}/v3/connectors/#{provider}",
64
64
  request_body: request_body
65
65
  )
@@ -79,7 +79,7 @@ module Nylas
79
79
  # @param identifier [String] Grant ID or email account to query.
80
80
  # @param query_params [Hash, nil] Query params to pass to the request.
81
81
  # @return [Array(Array(Hash), String)] The list of contact groups and API Request ID.
82
- def contact_groups(identifier:, query_params: nil)
82
+ def list_groups(identifier:, query_params: nil)
83
83
  get(
84
84
  path: "#{api_uri}/v3/grants/#{identifier}/contacts/groups",
85
85
  query_params: query_params
@@ -8,7 +8,7 @@ module Nylas
8
8
  class Credentials < Resource
9
9
  include ApiOperations::Get
10
10
  include ApiOperations::Post
11
- include ApiOperations::Put
11
+ include ApiOperations::Patch
12
12
  include ApiOperations::Delete
13
13
 
14
14
  # Return all credentials.
@@ -53,7 +53,7 @@ module Nylas
53
53
  # @param request_body [Hash] The values to update the connector with
54
54
  # @return [Array(Hash, String)] The updated connector and API Request ID.
55
55
  def update(provider:, credential_id:, request_body:)
56
- put(
56
+ patch(
57
57
  path: "#{api_uri}/v3/connectors/#{provider}/creds/#{credential_id}",
58
58
  request_body: request_body
59
59
  )
@@ -86,7 +86,7 @@ module Nylas
86
86
  # @param event_id [String] The id of the event to respond to.
87
87
  # @param request_body [Hash] The status values to send the RSVP with.
88
88
  # @param query_params [Hash] The query parameters to include in the request
89
- # @return [Hash] Response object with the API Request ID.
89
+ # @return [(Hash, String)] Response object with the API Request ID.
90
90
  def send_rsvp(identifier:, event_id:, request_body:, query_params:)
91
91
  post(
92
92
  path: "#{api_uri}/v3/grants/#{identifier}/events/#{event_id}/send-rsvp",
@@ -16,7 +16,7 @@ module Nylas
16
16
  # @return [Array(Array(Hash), String)] The list of grants and API Request ID.
17
17
  def list(query_params: nil)
18
18
  get(
19
- path: "#{api_uri}/v3/grant",
19
+ path: "#{api_uri}/v3/grants",
20
20
  query_params: query_params
21
21
  )
22
22
  end
@@ -27,7 +27,7 @@ module Nylas
27
27
  # @return [Array(Hash, String)] The grant and API request ID.
28
28
  def find(grant_id:)
29
29
  get(
30
- path: "#{api_uri}/v3/grant/#{grant_id}"
30
+ path: "#{api_uri}/v3/grants/#{grant_id}"
31
31
  )
32
32
  end
33
33
 
@@ -38,7 +38,7 @@ module Nylas
38
38
  # @return [Array(Hash, String)] The updated grant and API Request ID.
39
39
  def update(grant_id:, request_body:)
40
40
  put(
41
- path: "#{api_uri}/v3/grant/#{grant_id}",
41
+ path: "#{api_uri}/v3/grants/#{grant_id}",
42
42
  request_body: request_body
43
43
  )
44
44
  end
@@ -49,7 +49,7 @@ module Nylas
49
49
  # @return [Array(TrueClass, String)] True and the API Request ID for the delete operation.
50
50
  def destroy(grant_id:)
51
51
  _, request_id = delete(
52
- path: "#{api_uri}/v3/grant/#{grant_id}"
52
+ path: "#{api_uri}/v3/grants/#{grant_id}"
53
53
  )
54
54
 
55
55
  [true, request_id]
@@ -94,21 +94,21 @@ module Nylas
94
94
  # Retrieve your scheduled messages.
95
95
  #
96
96
  # @param identifier [String] Grant ID or email account from which to find the scheduled message from.
97
- # @param schedule_id [String] The id of the scheduled message to stop.
98
97
  # @return [Array(Hash, String)] The list of scheduled messages and the API Request ID.
99
- def list_scheduled_messages(identifier:, schedule_id:)
98
+ def list_scheduled_messages(identifier:)
100
99
  get(
101
- path: "#{api_uri}/v3/grants/#{identifier}/messages/schedules/#{schedule_id}"
100
+ path: "#{api_uri}/v3/grants/#{identifier}/messages/schedules"
102
101
  )
103
102
  end
104
103
 
105
104
  # Retrieve your scheduled messages.
106
105
  #
107
106
  # @param identifier [String] Grant ID or email account from which to list the scheduled messages from.
107
+ # @param schedule_id [String] The id of the scheduled message to stop.
108
108
  # @return [Array(Hash, String)] The scheduled message and the API Request ID.
109
- def find_scheduled_messages(identifier:)
109
+ def find_scheduled_messages(identifier:, schedule_id:)
110
110
  get(
111
- path: "#{api_uri}/v3/grants/#{identifier}/messages/schedules"
111
+ path: "#{api_uri}/v3/grants/#{identifier}/messages/schedules/#{schedule_id}"
112
112
  )
113
113
  end
114
114
 
@@ -84,5 +84,38 @@ module Nylas
84
84
 
85
85
  [true, request_id]
86
86
  end
87
+
88
+ # Update the webhook secret value for a destination.
89
+ # @param webhook_id [String] The ID of the webhook destination to update.
90
+ # @return [Array(Hash, String)] The updated webhook destination and API Request ID.
91
+ def rotate_secret(webhook_id:)
92
+ put(
93
+ path: "#{api_uri}/v3/webhooks/#{webhook_id}/rotate-secret",
94
+ request_body: {}
95
+ )
96
+ end
97
+
98
+ # Get the current list of IP addresses that Nylas sends webhooks from
99
+ # @return [Array(Hash, String)] List of IP addresses that Nylas sends webhooks from and API Request ID.
100
+ def ip_addresses
101
+ get(
102
+ path: "#{api_uri}/v3/webhooks/ip-addresses"
103
+ )
104
+ end
105
+
106
+ # Extract the challenge parameter from a URL
107
+ # @param url [String] The URL sent by Nylas containing the challenge parameter
108
+ # @return [String] The challenge parameter
109
+ def self.extract_challenge_parameter(url)
110
+ url_object = URI.parse(url)
111
+ query = CGI.parse(url_object.query || "")
112
+
113
+ challenge_parameter = query["challenge"]
114
+ if challenge_parameter.nil? || challenge_parameter.empty? || challenge_parameter.first.nil?
115
+ raise "Invalid URL or no challenge parameter found."
116
+ end
117
+
118
+ challenge_parameter.first
119
+ end
87
120
  end
88
121
  end
@@ -38,8 +38,12 @@ module Nylas
38
38
  # @return [Hash] The request that will attach the file to the message/draft
39
39
  def self.attach_file_request_builder(file_path)
40
40
  filename = File.basename(file_path)
41
- content_type = MIME::Types.type_for(file_path).first.to_s
42
- content_type = "application/octet-stream" if content_type.empty?
41
+ content_type = MIME::Types.type_for(file_path)
42
+ content_type = if !content_type.nil? && !content_type.empty?
43
+ content_type.first.to_s
44
+ else
45
+ "application/octet-stream"
46
+ end
43
47
  size = File.size(file_path)
44
48
  content = File.new(file_path, "rb")
45
49
 
data/lib/nylas/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Nylas
4
- VERSION = "6.0.0.beta.3"
4
+ VERSION = "6.0.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nylas
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.0.beta.3
4
+ version: 6.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nylas, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-04 00:00:00.000000000 Z
11
+ date: 2024-02-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mime-types
@@ -180,14 +180,14 @@ dependencies:
180
180
  requirements:
181
181
  - - "~>"
182
182
  - !ruby/object:Gem::Version
183
- version: 0.21.2
183
+ version: 0.22.0
184
184
  type: :development
185
185
  prerelease: false
186
186
  version_requirements: !ruby/object:Gem::Requirement
187
187
  requirements:
188
188
  - - "~>"
189
189
  - !ruby/object:Gem::Version
190
- version: 0.21.2
190
+ version: 0.22.0
191
191
  - !ruby/object:Gem::Dependency
192
192
  name: simplecov-cobertura
193
193
  requirement: !ruby/object:Gem::Requirement
@@ -274,9 +274,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
274
274
  version: '3.0'
275
275
  required_rubygems_version: !ruby/object:Gem::Requirement
276
276
  requirements:
277
- - - ">"
277
+ - - ">="
278
278
  - !ruby/object:Gem::Version
279
- version: 1.3.1
279
+ version: '0'
280
280
  requirements: []
281
281
  rubygems_version: 3.4.10
282
282
  signing_key: