mirror of
https://github.com/discourse/discourse.git
synced 2025-03-22 06:25:39 +08:00
FIX: Don't enqueue web hooks inside a deferred queue.
* The deferred queue is meant for short lived jobs and does not guarantee execution. We need to ensure that web hooks are always run.
This commit is contained in:
parent
8a1aab4e8a
commit
b3860c82da
@ -41,8 +41,8 @@ class WebHook < ActiveRecord::Base
|
|||||||
.distinct
|
.distinct
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.enqueue_hooks(type, opts = {}, web_hooks = nil)
|
def self.enqueue_hooks(type, opts = {})
|
||||||
(web_hooks || active_web_hooks(type)).each do |web_hook|
|
active_web_hooks(type).each do |web_hook|
|
||||||
Jobs.enqueue(:emit_web_hook_event, opts.merge(
|
Jobs.enqueue(:emit_web_hook_event, opts.merge(
|
||||||
web_hook_id: web_hook.id, event_type: type.to_s
|
web_hook_id: web_hook.id, event_type: type.to_s
|
||||||
))
|
))
|
||||||
@ -50,54 +50,44 @@ class WebHook < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.enqueue_object_hooks(type, object, event, serializer = nil)
|
def self.enqueue_object_hooks(type, object, event, serializer = nil)
|
||||||
Scheduler::Defer.later("Enqueue User Webhook") do
|
if active_web_hooks(type).exists?
|
||||||
web_hooks = active_web_hooks(type)
|
serializer ||= "WebHook#{type.capitalize}Serializer".constantize
|
||||||
unless web_hooks.empty?
|
|
||||||
serializer ||= "WebHook#{type.capitalize}Serializer".constantize
|
|
||||||
|
|
||||||
WebHook.enqueue_hooks(type, {
|
WebHook.enqueue_hooks(type,
|
||||||
event_name: event.to_s,
|
event_name: event.to_s,
|
||||||
payload: serializer.new(object,
|
payload: serializer.new(object,
|
||||||
scope: self.guardian,
|
scope: self.guardian,
|
||||||
root: false
|
root: false
|
||||||
).to_json
|
).to_json
|
||||||
}, web_hooks)
|
)
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.enqueue_topic_hooks(event, topic)
|
def self.enqueue_topic_hooks(event, topic)
|
||||||
Scheduler::Defer.later("Enqueue Topic Webhook") do
|
if active_web_hooks('topic').exists?
|
||||||
web_hooks = active_web_hooks('topic')
|
topic_view = TopicView.new(topic.id, Discourse.system_user)
|
||||||
unless web_hooks.empty?
|
|
||||||
topic_view = TopicView.new(topic.id, Discourse.system_user)
|
|
||||||
|
|
||||||
WebHook.enqueue_hooks(:topic, {
|
WebHook.enqueue_hooks(:topic,
|
||||||
category_id: topic&.category_id,
|
category_id: topic&.category_id,
|
||||||
event_name: event.to_s,
|
event_name: event.to_s,
|
||||||
payload: WebHookTopicViewSerializer.new(topic_view,
|
payload: WebHookTopicViewSerializer.new(topic_view,
|
||||||
scope: self.guardian,
|
scope: self.guardian,
|
||||||
root: false
|
root: false
|
||||||
).to_json
|
).to_json
|
||||||
}, web_hooks)
|
)
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.enqueue_post_hooks(event, post)
|
def self.enqueue_post_hooks(event, post)
|
||||||
Scheduler::Defer.later("Enqueue Post Webhook") do
|
if active_web_hooks('post').exists?
|
||||||
web_hooks = active_web_hooks('post')
|
WebHook.enqueue_hooks(:post,
|
||||||
|
category_id: post&.topic&.category_id,
|
||||||
unless web_hooks.empty?
|
event_name: event.to_s,
|
||||||
WebHook.enqueue_hooks(:post, {
|
payload: WebHookPostSerializer.new(post,
|
||||||
category_id: post&.topic&.category_id,
|
scope: self.guardian,
|
||||||
event_name: event.to_s,
|
root: false
|
||||||
payload: WebHookPostSerializer.new(post,
|
).to_json
|
||||||
scope: self.guardian,
|
)
|
||||||
root: false
|
|
||||||
).to_json
|
|
||||||
}, web_hooks)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user