-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathsubscription.rb
78 lines (70 loc) · 2.85 KB
/
subscription.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
class Subscription
def self.keyname(service)
"claim_review_webhooks_#{service}"
end
def self.get_existing_params_for_url(service, url)
JSON.parse(StoredSubscription.get_subscription_for_url(service, url)['params']) || {}
end
def self.add_subscription(services, urls, languages=nil)
languages = [languages].flatten.compact
[services].flatten.collect do |service|
[urls].flatten.collect do |url|
existing_params = self.get_existing_params_for_url(service, url)
existing_params["language"] ||= []
languages.each do |language|
existing_params["language"] << language if !existing_params["language"].include?(language)
end
StoredSubscription.store_subscription(service, url, existing_params)
end
end.flatten
end
def self.remove_subscription(services, urls)
[services].flatten.collect do |service|
[urls].flatten.collect do |url|
StoredSubscription.delete_subscription(service, url)
end
end.flatten
end
def self.get_subscriptions(services)
Hash[[services].flatten.collect do |service|
webhooks = StoredSubscription.get_subscriptions_for_service(service)
[service, Hash[webhooks.collect{|wh| [wh["subscription_url"], JSON.parse(wh["params"])]}]]
end]
end
def self.claim_review_can_be_sent(webhook_url, webhook_params, claim_review)
webhook_params ||= {}
no_language_restriction = webhook_params["language"].nil? || webhook_params["language"].empty?
language_matches = (webhook_params["language"] && webhook_params["language"].include?(claim_review[:inLanguage]))
return no_language_restriction || language_matches
end
def self.send_webhook_notification(webhook_url, webhook_params, claim_review)
if self.claim_review_can_be_sent(webhook_url, webhook_params, claim_review)
request_params = {
:method => :post,
:url => webhook_url,
:payload => {claim_review: claim_review}.to_json,
:headers => {content_type: 'application/json'},
:timeout => 10,
:open_timeout => 10
}
puts "Sending Subscriber Notification with params of #{request_params.inspect}"
RestClient::Request.execute(
request_params
)
end
end
def self.safe_send_webhook_notification(webhook_url, webhook_params, claim_review, raise_error=true)
begin
self.send_webhook_notification(webhook_url, webhook_params, claim_review)
rescue => e
Error.log(e, {webhook_url: webhook_url, webhook_params: webhook_params, claim_review: claim_review}, raise_error)
end
end
def self.notify_subscribers(services, claim_review)
Subscription.get_subscriptions(services).values.each do |subscription|
subscription.each do |webhook_url, webhook_params|
self.safe_send_webhook_notification(webhook_url, webhook_params, claim_review)
end
end
end
end