webhook_system 2.0.0 → 2.1.0
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/README.md +35 -1
- data/lib/webhook_system/base_event.rb +7 -2
- data/lib/webhook_system/subscription.rb +10 -0
- data/lib/webhook_system/version.rb +1 -1
- data/lib/webhook_system.rb +0 -4
- metadata +2 -3
- data/lib/webhook_system/dispatcher.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90f58d18463b764007411f0afe4d73c5bb57355b
|
4
|
+
data.tar.gz: cceb480b7c982ec3cf245583be982d6f774bd25c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f923b7323b1b3eef8a4d9ed1db3315c66e1ee96daaf6397a37d52fe171aef8696a73224a3f9edc2e6215223a5cea1b78156a39cc59eab379003e41c29a71702f
|
7
|
+
data.tar.gz: 97de701df22a41e2d5d3ec80204be6422c2a9a07c04f6a0c61f0bfe3237266c4de9310e754c43459e60336618b1347ed33a208ee22c28b183051666b966d9938
|
data/README.md
CHANGED
@@ -203,12 +203,46 @@ more suitable for the actual notification payload.
|
|
203
203
|
The general API for this is via:
|
204
204
|
|
205
205
|
```ruby
|
206
|
-
WebhookSystem.dispatch(event_object)
|
206
|
+
WebhookSystem::Subscription.dispatch(event_object)
|
207
207
|
```
|
208
208
|
|
209
209
|
This is meant to be fairly fire and forget. Internally this will create an ActiveJob for each subscription
|
210
210
|
interested in the event.
|
211
211
|
|
212
|
+
### Dispatching to Selected Subscriptions
|
213
|
+
|
214
|
+
There may be scenarios where you extended the Subscription model, and may need to only dispatch to a subset of subs.
|
215
|
+
For example, if you attached a relation to say Account. The `dispatch` method is actually defined to work with any
|
216
|
+
subscription relation. eg:
|
217
|
+
|
218
|
+
```ruby
|
219
|
+
account = Account.find(1) # assume we have some model called Account
|
220
|
+
subs = account.webhook_subscriptions # and we added a column to webhook_subscriptions to accomodate this extra relation
|
221
|
+
subs.dispatch(some_event) # you can dispatch to just those subscriptions (it will filter for the specific ones)
|
222
|
+
# that are actually interested in the event
|
223
|
+
```
|
224
|
+
|
225
|
+
### Checking if any sub is interested
|
226
|
+
|
227
|
+
There may scenarios, where you really don't want to do some additional work unless you really have an event to dispatch.
|
228
|
+
You can check pretty quickly if there is any topics interested liks so:
|
229
|
+
|
230
|
+
```ruby
|
231
|
+
if WebhookSystem::Subscription.interested_in_topic('some_topic').present?
|
232
|
+
# do some stuff
|
233
|
+
end
|
234
|
+
```
|
235
|
+
|
236
|
+
This also works with selected subscriptions like in the example above:
|
237
|
+
|
238
|
+
```ruby
|
239
|
+
account = Account.find(1) # assume we have some model called Account
|
240
|
+
subs = account.webhook_subscriptions # and we added a column to webhook_subscriptions to accomodate this extra relation
|
241
|
+
if subs.interested_in_topic('some_topic').present?
|
242
|
+
subs.dispatch(SomeEvent.build(some_expensive_function()))
|
243
|
+
end
|
244
|
+
```
|
245
|
+
|
212
246
|
# Payload Format
|
213
247
|
|
214
248
|
Payloads can either be plain json or encrypted. On top of that, they're also signed. The format for the signature
|
@@ -13,12 +13,12 @@ module WebhookSystem
|
|
13
13
|
|
14
14
|
def event_name
|
15
15
|
mesg = "class #{self.class.name} must implement abstract method `#{self.class.name}#event_name()'."
|
16
|
-
raise RuntimeError.new(mesg)
|
16
|
+
raise with_caller_backtrace(RuntimeError.new(mesg), 2)
|
17
17
|
end
|
18
18
|
|
19
19
|
def payload_attributes
|
20
20
|
mesg = "class #{self.class.name} must implement abstract method `#{self.class.name}#payload_attributes()'."
|
21
|
-
raise RuntimeError.new(mesg)
|
21
|
+
raise with_caller_backtrace(RuntimeError.new(mesg), 2)
|
22
22
|
end
|
23
23
|
|
24
24
|
def as_json
|
@@ -39,6 +39,11 @@ module WebhookSystem
|
|
39
39
|
|
40
40
|
private
|
41
41
|
|
42
|
+
def with_caller_backtrace(exception, backtrack=2)
|
43
|
+
exception.set_backtrace(caller[backtrack..-1])
|
44
|
+
exception
|
45
|
+
end
|
46
|
+
|
42
47
|
def validate_attribute_name(key)
|
43
48
|
if self.class.key_is_reserved?(key)
|
44
49
|
message = "#{self.class.name} should not be defining an attribute named #{key} since its reserved"
|
@@ -19,6 +19,16 @@ module WebhookSystem
|
|
19
19
|
|
20
20
|
scope :interested_in_topic, -> (topic) { active.for_topic(topic) }
|
21
21
|
|
22
|
+
# Main invocation point for dispatching events, can either be called on the class
|
23
|
+
# or on a relation (ie a scoped down list of subs), will find applicable subs and dispatch to them
|
24
|
+
#
|
25
|
+
# @param [WebhookSystem::BaseEvent] event The Event Object
|
26
|
+
def self.dispatch(event)
|
27
|
+
interested_in_topic(event.event_name).each do |subscription|
|
28
|
+
WebhookSystem::Job.perform_later subscription, event.as_json
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
22
32
|
# Just a helper to get a nice representation of the subscription
|
23
33
|
def url_domain
|
24
34
|
URI.parse(url).host
|
data/lib/webhook_system.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webhook_system
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Banasik
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-07-
|
12
|
+
date: 2016-07-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -286,7 +286,6 @@ files:
|
|
286
286
|
- Rakefile
|
287
287
|
- lib/webhook_system.rb
|
288
288
|
- lib/webhook_system/base_event.rb
|
289
|
-
- lib/webhook_system/dispatcher.rb
|
290
289
|
- lib/webhook_system/encoder.rb
|
291
290
|
- lib/webhook_system/event_log.rb
|
292
291
|
- lib/webhook_system/job.rb
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module WebhookSystem
|
2
|
-
|
3
|
-
# Main code that handles dispatching of events out to subscribers
|
4
|
-
class Dispatcher
|
5
|
-
class << self
|
6
|
-
|
7
|
-
# @param [WebhookSystem::BaseEvent] event The Event Object
|
8
|
-
def dispatch(event)
|
9
|
-
WebhookSystem::Subscription.interested_in_topic(event.event_name).each do |subscription|
|
10
|
-
WebhookSystem::Job.perform_later subscription, event.as_json
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|