Class: WebHook

Inherits:
ActiveRecord::Base
  • Object
show all
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

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_typesObject



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_typesObject



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&.tags&.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.tags.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_statusesObject



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_urlObject



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.add_or_create_tags_by_name(self, tag_names_arg, unlimited: true)
end