Class: WebHook
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- WebHook
- Defined in:
- app/models/web_hook.rb
Constant Summary collapse
- EVENT_NAME_TO_EVENT_TYPE_MAP =
{ /\Atopic_\w+_status_updated\z/ => "topic_edited", "reviewable_score_updated" => "reviewable_updated", "reviewable_transitioned_to" => "reviewable_updated", }
Class Method Summary collapse
- .active_web_hooks(event) ⇒ Object
- .content_types ⇒ Object
- .default_event_types ⇒ Object
- .enqueue_hooks(type, event, opts = {}) ⇒ Object
- .enqueue_object_hooks(type, object, event, serializer = nil, opts = {}) ⇒ Object
- .enqueue_post_hooks(event, post, payload = nil) ⇒ Object
- .enqueue_topic_hooks(event, topic, payload = nil) ⇒ Object
- .generate_payload(type, object, serializer = nil) ⇒ Object
- .last_delivery_statuses ⇒ Object
- .translate_event_name_to_type(event_name) ⇒ Object
Instance Method Summary collapse
Class Method Details
.active_web_hooks(event) ⇒ Object
68 69 70 71 72 73 74 75 76 |
# File 'app/models/web_hook.rb', line 68 def self.active_web_hooks(event) event_type = translate_event_name_to_type(event) WebHook .where(active: true) .joins(:web_hook_event_types) .where("web_hooks.wildcard_web_hook = ? OR web_hook_event_types.name = ?", true, event_type) .distinct end |
.content_types ⇒ Object
28 29 30 |
# File 'app/models/web_hook.rb', line 28 def self.content_types @content_types ||= Enum.new("application/json" => 1, "application/x-www-form-urlencoded" => 2) end |
.default_event_types ⇒ Object
36 37 38 39 40 41 42 43 44 45 |
# File 'app/models/web_hook.rb', line 36 def self.default_event_types WebHookEventType.where( id: [ WebHookEventType::TYPES[:post_created], WebHookEventType::TYPES[:post_edited], WebHookEventType::TYPES[:post_destroyed], WebHookEventType::TYPES[:post_recovered], ], ) end |
.enqueue_hooks(type, event, opts = {}) ⇒ Object
78 79 80 81 82 83 84 85 |
# File 'app/models/web_hook.rb', line 78 def self.enqueue_hooks(type, event, opts = {}) active_web_hooks(event).each do |web_hook| Jobs.enqueue( :emit_web_hook_event, opts.merge(web_hook_id: web_hook.id, event_name: event.to_s, event_type: type.to_s), ) end end |
.enqueue_object_hooks(type, object, event, serializer = nil, opts = {}) ⇒ Object
87 88 89 90 91 92 93 |
# File 'app/models/web_hook.rb', line 87 def self.enqueue_object_hooks(type, object, event, serializer = nil, opts = {}) if active_web_hooks(event).exists? payload = WebHook.generate_payload(type, object, serializer) WebHook.enqueue_hooks(type, event, opts.merge(id: object.id, payload: payload)) end end |
.enqueue_post_hooks(event, post, payload = nil) ⇒ Object
114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'app/models/web_hook.rb', line 114 def self.enqueue_post_hooks(event, post, payload = nil) if active_web_hooks(event).exists? && post.present? payload ||= WebHook.generate_payload(:post, post) WebHook.enqueue_hooks( :post, event, id: post.id, category_id: post.topic&.category_id, tag_ids: post.topic&.&.pluck(:id), payload: payload, ) end end |
.enqueue_topic_hooks(event, topic, payload = nil) ⇒ Object
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'app/models/web_hook.rb', line 95 def self.enqueue_topic_hooks(event, topic, payload = nil) if active_web_hooks(event).exists? && topic.present? payload ||= begin topic_view = TopicView.new(topic.id, Discourse.system_user, skip_staff_action: true) WebHook.generate_payload(:topic, topic_view, WebHookTopicViewSerializer) end WebHook.enqueue_hooks( :topic, event, id: topic.id, category_id: topic.category_id, tag_ids: topic..pluck(:id), payload: payload, ) end end |
.generate_payload(type, object, serializer = nil) ⇒ Object
129 130 131 132 133 134 |
# File 'app/models/web_hook.rb', line 129 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 |
.last_delivery_statuses ⇒ Object
32 33 34 |
# File 'app/models/web_hook.rb', line 32 def self.last_delivery_statuses @last_delivery_statuses ||= Enum.new(inactive: 1, failed: 2, successful: 3, disabled: 4) end |
.translate_event_name_to_type(event_name) ⇒ Object
57 58 59 60 61 62 63 64 65 66 |
# File 'app/models/web_hook.rb', line 57 def self.translate_event_name_to_type(event_name) EVENT_NAME_TO_EVENT_TYPE_MAP.each do |key, value| if key.is_a?(Regexp) return value if event_name.to_s =~ key else return value if event_name.to_s == key end end event_name.to_s end |
Instance Method Details
#strip_url ⇒ Object
47 48 49 |
# File 'app/models/web_hook.rb', line 47 def strip_url self.payload_url = (payload_url || "").strip.presence end |
#tag_names=(tag_names_arg) ⇒ Object
24 25 26 |
# File 'app/models/web_hook.rb', line 24 def tag_names=(tag_names_arg) DiscourseTagging.(self, tag_names_arg, unlimited: true) end |