parse-stack 1.5.3 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/parse-ruby-sdk.png +0 -0
- data/Changes.md +25 -1
- data/Gemfile.lock +4 -4
- data/README.md +37 -31
- data/bin/console +3 -0
- data/lib/parse/api/all.rb +2 -1
- data/lib/parse/api/apps.rb +12 -0
- data/lib/parse/api/config.rb +5 -1
- data/lib/parse/api/files.rb +1 -0
- data/lib/parse/api/hooks.rb +1 -0
- data/lib/parse/api/objects.rb +4 -1
- data/lib/parse/api/push.rb +1 -0
- data/lib/parse/api/{schemas.rb → schema.rb} +7 -0
- data/lib/parse/api/server.rb +44 -0
- data/lib/parse/api/sessions.rb +1 -0
- data/lib/parse/api/users.rb +4 -1
- data/lib/parse/client.rb +109 -73
- data/lib/parse/client/authentication.rb +2 -1
- data/lib/parse/client/batch.rb +9 -1
- data/lib/parse/client/body_builder.rb +16 -1
- data/lib/parse/client/caching.rb +15 -13
- data/lib/parse/client/protocol.rb +27 -15
- data/lib/parse/client/response.rb +26 -8
- data/lib/parse/model/acl.rb +1 -1
- data/lib/parse/model/associations/belongs_to.rb +18 -19
- data/lib/parse/model/associations/collection_proxy.rb +6 -0
- data/lib/parse/model/associations/has_many.rb +5 -6
- data/lib/parse/model/bytes.rb +4 -1
- data/lib/parse/model/classes/user.rb +46 -44
- data/lib/parse/model/core/actions.rb +508 -460
- data/lib/parse/model/core/builder.rb +75 -0
- data/lib/parse/model/core/errors.rb +9 -0
- data/lib/parse/model/core/fetching.rb +42 -38
- data/lib/parse/model/core/properties.rb +46 -27
- data/lib/parse/model/core/querying.rb +231 -228
- data/lib/parse/model/core/schema.rb +76 -74
- data/lib/parse/model/date.rb +10 -2
- data/lib/parse/model/file.rb +16 -2
- data/lib/parse/model/geopoint.rb +9 -2
- data/lib/parse/model/model.rb +38 -7
- data/lib/parse/model/object.rb +60 -19
- data/lib/parse/model/pointer.rb +22 -1
- data/lib/parse/model/push.rb +6 -2
- data/lib/parse/query.rb +57 -11
- data/lib/parse/query/constraint.rb +5 -2
- data/lib/parse/query/constraints.rb +588 -589
- data/lib/parse/query/ordering.rb +2 -2
- data/lib/parse/stack.rb +1 -0
- data/lib/parse/stack/version.rb +1 -1
- data/lib/parse/webhooks.rb +30 -29
- data/lib/parse/webhooks/payload.rb +181 -168
- data/lib/parse/webhooks/registration.rb +1 -1
- data/parse-stack.gemspec +9 -9
- metadata +9 -12
data/lib/parse/api/sessions.rb
CHANGED
data/lib/parse/api/users.rb
CHANGED
@@ -8,10 +8,13 @@ module Parse
|
|
8
8
|
module API
|
9
9
|
# Defines the User class interface for the Parse REST API
|
10
10
|
module Users
|
11
|
-
|
11
|
+
# @!visibility private
|
12
12
|
USER_PATH_PREFIX = "users"
|
13
|
+
# @!visibility private
|
13
14
|
LOGOUT_PATH = "logout"
|
15
|
+
# @!visibility private
|
14
16
|
LOGIN_PATH = "login"
|
17
|
+
# @!visibility private
|
15
18
|
REQUEST_PASSWORD_RESET = "requestPasswordReset"
|
16
19
|
|
17
20
|
# Fetch a {Parse::User} for a given objectId.
|
data/lib/parse/client.rb
CHANGED
@@ -18,15 +18,24 @@ require_relative "client/caching"
|
|
18
18
|
require_relative "api/all"
|
19
19
|
|
20
20
|
module Parse
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
21
|
+
class Error < StandardError
|
22
|
+
# An error when a general connection occurs.
|
23
|
+
class ConnectionError < Error; end;
|
24
|
+
# An error when a connection timeout occurs.
|
25
|
+
class TimeoutError < Error; end;
|
26
|
+
# An error when there is an Parse REST API protocol error.
|
27
|
+
class ProtocolError < Error; end;
|
28
|
+
# An error when the Parse server returned invalid code.
|
29
|
+
class ServerError < Error; end;
|
30
|
+
# An error when a Parse server responds with HTTP 500.
|
31
|
+
class ServiceUnavailableError < Error; end;
|
32
|
+
# An error when the authentication credentials in the request are invalid.
|
33
|
+
class AuthenticationError < Error; end;
|
34
|
+
# An error when the burst limit has been exceeded.
|
35
|
+
class RequestLimitExceededError < Error; end;
|
36
|
+
# An error when the session token provided in the request is invalid.
|
37
|
+
class InvalidSessionTokenError < Error; end;
|
38
|
+
end
|
30
39
|
|
31
40
|
# Retrieve the App specific Parse configuration parameters. The configuration
|
32
41
|
# for a connection is cached after the first request. Use the bang version to
|
@@ -86,19 +95,30 @@ module Parse
|
|
86
95
|
# Faraday, which means it is open to add any additional middleware for
|
87
96
|
# features you'd like to implement.
|
88
97
|
class Client
|
89
|
-
include Parse::API::
|
98
|
+
include Parse::API::Analytics
|
99
|
+
include Parse::API::Apps
|
100
|
+
include Parse::API::Batch
|
101
|
+
include Parse::API::CloudFunctions
|
90
102
|
include Parse::API::Config
|
91
103
|
include Parse::API::Files
|
92
|
-
include Parse::API::CloudFunctions
|
93
|
-
include Parse::API::Users
|
94
|
-
include Parse::API::Sessions
|
95
104
|
include Parse::API::Hooks
|
96
|
-
include Parse::API::
|
97
|
-
include Parse::API::Batch
|
105
|
+
include Parse::API::Objects
|
98
106
|
include Parse::API::Push
|
99
107
|
include Parse::API::Schema
|
100
|
-
|
101
|
-
|
108
|
+
include Parse::API::Server
|
109
|
+
include Parse::API::Sessions
|
110
|
+
include Parse::API::Users
|
111
|
+
# The user agent header key.
|
112
|
+
USER_AGENT_HEADER = "User-Agent".freeze
|
113
|
+
# The value for the User-Agent header.
|
114
|
+
USER_AGENT_VERSION = "Parse-Stack v#{Parse::Stack::VERSION}".freeze
|
115
|
+
# The default retry count
|
116
|
+
DEFAULT_RETRIES = 2
|
117
|
+
# The wait time in seconds between retries
|
118
|
+
RETRY_DELAY = 1.5
|
119
|
+
|
120
|
+
# An error when a general response error occurs when communicating with Parse server.
|
121
|
+
class ResponseError < Parse::Error; end;
|
102
122
|
|
103
123
|
# @!attribute cache
|
104
124
|
# The underlying cache store for caching API requests.
|
@@ -117,7 +137,11 @@ module Parse
|
|
117
137
|
# The Parse server url that will be receiving these API requests. By default
|
118
138
|
# this will be {Parse::Protocol::SERVER_URL}.
|
119
139
|
# @return [String]
|
120
|
-
|
140
|
+
# @!attribute retry_limit
|
141
|
+
# The default retry count for the client when a specific request timesout or
|
142
|
+
# the service is unavailable. Defaults to {DEFAULT_RETRIES}.
|
143
|
+
# @return [String]
|
144
|
+
attr_accessor :cache, :retry_limit
|
121
145
|
attr_reader :application_id, :api_key, :master_key, :server_url
|
122
146
|
alias_method :app_id, :application_id
|
123
147
|
# The client can support multiple sessions. The first session created, will be placed
|
@@ -169,16 +193,13 @@ module Parse
|
|
169
193
|
# @param opts [Hash] a set of connection options to configure the client.
|
170
194
|
# @option opts [String] :server_url The server url of your Parse Server if you
|
171
195
|
# are not using the hosted Parse service. By default it will use
|
172
|
-
# PARSE_SERVER_URL
|
173
|
-
#
|
174
|
-
#
|
175
|
-
#
|
176
|
-
# @option opts [String] :api_key The Parse REST API Key. By default it will
|
177
|
-
# use PARSE_API_KEY environment variable if not specified.
|
196
|
+
# ENV["PARSE_SERVER_URL"] if available, otherwise fallback to {Parse::Protocol::SERVER_URL}.
|
197
|
+
# @option opts [String] :app_id The Parse application id. Defaults to
|
198
|
+
# ENV['PARSE_APP_ID'] or ENV['PARSE_APPLICATION_ID'].
|
199
|
+
# @option opts [String] :api_key The Parse REST API Key. Defaults to ENV['PARSE_REST_API_KEY'].
|
178
200
|
# @option opts [String] :master_key The Parse application master key (optional).
|
179
201
|
# If this key is set, it will be sent on every request sent by the client
|
180
|
-
# and your models.
|
181
|
-
# variable if not specified.
|
202
|
+
# and your models. Defaults to ENV['PARSE_MASTER_KEY'].
|
182
203
|
# @option opts [Boolean] :logging It provides you additional logging information
|
183
204
|
# of requests and responses. If set to the special symbol of *:debug*, it
|
184
205
|
# will provide additional payload data in the log messages. This option affects
|
@@ -201,6 +222,7 @@ module Parse
|
|
201
222
|
# cache using the clear_cache! method on your Parse::Client instance.
|
202
223
|
# @option opts [Hash] :faraday You may pass a hash of options that will be
|
203
224
|
# passed to the Faraday constructor.
|
225
|
+
# @raise Parse::Error::ConnectionError if the client was not properly configured with required keys or url.
|
204
226
|
# @raise ArgumentError if the cache instance passed to the :cache option is not of Moneta::Transformer.
|
205
227
|
# @see Parse::Middleware::BodyBuilder
|
206
228
|
# @see Parse::Middleware::Caching
|
@@ -208,13 +230,13 @@ module Parse
|
|
208
230
|
# @see Parse::Protocol
|
209
231
|
def initialize(opts = {})
|
210
232
|
@server_url = opts[:server_url] || ENV["PARSE_SERVER_URL"] || Parse::Protocol::SERVER_URL
|
211
|
-
@application_id = opts[:application_id] || opts[:app_id] || ENV["PARSE_APP_ID"] || ENV['
|
212
|
-
@api_key = opts[:api_key] || opts[:rest_api_key] || ENV["
|
213
|
-
@master_key = opts[:master_key] || ENV["PARSE_MASTER_KEY"]
|
233
|
+
@application_id = opts[:application_id] || opts[:app_id] || ENV["PARSE_APP_ID"] || ENV['PARSE_APPLICATION_ID']
|
234
|
+
@api_key = opts[:api_key] || opts[:rest_api_key] || ENV["PARSE_REST_API_KEY"] || ENV["PARSE_API_KEY"]
|
235
|
+
@master_key = opts[:master_key] || ENV["PARSE_MASTER_KEY"]
|
214
236
|
opts[:adapter] ||= Faraday.default_adapter
|
215
237
|
opts[:expires] ||= 3
|
216
|
-
if @application_id.nil? || ( @api_key.nil? && @master_key.nil? )
|
217
|
-
raise "Please call Parse.setup(application_id:, api_key:) to setup a client"
|
238
|
+
if @server_url.nil? || @application_id.nil? || ( @api_key.nil? && @master_key.nil? )
|
239
|
+
raise Parse::Error::ConnectionError, "Please call Parse.setup(server_url:, application_id:, api_key:) to setup a client"
|
218
240
|
end
|
219
241
|
@server_url += '/' unless @server_url.ends_with?('/')
|
220
242
|
#Configure Faraday
|
@@ -260,6 +282,14 @@ module Parse
|
|
260
282
|
Parse::Client.clients[:default] ||= self
|
261
283
|
end
|
262
284
|
|
285
|
+
# If set, returns the current retry count for this instance. Otherwise,
|
286
|
+
# returns {DEFAULT_RETRIES}. Set to 0 to disable retry mechanism.
|
287
|
+
# @return [Integer] the current retry count for this client.
|
288
|
+
def retry_limit
|
289
|
+
return DEFAULT_RETRIES if @retry_limit.nil?
|
290
|
+
@retry_limit
|
291
|
+
end
|
292
|
+
|
263
293
|
# @return [String] the url prefix of the Parse Server url.
|
264
294
|
def url_prefix
|
265
295
|
@conn.url_prefix
|
@@ -295,21 +325,21 @@ module Parse
|
|
295
325
|
# - *:retry* [Integer] The number of retrties to perform if the service is unavailable.
|
296
326
|
# Set to false to disable the retry mechanism. When performing request retries, the
|
297
327
|
# client will sleep for a number of seconds ({Parse::Client::RETRY_DELAY}) between requests.
|
298
|
-
# The default value is {Parse::Client::
|
299
|
-
# @raise Parse::AuthenticationError when HTTP response status is 401 or 403
|
300
|
-
# @raise Parse::TimeoutError when HTTP response status is 400 or
|
328
|
+
# The default value is {Parse::Client::DEFAULT_RETRIES}.
|
329
|
+
# @raise Parse::Error::AuthenticationError when HTTP response status is 401 or 403
|
330
|
+
# @raise Parse::Error::TimeoutError when HTTP response status is 400 or
|
301
331
|
# 408, and the Parse code is 143 or {Parse::Response::ERROR_TIMEOUT}.
|
302
|
-
# @raise Parse::ConnectionError when HTTP response status is 404 is not an object not found error.
|
332
|
+
# @raise Parse::Error::ConnectionError when HTTP response status is 404 is not an object not found error.
|
303
333
|
# - This will also be raised if after retrying a request a number of times has finally failed.
|
304
|
-
# @raise Parse::ProtocolError when HTTP response status is 405 or 406
|
305
|
-
# @raise Parse::ServiceUnavailableError when HTTP response status is 500 or 503.
|
334
|
+
# @raise Parse::Error::ProtocolError when HTTP response status is 405 or 406
|
335
|
+
# @raise Parse::Error::ServiceUnavailableError when HTTP response status is 500 or 503.
|
306
336
|
# - This may also happen when the Parse Server response code is any
|
307
337
|
# number less than {Parse::Response::ERROR_SERVICE_UNAVAILABLE}.
|
308
|
-
# @raise Parse::ServerError when the Parse response code is less than 100
|
309
|
-
# @raise Parse::RequestLimitExceededError when the Parse response code is {Parse::Response::ERROR_EXCEEDED_BURST_LIMIT}.
|
338
|
+
# @raise Parse::Error::ServerError when the Parse response code is less than 100
|
339
|
+
# @raise Parse::Error::RequestLimitExceededError when the Parse response code is {Parse::Response::ERROR_EXCEEDED_BURST_LIMIT}.
|
310
340
|
# - This usually means you have exceeded the burst limit on requests, which will mean you will be throttled for the
|
311
341
|
# next 60 seconds.
|
312
|
-
# @raise Parse::InvalidSessionTokenError when the Parse response code is 209.
|
342
|
+
# @raise Parse::Error::InvalidSessionTokenError when the Parse response code is 209.
|
313
343
|
# - This means the session token that was sent in the request seems to be invalid.
|
314
344
|
# @return [Parse::Response] the response for this request.
|
315
345
|
# @see Parse::Middleware::BodyBuilder
|
@@ -318,12 +348,12 @@ module Parse
|
|
318
348
|
# @see Parse::Protocol
|
319
349
|
# @see Parse::Request
|
320
350
|
def request(method, uri = nil, body: nil, query: nil, headers: nil, opts: {})
|
321
|
-
|
351
|
+
_retry_count ||= self.retry_limit
|
322
352
|
|
323
353
|
if opts[:retry] == false
|
324
|
-
|
354
|
+
_retry_count = 0
|
325
355
|
elsif opts[:retry].to_i > 0
|
326
|
-
|
356
|
+
_retry_count = opts[:retry]
|
327
357
|
end
|
328
358
|
|
329
359
|
headers ||= {}
|
@@ -343,7 +373,7 @@ module Parse
|
|
343
373
|
# http method
|
344
374
|
method = method.downcase.to_sym
|
345
375
|
# set the User-Agent
|
346
|
-
headers[
|
376
|
+
headers[USER_AGENT_HEADER] = USER_AGENT_VERSION
|
347
377
|
|
348
378
|
if opts[:cache] == false
|
349
379
|
headers[Parse::Middleware::Caching::CACHE_CONTROL] = "no-cache"
|
@@ -373,59 +403,63 @@ module Parse
|
|
373
403
|
|
374
404
|
case response.http_status
|
375
405
|
when 401, 403
|
376
|
-
|
377
|
-
raise Parse::AuthenticationError, response
|
406
|
+
warn "[Parse:AuthenticationError] #{response}"
|
407
|
+
raise Parse::Error::AuthenticationError, response
|
378
408
|
when 400, 408
|
379
409
|
if response.code == Parse::Response::ERROR_TIMEOUT || response.code == 143 #"net/http: timeout awaiting response headers"
|
380
|
-
|
381
|
-
raise Parse::TimeoutError, response
|
410
|
+
warn "[Parse:TimeoutError] #{response}"
|
411
|
+
raise Parse::Error::TimeoutError, response
|
382
412
|
end
|
383
413
|
when 404
|
384
414
|
unless response.object_not_found?
|
385
|
-
|
386
|
-
raise Parse::ConnectionError, response
|
415
|
+
warn "[Parse:ConnectionError] #{response}"
|
416
|
+
raise Parse::Error::ConnectionError, response
|
387
417
|
end
|
388
418
|
when 405, 406
|
389
|
-
|
390
|
-
raise Parse::ProtocolError, response
|
419
|
+
warn "[Parse:ProtocolError] #{response}"
|
420
|
+
raise Parse::Error::ProtocolError, response
|
391
421
|
when 500, 503
|
392
|
-
|
393
|
-
raise Parse::ServiceUnavailableError, response
|
422
|
+
warn "[Parse:ServiceUnavailableError] #{response}"
|
423
|
+
raise Parse::Error::ServiceUnavailableError, response
|
394
424
|
end
|
395
425
|
|
396
426
|
if response.error?
|
397
427
|
if response.code <= Parse::Response::ERROR_SERVICE_UNAVAILABLE
|
398
|
-
|
399
|
-
raise Parse::ServiceUnavailableError, response
|
428
|
+
warn "[Parse:ServiceUnavailableError] #{response}"
|
429
|
+
raise Parse::Error::ServiceUnavailableError, response
|
400
430
|
elsif response.code <= 100
|
401
|
-
|
402
|
-
raise Parse::ServerError, response
|
431
|
+
warn "[Parse:ServerError] #{response}"
|
432
|
+
raise Parse::Error::ServerError, response
|
403
433
|
elsif response.code == Parse::Response::ERROR_EXCEEDED_BURST_LIMIT
|
404
|
-
|
405
|
-
raise Parse::RequestLimitExceededError, response
|
434
|
+
warn "[Parse:RequestLimitExceededError] #{response}"
|
435
|
+
raise Parse::Error::RequestLimitExceededError, response
|
406
436
|
elsif response.code == 209 # Error 209: invalid session token
|
407
|
-
|
408
|
-
raise Parse::InvalidSessionTokenError, response
|
437
|
+
warn "[Parse:InvalidSessionTokenError] #{response}"
|
438
|
+
raise Parse::Error::InvalidSessionTokenError, response
|
409
439
|
end
|
410
440
|
end
|
411
441
|
|
412
442
|
response
|
413
|
-
rescue Parse::ServiceUnavailableError => e
|
414
|
-
if
|
415
|
-
|
416
|
-
|
417
|
-
|
443
|
+
rescue Parse::Error::ServiceUnavailableError => e
|
444
|
+
if _retry_count > 0
|
445
|
+
warn "[Parse:Retry] Retries remaining #{_retry_count} : #{response.request}"
|
446
|
+
_retry_count -= 1
|
447
|
+
backoff_delay = RETRY_DELAY * (self.retry_limit - _retry_count)
|
448
|
+
_retry_delay = [0,RETRY_DELAY, backoff_delay].sample
|
449
|
+
sleep _retry_delay if _retry_delay > 0
|
418
450
|
retry
|
419
451
|
end
|
420
452
|
raise
|
421
453
|
rescue Faraday::Error::ClientError, Net::OpenTimeout => e
|
422
|
-
if
|
423
|
-
|
424
|
-
|
425
|
-
|
454
|
+
if _retry_count > 0
|
455
|
+
warn "[Parse:Retry] Retries remaining #{_retry_count} : #{_request}"
|
456
|
+
_retry_count -= 1
|
457
|
+
backoff_delay = RETRY_DELAY * (self.retry_limit - _retry_count)
|
458
|
+
_retry_delay = [0,RETRY_DELAY, backoff_delay].sample
|
459
|
+
sleep _retry_delay if _retry_delay > 0
|
426
460
|
retry
|
427
461
|
end
|
428
|
-
raise Parse::ConnectionError, "#{_request} : #{e.class} - #{e.message}"
|
462
|
+
raise Parse::Error::ConnectionError, "#{_request} : #{e.class} - #{e.message}"
|
429
463
|
end
|
430
464
|
|
431
465
|
# Send a GET request.
|
@@ -479,10 +513,12 @@ module Parse
|
|
479
513
|
# Any subclass can override their `client` methods to provide a different session to use
|
480
514
|
module Connectable
|
481
515
|
|
516
|
+
# @!visibility private
|
482
517
|
def self.included(baseClass)
|
483
518
|
baseClass.extend ClassMethods
|
484
519
|
end
|
485
|
-
|
520
|
+
# Class methods to be added to any object that wants to have standard access to
|
521
|
+
# a the default {Parse::Client} instance.
|
486
522
|
module ClassMethods
|
487
523
|
|
488
524
|
# @return [Parse::Client] the current client for :default.
|
@@ -15,6 +15,7 @@ module Parse
|
|
15
15
|
# Parse REST API endpoint.
|
16
16
|
class Authentication < Faraday::Middleware
|
17
17
|
include Parse::Protocol
|
18
|
+
# @!visibility private
|
18
19
|
DISABLE_MASTER_KEY = "X-Disable-Parse-Master-Key".freeze
|
19
20
|
# @return [String] the application id for this Parse endpoint.
|
20
21
|
attr_accessor :application_id
|
@@ -44,7 +45,7 @@ module Parse
|
|
44
45
|
@content_type = options[:content_type] || CONTENT_TYPE_FORMAT
|
45
46
|
end
|
46
47
|
|
47
|
-
#
|
48
|
+
# Thread-safety
|
48
49
|
# @!visibility private
|
49
50
|
def call(env)
|
50
51
|
dup.call!(env)
|
data/lib/parse/client/batch.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
1
3
|
|
2
4
|
require_relative 'request'
|
3
5
|
require_relative 'response'
|
@@ -33,9 +35,15 @@ module Parse
|
|
33
35
|
# @see Array.save
|
34
36
|
# @see Array.destroy
|
35
37
|
class BatchOperation
|
38
|
+
include Enumerable
|
39
|
+
|
40
|
+
# @!attribute requests
|
41
|
+
# @return [Array] the set of requests in this batch.
|
36
42
|
|
43
|
+
# @!attribute responses
|
44
|
+
# @return [Array] the set of responses from this batch.
|
37
45
|
attr_accessor :requests, :responses
|
38
|
-
|
46
|
+
|
39
47
|
|
40
48
|
# @return [Parse::Client] the client to be used for the request.
|
41
49
|
def client
|
@@ -10,11 +10,26 @@ require 'active_support/core_ext'
|
|
10
10
|
require 'active_model_serializers'
|
11
11
|
|
12
12
|
module Parse
|
13
|
+
|
14
|
+
# @!attribute self.logging
|
15
|
+
# Sets {Parse::Middleware::BodyBuilder} logging.
|
16
|
+
# You may specify `:debug` for additional verbosity.
|
17
|
+
# @return (see Parse::Middleware::BodyBuilder.logging)
|
18
|
+
def self.logging
|
19
|
+
Parse::Middleware::BodyBuilder.logging
|
20
|
+
end
|
21
|
+
# @!visibility private
|
22
|
+
def self.logging=(value)
|
23
|
+
Parse::Middleware::BodyBuilder.logging = value
|
24
|
+
end
|
25
|
+
|
26
|
+
# Namespace for Parse-Stack related middleware.
|
13
27
|
module Middleware
|
14
28
|
# This middleware takes an incoming Parse response, after an outgoing request,
|
15
29
|
# and creates a Parse::Response object.
|
16
30
|
class BodyBuilder < Faraday::Middleware
|
17
31
|
include Parse::Protocol
|
32
|
+
# Header sent when a GET requests exceeds the limit.
|
18
33
|
HTTP_OVERRIDE = 'X-Http-Method-Override'
|
19
34
|
|
20
35
|
class << self
|
@@ -24,7 +39,7 @@ module Parse
|
|
24
39
|
attr_accessor :logging
|
25
40
|
end
|
26
41
|
|
27
|
-
#
|
42
|
+
# Thread-safety
|
28
43
|
# @!visibility private
|
29
44
|
def call(env)
|
30
45
|
dup.call!(env)
|
data/lib/parse/client/caching.rb
CHANGED
@@ -8,7 +8,6 @@ require_relative 'protocol'
|
|
8
8
|
|
9
9
|
module Parse
|
10
10
|
module Middleware
|
11
|
-
class CachingError < StandardError; end;
|
12
11
|
# This is a caching middleware for Parse queries using Moneta. The caching
|
13
12
|
# middleware will cache all GET requests made to the Parse REST API as long
|
14
13
|
# as the API responds with a successful non-empty result payload.
|
@@ -19,19 +18,22 @@ module Parse
|
|
19
18
|
class Caching < Faraday::Middleware
|
20
19
|
include Parse::Protocol
|
21
20
|
|
22
|
-
#
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
21
|
+
# List of status codes that can be cached:
|
22
|
+
# * 200 - 'OK'
|
23
|
+
# * 203 - 'Non-Authoritative Information'
|
24
|
+
# * 300 - 'Multiple Choices'
|
25
|
+
# * 301 - 'Moved Permanently'
|
26
|
+
# * 302 - 'Found'
|
27
|
+
# * 404 - 'Not Found' - removed
|
28
|
+
# * 410 - 'Gone' - removed
|
31
29
|
CACHEABLE_HTTP_CODES = [200, 203, 300, 301, 302].freeze
|
30
|
+
# Cache control header
|
32
31
|
CACHE_CONTROL = 'Cache-Control'
|
32
|
+
# Request env key for the content length
|
33
33
|
CONTENT_LENGTH_KEY = 'content-length'
|
34
|
+
# Header in response that is sent if this is a cached result
|
34
35
|
CACHE_RESPONSE_HEADER = 'X-Cache-Response'
|
36
|
+
# Header in request to set caching information for the middleware.
|
35
37
|
CACHE_EXPIRES_DURATION = 'X-Parse-Stack-Cache-Expires'
|
36
38
|
|
37
39
|
class << self
|
@@ -71,7 +73,7 @@ module Parse
|
|
71
73
|
# @param store [Moneta] An instance of the Moneta cache store to use.
|
72
74
|
# @param opts [Hash] additional options.
|
73
75
|
# @option opts [Integer] :expires the default expiration for a cache entry.
|
74
|
-
# @raise
|
76
|
+
# @raise ArgumentError, if `store` is not a Moneta::Transformer instance.
|
75
77
|
def initialize(adapter, store, opts = {})
|
76
78
|
super(adapter)
|
77
79
|
@store = store
|
@@ -80,11 +82,12 @@ module Parse
|
|
80
82
|
@expires = @opts[:expires]
|
81
83
|
|
82
84
|
unless @store.is_a?(Moneta::Transformer)
|
83
|
-
raise
|
85
|
+
raise ArgumentError, "Caching store object must a Moneta key/value store (Moneta::Transformer)."
|
84
86
|
end
|
85
87
|
|
86
88
|
end
|
87
89
|
|
90
|
+
# Thread-safety
|
88
91
|
# @!visibility private
|
89
92
|
def call(env)
|
90
93
|
dup.call!(env)
|
@@ -153,7 +156,6 @@ module Parse
|
|
153
156
|
puts "[Parse::Cache] Error: #{e}"
|
154
157
|
end
|
155
158
|
|
156
|
-
puts("[Parse::Cache::Miss] !! #{url}") if self.class.logging.present?
|
157
159
|
@app.call(env).on_complete do |response_env|
|
158
160
|
# Only cache GET requests with valid HTTP status codes whose content-length
|
159
161
|
# is greater than 20. Otherwise they could be errors, successes and empty result sets.
|