FIX: Generate webhook payloads before destroy events (#6325)

This commit is contained in:
Vinoth Kannan
2018-10-05 14:23:59 +05:30
committed by Guo Xiang Tan
parent 5b630f3188
commit 8430ea927e
11 changed files with 90 additions and 29 deletions

View File

@@ -8,6 +8,7 @@ class Category < ActiveRecord::Base
include HasCustomFields
include CategoryHashtag
include AnonCacheInvalidator
include HasDestroyedWebHook
REQUIRE_TOPIC_APPROVAL = 'require_topic_approval'
REQUIRE_REPLY_APPROVAL = 'require_reply_approval'

View File

@@ -0,0 +1,17 @@
module HasDestroyedWebHook
extend ActiveSupport::Concern
included do
around_destroy :enqueue_destroyed_web_hook
end
def enqueue_destroyed_web_hook
type = self.class.name.underscore.to_sym
payload = WebHook.generate_payload(type, self)
yield
WebHook.enqueue_hooks(type, "#{type}_destroyed".to_sym,
id: id,
payload: payload
)
end
end

View File

@@ -5,6 +5,7 @@ require_dependency 'enum'
class Group < ActiveRecord::Base
include HasCustomFields
include AnonCacheInvalidator
include HasDestroyedWebHook
cattr_accessor :preloaded_custom_field_names
self.preloaded_custom_field_names = Set.new

View File

@@ -1,5 +1,6 @@
class Tag < ActiveRecord::Base
include Searchable
include HasDestroyedWebHook
validates :name, presence: true, uniqueness: true

View File

@@ -19,6 +19,7 @@ class User < ActiveRecord::Base
include Roleable
include HasCustomFields
include SecondFactorManager
include HasDestroyedWebHook
has_many :posts
has_many :notifications, dependent: :destroy

View File

@@ -41,24 +41,21 @@ class WebHook < ActiveRecord::Base
.distinct
end
def self.enqueue_hooks(type, opts = {})
def self.enqueue_hooks(type, event, opts = {})
active_web_hooks(type).each do |web_hook|
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_name: event.to_s, event_type: type.to_s
))
end
end
def self.enqueue_object_hooks(type, object, event, serializer = nil)
if active_web_hooks(type).exists?
serializer ||= "WebHook#{type.capitalize}Serializer".constantize
payload = WebHook.generate_payload(type, object, serializer)
WebHook.enqueue_hooks(type,
event_name: event.to_s,
payload: serializer.new(object,
scope: self.guardian,
root: false
).to_json
WebHook.enqueue_hooks(type, event,
id: object.id,
payload: payload
)
end
end
@@ -66,31 +63,38 @@ class WebHook < ActiveRecord::Base
def self.enqueue_topic_hooks(event, topic)
if active_web_hooks('topic').exists?
topic_view = TopicView.new(topic.id, Discourse.system_user)
payload = WebHook.generate_payload(:topic, topic_view, WebHookTopicViewSerializer)
WebHook.enqueue_hooks(:topic,
WebHook.enqueue_hooks(:topic, event,
id: topic.id,
category_id: topic&.category_id,
event_name: event.to_s,
payload: WebHookTopicViewSerializer.new(topic_view,
scope: self.guardian,
root: false
).to_json
payload: payload
)
end
end
def self.enqueue_post_hooks(event, post)
if active_web_hooks('post').exists?
WebHook.enqueue_hooks(:post,
payload = WebHook.generate_payload(:post, post)
WebHook.enqueue_hooks(:post, event,
id: post.id,
category_id: post&.topic&.category_id,
event_name: event.to_s,
payload: WebHookPostSerializer.new(post,
scope: self.guardian,
root: false
).to_json
payload: payload
)
end
end
def self.generate_payload(type, object, serializer = nil)
serializer ||= TagSerializer if type == :tag
serializer ||= "WebHook#{type.capitalize}Serializer".constantize
serializer.new(object,
scope: self.guardian,
root: false
).to_json
end
private
def self.guardian