mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
FIX: Generate webhook payloads before destroy events (#6325)
This commit is contained in:
committed by
Guo Xiang Tan
parent
5b630f3188
commit
8430ea927e
@@ -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'
|
||||
|
||||
17
app/models/concerns/has_destroyed_web_hook.rb
Normal file
17
app/models/concerns/has_destroyed_web_hook.rb
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
class Tag < ActiveRecord::Base
|
||||
include Searchable
|
||||
include HasDestroyedWebHook
|
||||
|
||||
validates :name, presence: true, uniqueness: true
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ class User < ActiveRecord::Base
|
||||
include Roleable
|
||||
include HasCustomFields
|
||||
include SecondFactorManager
|
||||
include HasDestroyedWebHook
|
||||
|
||||
has_many :posts
|
||||
has_many :notifications, dependent: :destroy
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user