parse-stack 1.6.4 → 1.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Changes.md +13 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +25 -14
- data/README.md +5 -0
- data/Rakefile +11 -1
- data/_config.yml +1 -0
- data/lib/parse/api/hooks.rb +3 -2
- data/lib/parse/api/server.rb +1 -0
- data/lib/parse/client.rb +6 -3
- data/lib/parse/model/classes/installation.rb +28 -1
- data/lib/parse/model/classes/product.rb +46 -0
- data/lib/parse/model/classes/role.rb +4 -2
- data/lib/parse/model/classes/session.rb +9 -0
- data/lib/parse/model/classes/user.rb +6 -2
- data/lib/parse/model/model.rb +3 -1
- data/lib/parse/model/object.rb +6 -5
- data/lib/parse/stack/tasks.rb +35 -3
- data/lib/parse/stack/version.rb +1 -1
- data/lib/parse/webhooks.rb +16 -10
- data/lib/parse/webhooks/payload.rb +38 -3
- data/lib/parse/webhooks/registration.rb +8 -11
- metadata +5 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1d377fe92fad8444768b9e99dd1ef19b9e5e224c
|
|
4
|
+
data.tar.gz: 777cf72734c0bf6bd6ea2f59873d541b8879e792
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 19a5167c66db9a160c6203306d40d2fa4eb90c75025c17579f93efa7ed6dfbaf4295a4e4604a8c8622a5d1e336dd581d882ce2952633eb1d244d481fa1411659
|
|
7
|
+
data.tar.gz: d70d4514928179ccc896a8c99f93374605bd00ed83d47b76dc0e3396b24ec3d4fea3a275d0578153985cb77a8094778d25bd972b72519374b1893608a05f5877
|
data/Changes.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
## Parse-Stack Changelog
|
|
2
2
|
|
|
3
|
+
### 1.6.5
|
|
4
|
+
- Client handles HTTP Status 429 (RetryLimitExceeded)
|
|
5
|
+
- Role class does not automatically set default ACLs for Roles. You can restore
|
|
6
|
+
previous behavior by using `before_save :apply_default_acls`.
|
|
7
|
+
- Fixed minor issue to Parse::User.signup when merging username into response.
|
|
8
|
+
- NEW: Adds Parse::Product core class.
|
|
9
|
+
- NEW: Rake task to list registered webhooks. `rake parse:webhooks:list`
|
|
10
|
+
- Experimental support for beforeFind and afterFind - though webhook support not
|
|
11
|
+
yet fully available in open source Parse Server.
|
|
12
|
+
- Removes HTTPS requirement on webhooks.
|
|
13
|
+
- FIXES: Issue with WEBHOOK_KEY not being properly validated when set.
|
|
14
|
+
- beforeSaves now return empty hash instead of true on noop changes.
|
|
15
|
+
|
|
3
16
|
### 1.6.4
|
|
4
17
|
- Fixes #20: All temporary headers values are strings.
|
|
5
18
|
- Reduced cache storage consumption by only storing response body and headers.
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
parse-stack (1.6.
|
|
4
|
+
parse-stack (1.6.5)
|
|
5
5
|
active_model_serializers (>= 0.9, < 1)
|
|
6
6
|
activemodel (>= 4.2.1, < 6)
|
|
7
7
|
activesupport (>= 4.2.1, < 6)
|
|
@@ -14,15 +14,15 @@ PATH
|
|
|
14
14
|
GEM
|
|
15
15
|
remote: https://rubygems.org/
|
|
16
16
|
specs:
|
|
17
|
-
actionpack (5.0.
|
|
18
|
-
actionview (= 5.0.
|
|
19
|
-
activesupport (= 5.0.
|
|
17
|
+
actionpack (5.0.1)
|
|
18
|
+
actionview (= 5.0.1)
|
|
19
|
+
activesupport (= 5.0.1)
|
|
20
20
|
rack (~> 2.0)
|
|
21
21
|
rack-test (~> 0.6.3)
|
|
22
22
|
rails-dom-testing (~> 2.0)
|
|
23
23
|
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
|
24
|
-
actionview (5.0.
|
|
25
|
-
activesupport (= 5.0.
|
|
24
|
+
actionview (5.0.1)
|
|
25
|
+
activesupport (= 5.0.1)
|
|
26
26
|
builder (~> 3.1)
|
|
27
27
|
erubis (~> 2.7.0)
|
|
28
28
|
rails-dom-testing (~> 2.0)
|
|
@@ -31,9 +31,9 @@ GEM
|
|
|
31
31
|
actionpack (>= 4.1, < 6)
|
|
32
32
|
activemodel (>= 4.1, < 6)
|
|
33
33
|
jsonapi (= 0.1.1.beta2)
|
|
34
|
-
activemodel (5.0.
|
|
35
|
-
activesupport (= 5.0.
|
|
36
|
-
activesupport (5.0.
|
|
34
|
+
activemodel (5.0.1)
|
|
35
|
+
activesupport (= 5.0.1)
|
|
36
|
+
activesupport (5.0.1)
|
|
37
37
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
38
38
|
i18n (~> 0.7)
|
|
39
39
|
minitest (~> 5.1)
|
|
@@ -43,11 +43,13 @@ GEM
|
|
|
43
43
|
builder (3.2.2)
|
|
44
44
|
byebug (9.0.6)
|
|
45
45
|
coderay (1.1.1)
|
|
46
|
-
concurrent-ruby (1.0.
|
|
46
|
+
concurrent-ruby (1.0.4)
|
|
47
|
+
daemons (1.2.4)
|
|
47
48
|
debug_inspector (0.0.2)
|
|
48
49
|
dotenv (2.1.1)
|
|
49
50
|
erubis (2.7.0)
|
|
50
|
-
|
|
51
|
+
eventmachine (1.2.1)
|
|
52
|
+
faraday (0.10.1)
|
|
51
53
|
multipart-post (>= 1.2, < 3)
|
|
52
54
|
faraday_middleware (0.10.1)
|
|
53
55
|
faraday (>= 0.7.4, < 1.0)
|
|
@@ -62,7 +64,7 @@ GEM
|
|
|
62
64
|
minitest (5.10.1)
|
|
63
65
|
moneta (0.8.1)
|
|
64
66
|
multipart-post (2.0.0)
|
|
65
|
-
nokogiri (1.
|
|
67
|
+
nokogiri (1.7.0)
|
|
66
68
|
mini_portile2 (~> 2.1.0)
|
|
67
69
|
parallel (1.10.0)
|
|
68
70
|
pry (0.10.4)
|
|
@@ -77,17 +79,23 @@ GEM
|
|
|
77
79
|
rack (2.0.1)
|
|
78
80
|
rack-test (0.6.3)
|
|
79
81
|
rack (>= 1.0)
|
|
80
|
-
rails-dom-testing (2.0.
|
|
82
|
+
rails-dom-testing (2.0.2)
|
|
81
83
|
activesupport (>= 4.2.0, < 6.0)
|
|
82
|
-
nokogiri (~> 1.6
|
|
84
|
+
nokogiri (~> 1.6)
|
|
83
85
|
rails-html-sanitizer (1.0.3)
|
|
84
86
|
loofah (~> 2.0)
|
|
85
87
|
rake (12.0.0)
|
|
88
|
+
redcarpet (3.4.0)
|
|
86
89
|
redis (3.3.2)
|
|
87
90
|
slop (3.6.0)
|
|
91
|
+
thin (1.7.0)
|
|
92
|
+
daemons (~> 1.0, >= 1.0.9)
|
|
93
|
+
eventmachine (~> 1.0, >= 1.0.4)
|
|
94
|
+
rack (>= 1, < 3)
|
|
88
95
|
thread_safe (0.3.5)
|
|
89
96
|
tzinfo (1.2.2)
|
|
90
97
|
thread_safe (~> 0.1)
|
|
98
|
+
yard (0.9.5)
|
|
91
99
|
|
|
92
100
|
PLATFORMS
|
|
93
101
|
ruby
|
|
@@ -101,7 +109,10 @@ DEPENDENCIES
|
|
|
101
109
|
pry-nav
|
|
102
110
|
pry-stack_explorer
|
|
103
111
|
rake
|
|
112
|
+
redcarpet
|
|
104
113
|
redis
|
|
114
|
+
thin
|
|
115
|
+
yard
|
|
105
116
|
|
|
106
117
|
BUNDLED WITH
|
|
107
118
|
1.13.6
|
data/README.md
CHANGED
|
@@ -6,6 +6,11 @@ Parse-Stack is the [Parse Server](https://github.com/ParsePlatform/parse-server)
|
|
|
6
6
|
|
|
7
7
|
Below is a [quick start guide](https://github.com/modernistik/parse-stack#overview), but you can also check out the full [API Reference](http://www.rubydoc.info/github/modernistik/parse-stack) for more detailed information about our Parse Server SDK.
|
|
8
8
|
|
|
9
|
+
Watch Getting Started: https://youtu.be/zoYSGmciDlQ
|
|
10
|
+
|
|
11
|
+
### Parse File Migration Tool
|
|
12
|
+
**If you are looking for a tool to migrate your hosted Parse Files to an Amazon S3 bucket, see our [Parse File Migration tool here](https://github.com/modernistik/parse-file-migration). This should be done before January 28th, 2017**
|
|
13
|
+
|
|
9
14
|
### Code Status
|
|
10
15
|
[](https://badge.fury.io/rb/parse-stack)
|
|
11
16
|
[](https://travis-ci.org/modernistik/parse-stack)
|
data/Rakefile
CHANGED
|
@@ -13,6 +13,16 @@ end
|
|
|
13
13
|
task :default => :test
|
|
14
14
|
|
|
15
15
|
task :console do
|
|
16
|
-
exec
|
|
16
|
+
exec './bin/console'
|
|
17
17
|
end
|
|
18
18
|
task :c => :console
|
|
19
|
+
|
|
20
|
+
desc 'List undocumented methods'
|
|
21
|
+
task 'doc:stats' do
|
|
22
|
+
exec 'yard stats --list-undoc'
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
desc 'Start the yard server'
|
|
26
|
+
task 'doc:server' do
|
|
27
|
+
exec 'rm -rf ./yard && yard server --reload'
|
|
28
|
+
end
|
data/_config.yml
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
theme: jekyll-theme-midnight
|
data/lib/parse/api/hooks.rb
CHANGED
|
@@ -10,8 +10,9 @@ module Parse
|
|
|
10
10
|
# @!visibility private
|
|
11
11
|
HOOKS_PREFIX = "hooks/"
|
|
12
12
|
# The allowed set of Parse triggers.
|
|
13
|
-
TRIGGER_NAMES = [:
|
|
14
|
-
|
|
13
|
+
TRIGGER_NAMES = [:afterDelete, :afterFind, :afterSave, :beforeDelete, :beforeFind, :beforeSave].freeze
|
|
14
|
+
# @!visibility private
|
|
15
|
+
TRIGGER_NAMES_LOCAL = [:after_delete, :after_find, :after_save, :before_delete, :before_find, :before_save].freeze
|
|
15
16
|
# @!visibility private
|
|
16
17
|
def _verify_trigger(triggerName)
|
|
17
18
|
triggerName = triggerName.to_s.camelize(:lower).to_sym
|
data/lib/parse/api/server.rb
CHANGED
|
@@ -13,6 +13,7 @@ module Parse
|
|
|
13
13
|
|
|
14
14
|
# @!visibility private
|
|
15
15
|
SERVER_INFO_PATH = 'serverInfo'
|
|
16
|
+
# @!visibility private
|
|
16
17
|
SERVER_HEALTH_PATH = 'health'
|
|
17
18
|
# Fetch and cache information about the Parse server configuration. This
|
|
18
19
|
# hash contains information specifically to the configuration of the running
|
data/lib/parse/client.rb
CHANGED
|
@@ -173,7 +173,7 @@ module Parse
|
|
|
173
173
|
# options.
|
|
174
174
|
# @example
|
|
175
175
|
# Parse.setup app_id: "YOUR_APP_ID",
|
|
176
|
-
# api_key: "
|
|
176
|
+
# api_key: "YOUR_REST_API_KEY",
|
|
177
177
|
# master_key: "YOUR_MASTER_KEY", # optional
|
|
178
178
|
# server_url: 'https://api.parse.com/1/' #default
|
|
179
179
|
# @param opts (see Parse::Client#initialize)
|
|
@@ -197,7 +197,7 @@ module Parse
|
|
|
197
197
|
# ENV["PARSE_SERVER_URL"] if available, otherwise fallback to {Parse::Protocol::SERVER_URL}.
|
|
198
198
|
# @option opts [String] :app_id The Parse application id. Defaults to
|
|
199
199
|
# ENV['PARSE_APP_ID'] or ENV['PARSE_APPLICATION_ID'].
|
|
200
|
-
# @option opts [String] :api_key
|
|
200
|
+
# @option opts [String] :api_key Your Parse REST API Key. Defaults to ENV['PARSE_REST_API_KEY'].
|
|
201
201
|
# @option opts [String] :master_key The Parse application master key (optional).
|
|
202
202
|
# If this key is set, it will be sent on every request sent by the client
|
|
203
203
|
# and your models. Defaults to ENV['PARSE_MASTER_KEY'].
|
|
@@ -429,6 +429,9 @@ module Parse
|
|
|
429
429
|
when 405, 406
|
|
430
430
|
warn "[Parse:ProtocolError] #{response}"
|
|
431
431
|
raise Parse::Error::ProtocolError, response
|
|
432
|
+
when 429 # Request over the throttle limit
|
|
433
|
+
warn "[Parse:RequestLimitExceededError] #{response}"
|
|
434
|
+
raise Parse::Error::RequestLimitExceededError, response
|
|
432
435
|
when 500, 503
|
|
433
436
|
warn "[Parse:ServiceUnavailableError] #{response}"
|
|
434
437
|
raise Parse::Error::ServiceUnavailableError, response
|
|
@@ -451,7 +454,7 @@ module Parse
|
|
|
451
454
|
end
|
|
452
455
|
|
|
453
456
|
response
|
|
454
|
-
rescue Parse::Error::ServiceUnavailableError => e
|
|
457
|
+
rescue Parse::Error::RequestLimitExceededError, Parse::Error::ServiceUnavailableError => e
|
|
455
458
|
if _retry_count > 0
|
|
456
459
|
warn "[Parse:Retry] Retries remaining #{_retry_count} : #{response.request}"
|
|
457
460
|
_retry_count -= 1
|
|
@@ -14,6 +14,7 @@ module Parse
|
|
|
14
14
|
class Installation < Parse::Object
|
|
15
15
|
|
|
16
16
|
parse_class Parse::Model::CLASS_INSTALLATION
|
|
17
|
+
# @!attribute gcm_sender_id
|
|
17
18
|
# This field only has meaning for Android installations that use the GCM
|
|
18
19
|
# push type. It is reserved for directing Parse to send pushes to this
|
|
19
20
|
# installation with an alternate GCM sender ID. This field should generally
|
|
@@ -22,49 +23,75 @@ module Parse
|
|
|
22
23
|
# corresponding to this GCM sender ID in your Parse application’s push settings.
|
|
23
24
|
# @return [String]
|
|
24
25
|
property :gcm_sender_id, :string, field: :GCMSenderId
|
|
26
|
+
|
|
27
|
+
# @!attribute app_identifier
|
|
25
28
|
# A unique identifier for this installation’s client application. In iOS, this is the Bundle Identifier.
|
|
26
29
|
# @return [String]
|
|
27
30
|
property :app_identifier
|
|
31
|
+
|
|
32
|
+
# @!attribute app_name
|
|
28
33
|
# The display name of the client application to which this installation belongs.
|
|
29
34
|
# @return [String]
|
|
30
35
|
property :app_name
|
|
36
|
+
|
|
37
|
+
# @!attribute app_version
|
|
31
38
|
# The version string of the client application to which this installation belongs.
|
|
32
39
|
# @return [String]
|
|
33
40
|
property :app_version
|
|
41
|
+
|
|
42
|
+
# @!attribute badge
|
|
34
43
|
# A number field representing the last known application badge for iOS installations.
|
|
35
44
|
# @return [Integer]
|
|
36
45
|
property :badge, :integer
|
|
46
|
+
|
|
47
|
+
# @!attribute channels
|
|
37
48
|
# An array of the channels to which a device is currently subscribed.
|
|
38
49
|
# Note that **channelUris** (the Microsoft-generated push URIs for Windows devices) is
|
|
39
50
|
# not supported at this time.
|
|
40
51
|
# @return [Array]
|
|
41
52
|
property :channels, :array
|
|
53
|
+
|
|
54
|
+
# @!attribute device_token
|
|
42
55
|
# The Apple or Google generated token used to deliver messages to the APNs
|
|
43
56
|
# or GCM push networks respectively.
|
|
44
57
|
# @return [String]
|
|
45
58
|
property :device_token
|
|
46
|
-
|
|
59
|
+
|
|
60
|
+
# @!attribute device_token_last_modified
|
|
61
|
+
# @return [Integer] number of seconds since token modified
|
|
47
62
|
property :device_token_last_modified, :integer
|
|
63
|
+
|
|
64
|
+
# @!attribute device_type
|
|
48
65
|
# The type of device, “ios”, “android”, “winrt”, “winphone”, or “dotnet” (readonly).
|
|
49
66
|
# This property is implemented as a Parse::Stack enumeration.
|
|
50
67
|
# @return [String]
|
|
51
68
|
property :device_type, enum: [:ios, :android, :winrt, :winphone, :dotnet]
|
|
69
|
+
|
|
70
|
+
# @!attribute installation_id
|
|
52
71
|
# Universally Unique Identifier (UUID) for the device used by Parse. It
|
|
53
72
|
# must be unique across all of an app’s installations. (readonly).
|
|
54
73
|
# @return [String]
|
|
55
74
|
property :installation_id
|
|
75
|
+
|
|
76
|
+
# @!attribute locale_identifier
|
|
56
77
|
# The locale for this device.
|
|
57
78
|
# @return [String]
|
|
58
79
|
property :locale_identifier
|
|
80
|
+
|
|
81
|
+
# @!attribute parse_version
|
|
59
82
|
# The version of the Parse SDK which this installation uses.
|
|
60
83
|
# @return [String]
|
|
61
84
|
property :parse_version
|
|
85
|
+
|
|
86
|
+
# @!attribute push_type
|
|
62
87
|
# This field is reserved for directing Parse to the push delivery network
|
|
63
88
|
# to be used. If the device is registered to receive pushes via GCM, this
|
|
64
89
|
# field will be marked “gcm”. If this device is not using GCM, and is
|
|
65
90
|
# using Parse’s push notification service, it will be blank (readonly).
|
|
66
91
|
# @return [String]
|
|
67
92
|
property :push_type
|
|
93
|
+
|
|
94
|
+
# @!attribute time_zone
|
|
68
95
|
# The current time zone where the target device is located. This should be an IANA time zone identifier.
|
|
69
96
|
# @return [String]
|
|
70
97
|
property :time_zone
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
require_relative '../object'
|
|
4
|
+
require_relative 'user'
|
|
5
|
+
module Parse
|
|
6
|
+
# This class represents the data and columns contained in the standard Parse `_Product` collection.
|
|
7
|
+
# These records are usually used when implementing in-app purchases in mobile applications.
|
|
8
|
+
class Product < Parse::Object
|
|
9
|
+
|
|
10
|
+
parse_class Parse::Model::CLASS_PRODUCT
|
|
11
|
+
# @!attribute download
|
|
12
|
+
# @return [String] the file payload for this product download.
|
|
13
|
+
property :download, :file
|
|
14
|
+
|
|
15
|
+
# @!attribute download_name
|
|
16
|
+
# @return [String] the name of this download.
|
|
17
|
+
property :download_name
|
|
18
|
+
|
|
19
|
+
# @!attribute icon
|
|
20
|
+
# An icon file representing this download. This field is required by Parse.
|
|
21
|
+
# @return [String]
|
|
22
|
+
property :icon, :file, required: true
|
|
23
|
+
|
|
24
|
+
# @!attribute order
|
|
25
|
+
# The product order number. This field is required by Parse.
|
|
26
|
+
# @return [String]
|
|
27
|
+
property :order, :integer, required: true
|
|
28
|
+
|
|
29
|
+
# @!attribute product_identifier
|
|
30
|
+
# The product identifier. This field is required by Parse.
|
|
31
|
+
# @return [String]
|
|
32
|
+
property :product_identifier, required: true
|
|
33
|
+
|
|
34
|
+
# @!attribute subtitle
|
|
35
|
+
# The subtitle description for this product. This field is required by Parse.
|
|
36
|
+
# @return [String]
|
|
37
|
+
property :subtitle, required: true
|
|
38
|
+
|
|
39
|
+
# @!attribute title
|
|
40
|
+
# The title for this product. This field is required by Parse.
|
|
41
|
+
# @return [String] the title for this product.
|
|
42
|
+
property :title, required: true
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
@@ -10,6 +10,7 @@ module Parse
|
|
|
10
10
|
class Role < Parse::Object
|
|
11
11
|
|
|
12
12
|
parse_class Parse::Model::CLASS_ROLE
|
|
13
|
+
# @!attribute name
|
|
13
14
|
# @return [String] the name of this role.
|
|
14
15
|
property :name
|
|
15
16
|
# This attribute is mapped as a `has_many` Parse relation association with the {Parse::Role} class,
|
|
@@ -21,8 +22,9 @@ module Parse
|
|
|
21
22
|
# This attribute is mapped as a `has_many` Parse relation association with the {Parse::User} class.
|
|
22
23
|
# @return [RelationCollectionProxy<User>] a Parse relation of users belonging to this role.
|
|
23
24
|
has_many :users, through: :relation
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
|
|
26
|
+
# A method to set acls for Roles to public read, and deny public write.
|
|
27
|
+
def apply_default_acls
|
|
26
28
|
acl.everyone true, false
|
|
27
29
|
end
|
|
28
30
|
|
|
@@ -12,15 +12,24 @@ module Parse
|
|
|
12
12
|
class Session < Parse::Object
|
|
13
13
|
|
|
14
14
|
parse_class Parse::Model::CLASS_SESSION
|
|
15
|
+
|
|
16
|
+
# @!attribute created_with
|
|
15
17
|
# @return [Hash] data on how this Session was created.
|
|
16
18
|
property :created_with, :object
|
|
19
|
+
|
|
20
|
+
# @!attribute expires_at
|
|
17
21
|
# @return [Parse::Date] when the session token expires.
|
|
18
22
|
property :expires_at, :date
|
|
23
|
+
|
|
24
|
+
# @!attribute installation_id
|
|
19
25
|
# @return [String] The installation id from the Installation table.
|
|
20
26
|
# @see Installation#installation_id
|
|
21
27
|
property :installation_id
|
|
28
|
+
|
|
29
|
+
# @!attribute [r] restricted
|
|
22
30
|
# @return [Boolean] whether this session token is restricted.
|
|
23
31
|
property :restricted, :boolean
|
|
32
|
+
|
|
24
33
|
# @!attribute [r] session_token
|
|
25
34
|
# @return [String] the session token for this installation and user pair.
|
|
26
35
|
property :session_token
|
|
@@ -128,12 +128,14 @@ module Parse
|
|
|
128
128
|
# @return [String] The session token if this user is logged in.
|
|
129
129
|
attr_accessor :session_token
|
|
130
130
|
|
|
131
|
+
# @!attribute auth_data
|
|
131
132
|
# The auth data for this Parse::User. Depending on how this user is authenticated or
|
|
132
133
|
# logged in, the contents may be different, especially if you are using another third-party
|
|
133
134
|
# authentication mechanism like Facebook/Twitter.
|
|
134
135
|
# @return [Hash] Auth data hash object.
|
|
135
136
|
property :auth_data, :object
|
|
136
137
|
|
|
138
|
+
# @!attribute email
|
|
137
139
|
# Emails are optional in Parse, but if set, they must be unique.
|
|
138
140
|
# @return [String] The email field.
|
|
139
141
|
property :email
|
|
@@ -146,6 +148,7 @@ module Parse
|
|
|
146
148
|
# @return [String] The password you set.
|
|
147
149
|
property :password
|
|
148
150
|
|
|
151
|
+
# @!attribute username
|
|
149
152
|
# All Parse users have a username and must be globally unique.
|
|
150
153
|
# @return [String] The user's username.
|
|
151
154
|
property :username
|
|
@@ -155,7 +158,7 @@ module Parse
|
|
|
155
158
|
self.clear_attribute_change!(:acl)
|
|
156
159
|
end
|
|
157
160
|
|
|
158
|
-
#
|
|
161
|
+
# @return [Boolean] true if this user is anonymous.
|
|
159
162
|
def anonymous?
|
|
160
163
|
anonymous_id.nil?
|
|
161
164
|
end
|
|
@@ -302,7 +305,8 @@ module Parse
|
|
|
302
305
|
def self.create(body, **opts)
|
|
303
306
|
response = client.create_user(body, opts: opts)
|
|
304
307
|
if response.success?
|
|
305
|
-
|
|
308
|
+
body.delete :password # clear password before merging
|
|
309
|
+
return Parse::User.build body.merge(response.result)
|
|
306
310
|
end
|
|
307
311
|
|
|
308
312
|
case response.code
|
data/lib/parse/model/model.rb
CHANGED
|
@@ -53,8 +53,10 @@ module Parse
|
|
|
53
53
|
CLASS_INSTALLATION = '_Installation'
|
|
54
54
|
# The collection for revocable Sessions in Parse. Used by Parse::Session.
|
|
55
55
|
CLASS_SESSION = '_Session'
|
|
56
|
-
# The collection for
|
|
56
|
+
# The collection for Roles in Parse. Used by Parse::Role.
|
|
57
57
|
CLASS_ROLE = '_Role'
|
|
58
|
+
# The collection for to store Products (in-App purchases) in Parse. Used by Parse::Product.
|
|
59
|
+
CLASS_PRODUCT = '_Product'
|
|
58
60
|
# The type label for hashes containing file data. Used by Parse::File.
|
|
59
61
|
TYPE_FILE = 'File'
|
|
60
62
|
# The type label for hashes containing geopoints. Used by Parse::GeoPoint.
|
data/lib/parse/model/object.rb
CHANGED
|
@@ -426,20 +426,20 @@ module Parse
|
|
|
426
426
|
# puts "Parse::Object.build error: #{e}"
|
|
427
427
|
end
|
|
428
428
|
|
|
429
|
-
# @!attribute
|
|
429
|
+
# @!attribute id
|
|
430
430
|
# @return [String] the value of Parse "objectId" field.
|
|
431
|
+
property :id, field: :objectId
|
|
431
432
|
|
|
432
433
|
# @!attribute [r] created_at
|
|
433
434
|
# @return [Date] the created_at date of the record in UTC Zulu iso 8601 with 3 millisecond format.
|
|
435
|
+
property :created_at, :date
|
|
434
436
|
|
|
435
437
|
# @!attribute [r] updated_at
|
|
436
438
|
# @return [Date] the updated_at date of the record in UTC Zulu iso 8601 with 3 millisecond format.
|
|
439
|
+
property :updated_at, :date
|
|
437
440
|
|
|
438
|
-
# @!attribute
|
|
441
|
+
# @!attribute acl
|
|
439
442
|
# @return [ACL] the access control list (permissions) object for this record.
|
|
440
|
-
property :id, field: :objectId
|
|
441
|
-
property :created_at, :date
|
|
442
|
-
property :updated_at, :date
|
|
443
443
|
property :acl, :acl, field: :ACL
|
|
444
444
|
|
|
445
445
|
# Alias to {created_at}
|
|
@@ -509,6 +509,7 @@ end
|
|
|
509
509
|
|
|
510
510
|
# Load all the core classes.
|
|
511
511
|
require_relative 'classes/installation'
|
|
512
|
+
require_relative 'classes/product'
|
|
512
513
|
require_relative 'classes/role'
|
|
513
514
|
require_relative 'classes/session'
|
|
514
515
|
require_relative 'classes/user'
|
data/lib/parse/stack/tasks.rb
CHANGED
|
@@ -54,8 +54,8 @@ module Parse
|
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
endpoint = ENV['HOOKS_URL'] || ''
|
|
57
|
-
unless endpoint.
|
|
58
|
-
raise "The ENV variable HOOKS_URL must be a <
|
|
57
|
+
unless endpoint.starts_with?('http://') || endpoint.starts_with?('https://')
|
|
58
|
+
raise "The ENV variable HOOKS_URL must be a <http/s> url : '#{endpoint}'. Ex. https://12345678.ngrok.io/webhooks"
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
end
|
|
@@ -78,12 +78,44 @@ module Parse
|
|
|
78
78
|
Rake::Task['parse:webhooks:register:triggers'].invoke
|
|
79
79
|
end
|
|
80
80
|
|
|
81
|
-
desc "
|
|
81
|
+
desc "List all webhooks and triggers registered with the Parse Server"
|
|
82
|
+
task :list => :verify_env do
|
|
83
|
+
Rake::Task['parse:webhooks:list:functions'].invoke
|
|
84
|
+
Rake::Task['parse:webhooks:list:triggers'].invoke
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
desc "Remove all locally registered webhooks from the Parse Application."
|
|
82
88
|
task :remove => :verify_env do
|
|
83
89
|
Rake::Task['parse:webhooks:remove:functions'].invoke
|
|
84
90
|
Rake::Task['parse:webhooks:remove:triggers'].invoke
|
|
85
91
|
end
|
|
86
92
|
|
|
93
|
+
namespace :list do
|
|
94
|
+
task :functions => :verify_env do
|
|
95
|
+
endpoint = ENV['HOOKS_URL'] || '-'
|
|
96
|
+
Parse.client.functions.each do |r|
|
|
97
|
+
name = r['functionName']
|
|
98
|
+
url = r['url']
|
|
99
|
+
star = url.starts_with?(endpoint) ? '*' : ' '
|
|
100
|
+
puts "[#{star}] #{name} -> #{url}"
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
task :triggers => :verify_env do
|
|
105
|
+
endpoint = ENV['HOOKS_URL'] || '-'
|
|
106
|
+
triggers = Parse.client.triggers.results
|
|
107
|
+
triggers.sort! { |x,y| [x['className'],x['triggerName']] <=> [y['className'], y['triggerName'] ] }
|
|
108
|
+
triggers.each do |r|
|
|
109
|
+
name = r['className']
|
|
110
|
+
trigger = r['triggerName']
|
|
111
|
+
url = r['url']
|
|
112
|
+
star = url.starts_with?(endpoint) ? '*' : ' '
|
|
113
|
+
puts "[#{star}] #{name}.#{trigger} -> #{url}"
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
end
|
|
118
|
+
|
|
87
119
|
namespace :register do
|
|
88
120
|
|
|
89
121
|
task :functions => :verify_env do
|
data/lib/parse/stack/version.rb
CHANGED
data/lib/parse/webhooks.rb
CHANGED
|
@@ -91,12 +91,13 @@ module Parse
|
|
|
91
91
|
# The content type that needs to be sent back to Parse server.
|
|
92
92
|
CONTENT_TYPE = "application/json"
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
|
|
95
95
|
# The Parse Webhook Key to be used for authenticating webhook requests.
|
|
96
|
-
#
|
|
97
|
-
# present.
|
|
96
|
+
# See {Parse::Webhooks.key} on setting this value.
|
|
98
97
|
# @return [String]
|
|
99
|
-
|
|
98
|
+
def key
|
|
99
|
+
self.class.key
|
|
100
|
+
end
|
|
100
101
|
|
|
101
102
|
class << self
|
|
102
103
|
|
|
@@ -114,10 +115,9 @@ module Parse
|
|
|
114
115
|
# `:before_delete`, `:after_delete` or `:function`.
|
|
115
116
|
# @return [OpenStruct]
|
|
116
117
|
def routes
|
|
117
|
-
@routes
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
})
|
|
118
|
+
return @routes unless @routes.nil?
|
|
119
|
+
r = Parse::API::Hooks::TRIGGER_NAMES_LOCAL + [:function]
|
|
120
|
+
@routes = OpenStruct.new( r.reduce({}) { |h,t| h[t] = {}; h; } )
|
|
121
121
|
end
|
|
122
122
|
|
|
123
123
|
# Internally registers a route for a specific webhook trigger or function.
|
|
@@ -192,6 +192,9 @@ module Parse
|
|
|
192
192
|
result.run_callbacks(:destroy) { false }
|
|
193
193
|
result = true
|
|
194
194
|
end
|
|
195
|
+
elsif type == :before_save && ( result == true || result.nil? )
|
|
196
|
+
# Open Source Parse server does not accept true results on before_save hooks.
|
|
197
|
+
result = {}
|
|
195
198
|
end
|
|
196
199
|
|
|
197
200
|
result
|
|
@@ -211,9 +214,11 @@ module Parse
|
|
|
211
214
|
{ error: data }.to_json
|
|
212
215
|
end
|
|
213
216
|
|
|
217
|
+
# @!attribute key
|
|
214
218
|
# Returns the configured webhook key if available. By default it will use
|
|
215
219
|
# the value of ENV['PARSE_WEBHOOK_KEY'] if not configured.
|
|
216
220
|
# @return [String]
|
|
221
|
+
attr_accessor :key
|
|
217
222
|
def key
|
|
218
223
|
@key ||= ENV['PARSE_WEBHOOK_KEY']
|
|
219
224
|
end
|
|
@@ -237,8 +242,9 @@ module Parse
|
|
|
237
242
|
request = Rack::Request.new env
|
|
238
243
|
response = Rack::Response.new
|
|
239
244
|
|
|
240
|
-
if
|
|
241
|
-
|
|
245
|
+
if self.key.present? && self.key != request.env[HTTP_PARSE_WEBHOOK]
|
|
246
|
+
puts "[Parse::Webhooks] Invalid Parse-Webhook Key: #{request.env[HTTP_PARSE_WEBHOOK]}"
|
|
247
|
+
response.write error("Invalid Parse Webhook Key")
|
|
242
248
|
return response.finish
|
|
243
249
|
end
|
|
244
250
|
|
|
@@ -23,6 +23,8 @@ module Parse
|
|
|
23
23
|
installationId: nil, params: nil,
|
|
24
24
|
functionName: nil, object: nil,
|
|
25
25
|
original: nil, update: nil,
|
|
26
|
+
query: nil, log: nil,
|
|
27
|
+
objects: nil,
|
|
26
28
|
triggerName: nil }.freeze
|
|
27
29
|
include ::ActiveModel::Serializers::JSON
|
|
28
30
|
# @!attribute [rw] master
|
|
@@ -50,9 +52,20 @@ module Parse
|
|
|
50
52
|
# @return [Hash] the raw payload from Parse server.
|
|
51
53
|
# @!attribute [rw] update
|
|
52
54
|
# @return [Hash] the update payload in the request.
|
|
55
|
+
# @!attribute [r] query
|
|
56
|
+
# The query request in a beforeFind trigger. Available in Parse Server 2.3.1 or later.
|
|
57
|
+
# @return [Parse::Query]
|
|
58
|
+
# @!attribute [r] objects
|
|
59
|
+
# The set of matching objects in an afterFind trigger. Available in Parse Server 2.3.1 or later.
|
|
60
|
+
# @return [<Parse::Object>]
|
|
61
|
+
# @!attribute [r] log
|
|
62
|
+
# Logging information if available. Available in Parse Server 2.3.1 or later.
|
|
63
|
+
# @return [Hash] the set of matching objects in an afterFind trigger.
|
|
53
64
|
attr_accessor :master, :user, :installation_id, :params, :function_name, :object, :trigger_name
|
|
54
|
-
|
|
65
|
+
attr_accessor :query, :log, :objects
|
|
55
66
|
attr_accessor :original, :update, :raw
|
|
67
|
+
# @!visibility private
|
|
68
|
+
attr_accessor :webhook_class
|
|
56
69
|
alias_method :installationId, :installation_id
|
|
57
70
|
alias_method :functionName, :function_name
|
|
58
71
|
alias_method :triggerName, :trigger_name
|
|
@@ -74,6 +87,10 @@ module Parse
|
|
|
74
87
|
@trigger_name = hash[:trigger_name]
|
|
75
88
|
@original = hash[:original]
|
|
76
89
|
@update = hash[:update] || {} #it comes as an update hash
|
|
90
|
+
# Added for beforeFind and afterFind triggers
|
|
91
|
+
@query = hash[:query]
|
|
92
|
+
@objects = hash[:objects] || []
|
|
93
|
+
@log = hash[:log]
|
|
77
94
|
end
|
|
78
95
|
|
|
79
96
|
# @return [ATTRIBUTES]
|
|
@@ -88,6 +105,7 @@ module Parse
|
|
|
88
105
|
|
|
89
106
|
# @return [String] the name of the Parse class for this request.
|
|
90
107
|
def parse_class
|
|
108
|
+
return @webhook_class if @webhook_class.present?
|
|
91
109
|
return nil unless @object.present?
|
|
92
110
|
@object[Parse::Model::KEY_CLASS_NAME] || @object[:className]
|
|
93
111
|
end
|
|
@@ -105,12 +123,12 @@ module Parse
|
|
|
105
123
|
|
|
106
124
|
# true if this is a beforeSave or beforeDelete webhook trigger request.
|
|
107
125
|
def before_trigger?
|
|
108
|
-
before_save? || before_delete?
|
|
126
|
+
before_save? || before_delete? || before_find?
|
|
109
127
|
end
|
|
110
128
|
|
|
111
129
|
# true if this is a afterSave or afterDelete webhook trigger request.
|
|
112
130
|
def after_trigger?
|
|
113
|
-
after_save? || after_delete?
|
|
131
|
+
after_save? || after_delete? || after_find?
|
|
114
132
|
end
|
|
115
133
|
|
|
116
134
|
# true if this is a beforeSave webhook trigger request.
|
|
@@ -133,6 +151,16 @@ module Parse
|
|
|
133
151
|
trigger? && @trigger_name.to_sym == :afterDelete
|
|
134
152
|
end
|
|
135
153
|
|
|
154
|
+
# true if this is a beforeFind webhook trigger request.
|
|
155
|
+
def before_find?
|
|
156
|
+
trigger? && @trigger_name.to_sym == :beforeFind
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# true if this is a afterFind webhook trigger request.
|
|
160
|
+
def after_find?
|
|
161
|
+
trigger? && @trigger_name.to_sym == :afterFind
|
|
162
|
+
end
|
|
163
|
+
|
|
136
164
|
# true if this request is a trigger that contains an object.
|
|
137
165
|
def object?
|
|
138
166
|
trigger? && @object.present?
|
|
@@ -195,6 +223,13 @@ module Parse
|
|
|
195
223
|
raise Parse::Webhooks::ResponseError, msg
|
|
196
224
|
end
|
|
197
225
|
|
|
226
|
+
|
|
227
|
+
# @return [Parse::Query] the Parse query for a beforeFind trigger.
|
|
228
|
+
def parse_query
|
|
229
|
+
return nil unless parse_class.present? && @query.is_a?(Hash)
|
|
230
|
+
Parse::Query.new parse_class, @query
|
|
231
|
+
end
|
|
232
|
+
|
|
198
233
|
end # Payload
|
|
199
234
|
end
|
|
200
235
|
end
|
|
@@ -42,8 +42,8 @@ module Parse
|
|
|
42
42
|
# @param endpoint [String] a https url that points to the webhook server.
|
|
43
43
|
def register_functions!(endpoint)
|
|
44
44
|
|
|
45
|
-
unless endpoint.present? && endpoint.starts_with?('https://')
|
|
46
|
-
raise ArgumentError, "The HOOKS_URL must be
|
|
45
|
+
unless endpoint.present? && (endpoint.starts_with?('http://') || endpoint.starts_with?('https://') )
|
|
46
|
+
raise ArgumentError, "The HOOKS_URL must be http/s: '#{endpoint}''"
|
|
47
47
|
end
|
|
48
48
|
endpoint += '/' unless endpoint.ends_with?('/')
|
|
49
49
|
functionsMap = {}
|
|
@@ -70,17 +70,14 @@ module Parse
|
|
|
70
70
|
# @param include_wildcard [Boolean] Allow wildcard registrations
|
|
71
71
|
def register_triggers!(endpoint, include_wildcard: false)
|
|
72
72
|
|
|
73
|
-
unless endpoint.present? && endpoint.starts_with?('https://')
|
|
74
|
-
raise ArgumentError, "The HOOKS_URL must be
|
|
73
|
+
unless endpoint.present? && (endpoint.starts_with?('http://') || endpoint.starts_with?('https://') )
|
|
74
|
+
raise ArgumentError, "The HOOKS_URL must be http/s: '#{endpoint}''"
|
|
75
75
|
end
|
|
76
76
|
endpoint += '/' unless endpoint.ends_with?('/')
|
|
77
|
+
all_triggers = Parse::API::Hooks::TRIGGER_NAMES_LOCAL
|
|
77
78
|
|
|
78
|
-
current_triggers = {
|
|
79
|
-
|
|
80
|
-
after_delete: {},
|
|
81
|
-
before_delete: {},
|
|
82
|
-
before_save: {}
|
|
83
|
-
}
|
|
79
|
+
current_triggers = {}
|
|
80
|
+
all_triggers.each { |t| current_triggers[t] = {} }
|
|
84
81
|
|
|
85
82
|
client.triggers.each do |t|
|
|
86
83
|
next unless t["url"].present?
|
|
@@ -89,7 +86,7 @@ module Parse
|
|
|
89
86
|
current_triggers[trigger_name][ t["className"] ] = t["url"]
|
|
90
87
|
end
|
|
91
88
|
|
|
92
|
-
|
|
89
|
+
all_triggers.each do |trigger|
|
|
93
90
|
classNames = routes[trigger].keys.dup
|
|
94
91
|
if include_wildcard && classNames.include?('*') #then create the list for all classes
|
|
95
92
|
classNames.delete '*' #delete the wildcard before we expand it
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: parse-stack
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.6.
|
|
4
|
+
version: 1.6.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Anthony Persaud
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2017-01-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activemodel
|
|
@@ -181,6 +181,7 @@ files:
|
|
|
181
181
|
- LICENSE
|
|
182
182
|
- README.md
|
|
183
183
|
- Rakefile
|
|
184
|
+
- _config.yml
|
|
184
185
|
- bin/console
|
|
185
186
|
- bin/server
|
|
186
187
|
- bin/setup
|
|
@@ -216,6 +217,7 @@ files:
|
|
|
216
217
|
- lib/parse/model/associations/relation_collection_proxy.rb
|
|
217
218
|
- lib/parse/model/bytes.rb
|
|
218
219
|
- lib/parse/model/classes/installation.rb
|
|
220
|
+
- lib/parse/model/classes/product.rb
|
|
219
221
|
- lib/parse/model/classes/role.rb
|
|
220
222
|
- lib/parse/model/classes/session.rb
|
|
221
223
|
- lib/parse/model/classes/user.rb
|
|
@@ -274,7 +276,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
274
276
|
version: '0'
|
|
275
277
|
requirements: []
|
|
276
278
|
rubyforge_project:
|
|
277
|
-
rubygems_version: 2.6.
|
|
279
|
+
rubygems_version: 2.6.8
|
|
278
280
|
signing_key:
|
|
279
281
|
specification_version: 4
|
|
280
282
|
summary: Parse-Server Ruby Client and Relational Mapper
|