parse-stack 1.5.1 → 1.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changes.md +15 -1
- data/Gemfile.lock +10 -10
- data/README.md +23 -9
- data/bin/console +3 -0
- data/lib/parse/api/analytics.rb +1 -1
- data/lib/parse/api/objects.rb +1 -1
- data/lib/parse/api/users.rb +1 -1
- data/lib/parse/client.rb +77 -40
- data/lib/parse/client/caching.rb +9 -5
- data/lib/parse/client/protocol.rb +47 -0
- data/lib/parse/client/request.rb +66 -37
- data/lib/parse/client/response.rb +39 -21
- data/lib/parse/model/acl.rb +4 -9
- data/lib/parse/model/associations/belongs_to.rb +97 -9
- data/lib/parse/model/associations/collection_proxy.rb +89 -29
- data/lib/parse/model/associations/has_many.rb +301 -28
- data/lib/parse/model/associations/has_one.rb +98 -4
- data/lib/parse/model/associations/pointer_collection_proxy.rb +48 -16
- data/lib/parse/model/associations/relation_collection_proxy.rb +61 -36
- data/lib/parse/model/bytes.rb +11 -5
- data/lib/parse/model/classes/installation.rb +50 -3
- data/lib/parse/model/classes/role.rb +7 -2
- data/lib/parse/model/classes/session.rb +21 -4
- data/lib/parse/model/classes/user.rb +122 -22
- data/lib/parse/model/core/actions.rb +7 -3
- data/lib/parse/model/core/properties.rb +14 -13
- data/lib/parse/model/core/querying.rb +16 -10
- data/lib/parse/model/core/schema.rb +2 -3
- data/lib/parse/model/date.rb +18 -12
- data/lib/parse/model/file.rb +77 -19
- data/lib/parse/model/geopoint.rb +70 -12
- data/lib/parse/model/model.rb +84 -8
- data/lib/parse/model/object.rb +225 -94
- data/lib/parse/model/pointer.rb +94 -13
- data/lib/parse/model/push.rb +76 -4
- data/lib/parse/query.rb +356 -41
- data/lib/parse/query/constraints.rb +399 -29
- data/lib/parse/query/ordering.rb +21 -8
- data/lib/parse/stack.rb +1 -0
- data/lib/parse/stack/version.rb +2 -1
- data/lib/parse/webhooks.rb +0 -24
- data/lib/parse/webhooks/payload.rb +54 -1
- data/lib/parse/webhooks/registration.rb +13 -2
- metadata +2 -2
data/lib/parse/query/ordering.rb
CHANGED
@@ -1,17 +1,30 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
# special methods to the Symbol class. The developer can then pass one
|
6
|
-
# or an array of fields (as symbols) and call the particular ordering
|
7
|
-
# polarity (ex. :name.asc would create a Parse::Order where we want
|
8
|
-
# things to be sortd by the name field in ascending order)
|
9
|
-
# For more information about the query design pattern from DataMapper
|
10
|
-
# that inspired this, see http://datamapper.org/docs/find.html
|
4
|
+
|
11
5
|
module Parse
|
6
|
+
# This class adds support for describing ordering for Parse queries. You can
|
7
|
+
# either order by ascending (asc) or descending (desc) order.
|
8
|
+
#
|
9
|
+
# Ordering is implemented similarly to constraints in which we add
|
10
|
+
# special methods to the Symbol class. The developer can then pass one
|
11
|
+
# or an array of fields (as symbols) and call the particular ordering
|
12
|
+
# polarity (ex. _:name.asc_ would create a Parse::Order where we want
|
13
|
+
# things to be sortd by the name field in ascending order)
|
14
|
+
# For more information about the query design pattern from DataMapper
|
15
|
+
# that inspired this, see http://datamapper.org/docs/find.html'
|
16
|
+
# @example
|
17
|
+
# :name.asc # => Parse::Order by ascending :name
|
18
|
+
# :like_count.desc # => Parse::Order by descending :like_count
|
19
|
+
#
|
12
20
|
class Order
|
13
|
-
#
|
21
|
+
# The Parse operators to indicate ordering direction.
|
14
22
|
ORDERING = {asc: '', desc: '-'}.freeze
|
23
|
+
# @!attribute [rw] field
|
24
|
+
# @return [Symbol] the name of the field
|
25
|
+
# @!attribute [rw] direction
|
26
|
+
# The direction of the sorting. This is either `:asc` or `:desc`.
|
27
|
+
# @return [Symbol]
|
15
28
|
attr_accessor :field, :direction
|
16
29
|
|
17
30
|
def initialize(field, order = :asc)
|
data/lib/parse/stack.rb
CHANGED
data/lib/parse/stack/version.rb
CHANGED
data/lib/parse/webhooks.rb
CHANGED
@@ -14,30 +14,6 @@ require_relative 'model/object'
|
|
14
14
|
require_relative 'webhooks/payload'
|
15
15
|
require_relative 'webhooks/registration'
|
16
16
|
|
17
|
-
|
18
|
-
=begin
|
19
|
-
Some methods take a block, and this pattern frequently appears for a block:
|
20
|
-
|
21
|
-
{|x| x.foo}
|
22
|
-
and people would like to write that in a more concise way. In order to do that,
|
23
|
-
a symbol, the method Symbol#to_proc, implicit class casting, and & operator
|
24
|
-
are used in combination. If you put & in front of a Proc instance in the
|
25
|
-
argument position, that will be interpreted as a block. If you combine
|
26
|
-
something other than a Proc instance with &, then implicit class casting
|
27
|
-
will try to convert that to a Proc instance using to_proc method defined on
|
28
|
-
that object if there is any. In case of a Symbol instance, to_proc works in
|
29
|
-
this way:
|
30
|
-
|
31
|
-
:foo.to_proc # => ->x{x.foo}
|
32
|
-
|
33
|
-
For example, suppose you write like this:
|
34
|
-
|
35
|
-
bar(&:foo)
|
36
|
-
The & operator is combined with :foo, which is not a Proc instance, so implicit class cast applies Symbol#to_proc to it, which gives ->x{x.foo}. The & now applies to this and is interpreted as a block, which gives:
|
37
|
-
|
38
|
-
bar{|x| x.foo}
|
39
|
-
=end
|
40
|
-
|
41
17
|
module Parse
|
42
18
|
|
43
19
|
class Object
|
@@ -10,7 +10,12 @@ require 'active_support/core_ext'
|
|
10
10
|
require 'active_model_serializers'
|
11
11
|
|
12
12
|
module Parse
|
13
|
-
|
13
|
+
# Represents the data structure that Parse server sends to a registered webhook.
|
14
|
+
# Parse Parse allows you to receive Cloud Code webhooks on your own hosted
|
15
|
+
# server. The `Parse::Webhooks` class is a lightweight Rack application that
|
16
|
+
# routes incoming Cloud Code webhook requests and payloads to locally
|
17
|
+
# registered handlers. The payloads are `Parse::Payload` type of objects that
|
18
|
+
# represent that data that Parse sends webhook handlers.
|
14
19
|
class Payload
|
15
20
|
ATTRIBUTES = { master: nil, user: nil,
|
16
21
|
installationId: nil, params: nil,
|
@@ -18,6 +23,31 @@ module Parse
|
|
18
23
|
original: nil, update: nil,
|
19
24
|
triggerName: nil }.freeze
|
20
25
|
include ::ActiveModel::Serializers::JSON
|
26
|
+
# @!attribute [rw] master
|
27
|
+
# @return [Boolean] whether the master key was used for this request.
|
28
|
+
# @!attribute [rw] user
|
29
|
+
# @return [Parse::User] the user who performed this request or action.
|
30
|
+
# @!attribute [rw] installation_id
|
31
|
+
# @return [String] The identifier of the device that submitted the request.
|
32
|
+
# @!attribute [rw] params
|
33
|
+
# @return [Hash] The list of function arguments submitted for a function request.
|
34
|
+
# @!attribute [rw] function_name
|
35
|
+
# @return [String] the name of the function.
|
36
|
+
# @!attribute [rw] object
|
37
|
+
# In a beforeSave, this attribute is the final object that will be persisted.
|
38
|
+
# @return [Hash] the object hash related to a webhook trigger request.
|
39
|
+
# @see #parse_object
|
40
|
+
# @!attribute [rw] trigger_name
|
41
|
+
# @return [String] the name of the trigger (ex. beforeSave, afterSave, etc.)
|
42
|
+
# @!attribute [rw] original
|
43
|
+
# In a beforeSave, for previously saved objects, this attribute is the Parse::Object
|
44
|
+
# that was previously in the persistent store.
|
45
|
+
# @return [Hash] the object hash related to a webhook trigger request.
|
46
|
+
# @see #parse_object
|
47
|
+
# @!attribute [rw] raw
|
48
|
+
# @return [Hash] the raw payload from Parse server.
|
49
|
+
# @!attribute [rw] update
|
50
|
+
# @return [Hash] the update payload in the request.
|
21
51
|
attr_accessor :master, :user, :installation_id, :params, :function_name, :object, :trigger_name
|
22
52
|
|
23
53
|
attr_accessor :original, :update, :raw
|
@@ -25,6 +55,9 @@ module Parse
|
|
25
55
|
alias_method :functionName, :function_name
|
26
56
|
alias_method :triggerName, :trigger_name
|
27
57
|
|
58
|
+
# You would normally never create a Parse::Payload object since it is automatically
|
59
|
+
# provided to you when using Parse::Webhooks.
|
60
|
+
# @see Parse::Webhooks
|
28
61
|
def initialize(hash = {})
|
29
62
|
hash = JSON.parse(hash) if hash.is_a?(String)
|
30
63
|
hash = Hash[hash.map{ |k, v| [k.to_s.underscore.to_sym, v] }]
|
@@ -33,6 +66,7 @@ module Parse
|
|
33
66
|
@user = Parse::User.new hash[:user] if hash[:user].present?
|
34
67
|
@installation_id = hash[:installation_id]
|
35
68
|
@params = hash[:params]
|
69
|
+
@params = @params.with_indifferent_access if @params.is_a?(Hash)
|
36
70
|
@function_name = hash[:function_name]
|
37
71
|
@object = hash[:object]
|
38
72
|
@trigger_name = hash[:trigger_name]
|
@@ -40,61 +74,80 @@ module Parse
|
|
40
74
|
@update = hash[:update] || {} #it comes as an update hash
|
41
75
|
end
|
42
76
|
|
77
|
+
# @return [Hash]
|
43
78
|
def attributes
|
44
79
|
ATTRIBUTES
|
45
80
|
end
|
46
81
|
|
82
|
+
# true if this is a webhook function request.
|
47
83
|
def function?
|
48
84
|
@function_name.present?
|
49
85
|
end
|
50
86
|
|
87
|
+
# @return [String] the name of the Parse class for this request.
|
51
88
|
def parse_class
|
52
89
|
return nil unless @object.present?
|
53
90
|
@object[Parse::Model::KEY_CLASS_NAME] || @object[:className]
|
54
91
|
end
|
55
92
|
|
93
|
+
# @return [String] the objectId in this request.
|
56
94
|
def parse_id
|
57
95
|
return nil unless @object.present?
|
58
96
|
@object[Parse::Model::OBJECT_ID] || @object[:objectId]
|
59
97
|
end; alias_method :objectId, :parse_id
|
60
98
|
|
99
|
+
# true if this is a webhook trigger request.
|
61
100
|
def trigger?
|
62
101
|
@trigger_name.present?
|
63
102
|
end
|
64
103
|
|
104
|
+
# true if this is a beforeSave or beforeDelete webhook trigger request.
|
65
105
|
def before_trigger?
|
66
106
|
before_save? || before_delete?
|
67
107
|
end
|
68
108
|
|
109
|
+
# true if this is a afterSave or afterDelete webhook trigger request.
|
69
110
|
def after_trigger?
|
70
111
|
after_save? || after_delete?
|
71
112
|
end
|
72
113
|
|
114
|
+
# true if this is a beforeSave webhook trigger request.
|
73
115
|
def before_save?
|
74
116
|
trigger? && @trigger_name.to_sym == :beforeSave
|
75
117
|
end
|
76
118
|
|
119
|
+
# true if this is a afterSave webhook trigger request.
|
77
120
|
def after_save?
|
78
121
|
trigger? && @trigger_name.to_sym == :afterSave
|
79
122
|
end
|
80
123
|
|
124
|
+
# true if this is a beforeDelete webhook trigger request.
|
81
125
|
def before_delete?
|
82
126
|
trigger? && @trigger_name.to_sym == :beforeDelete
|
83
127
|
end
|
84
128
|
|
129
|
+
# true if this is a afterDelete webhook trigger request.
|
85
130
|
def after_delete?
|
86
131
|
trigger? && @trigger_name.to_sym == :afterDelete
|
87
132
|
end
|
88
133
|
|
134
|
+
# true if this request is a trigger that contains an object.
|
89
135
|
def object?
|
90
136
|
trigger? && @object.present?
|
91
137
|
end
|
92
138
|
|
139
|
+
# @return [Parse::Object] a Parse::Object from the original object
|
93
140
|
def original_parse_object
|
94
141
|
return nil unless @original.is_a?(Hash)
|
95
142
|
Parse::Object.build(@original)
|
96
143
|
end
|
97
144
|
|
145
|
+
# This method returns a Parse::Object by combining the original object, if was provided,
|
146
|
+
# with the final object. This will return a dirty tracked Parse::Object subclass,
|
147
|
+
# that will have information on which fields have changed between the previous state
|
148
|
+
# in the persistent store and the one about to be saved.
|
149
|
+
# @param pristine [Boolean] whether the object should be returned without dirty tracking.
|
150
|
+
# @return [Parse::Object] a dirty tracked Parse::Object subclass instance
|
98
151
|
def parse_object(pristine = false)
|
99
152
|
return nil unless object?
|
100
153
|
return Parse::Object.build(@object) if pristine
|
@@ -15,7 +15,7 @@ module Parse
|
|
15
15
|
|
16
16
|
ALLOWED_HOOKS = Parse::API::Hooks::TRIGGER_NAMES + [:function]
|
17
17
|
|
18
|
-
|
18
|
+
# removes all registered webhook functions with Parse Server.
|
19
19
|
def remove_all_functions!
|
20
20
|
|
21
21
|
client.functions.results.sort_by { |f| f['functionName'] }.each do |f|
|
@@ -25,6 +25,7 @@ module Parse
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
+
# removes all registered webhook triggers with Parse Server.
|
28
29
|
def remove_all_triggers!
|
29
30
|
|
30
31
|
client.triggers.results.sort_by { |f| [f['triggerName'],f['className']] }.each do |f|
|
@@ -37,6 +38,8 @@ module Parse
|
|
37
38
|
|
38
39
|
end
|
39
40
|
|
41
|
+
# Registers all webhook functions registered with Parse::Stack with Parse server.
|
42
|
+
# @param endpoint [String] a https url that points to the webhook server.
|
40
43
|
def register_functions!(endpoint)
|
41
44
|
|
42
45
|
unless endpoint.present? && endpoint.starts_with?('https://')
|
@@ -62,6 +65,9 @@ module Parse
|
|
62
65
|
|
63
66
|
end
|
64
67
|
|
68
|
+
# Registers all webhook triggers registered with Parse::Stack with Parse server.
|
69
|
+
# @param endpoint [String] a https url that points to the webhook server.
|
70
|
+
# @param include_wildcard [Boolean] Allow wildcard registrations
|
65
71
|
def register_triggers!(endpoint, include_wildcard: false)
|
66
72
|
|
67
73
|
unless endpoint.present? && endpoint.starts_with?('https://')
|
@@ -87,7 +93,7 @@ module Parse
|
|
87
93
|
classNames = routes[trigger].keys.dup
|
88
94
|
if include_wildcard && classNames.include?('*') #then create the list for all classes
|
89
95
|
classNames.delete '*' #delete the wildcard before we expand it
|
90
|
-
classNames = classNames + Parse.registered_classes
|
96
|
+
classNames = classNames + Parse.registered_classes - ['_Session']
|
91
97
|
classNames.uniq!
|
92
98
|
end
|
93
99
|
|
@@ -106,6 +112,11 @@ module Parse
|
|
106
112
|
end
|
107
113
|
end
|
108
114
|
|
115
|
+
# Registers a webhook trigger with a given endpoint url.
|
116
|
+
# @param trigger [Symbol] Trigger type based on Parse::API::Hooks::TRIGGER_NAMES or :function.
|
117
|
+
# @param name [String] the name of the webhook.
|
118
|
+
# @param url [String] the https url endpoint that will handle the request.
|
119
|
+
# @see Parse::API::Hooks::TRIGGER_NAMES
|
109
120
|
def register_webhook!(trigger, name, url)
|
110
121
|
trigger = trigger.to_s.camelize(:lower).to_sym
|
111
122
|
raise ArgumentError, "Invalid hook trigger #{trigger}" unless ALLOWED_HOOKS.include?(trigger)
|
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.5.
|
4
|
+
version: 1.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anthony Persaud
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|