Class: Jobs::PushNotification

Inherits:
Base
  • Object
show all
Defined in:
app/jobs/regular/push_notification.rb

Instance Method Summary collapse

Methods inherited from Base

acquire_cluster_concurrency_lock!, clear_cluster_concurrency_lock!, cluster_concurrency, cluster_concurrency_redis_key, delayed_perform, #error_context, get_cluster_concurrency, #last_db_duration, #log, #perform, #perform_immediately

Instance Method Details

#execute(args) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'app/jobs/regular/push_notification.rb', line 5

def execute(args)
  notification = args["payload"]
  notification["url"] = UrlHelper.absolute_without_cdn(
    Discourse.base_path + notification["post_url"],
  )
  notification.delete("post_url")

  payload = {
    secret_key: SiteSetting.push_api_secret_key,
    url: Discourse.base_url,
    title: SiteSetting.title,
    description: SiteSetting.site_description,
  }

  clients = args["clients"]
  clients
    .group_by { |r| r[1] }
    .each do |push_url, group|
      notifications = group.map { |client_id, _| notification.merge(client_id: client_id) }

      next unless push_url.present?

      result =
        Excon.post(
          push_url,
          body: payload.merge(notifications: notifications).to_json,
          headers: {
            "Content-Type" => "application/json",
            "Accept" => "application/json",
          },
        )

      if result.status != 200
        # we failed to push a notification ... log it
        Rails.logger.warn(
          "Failed to push a notification to #{push_url} Status: #{result.status}: #{result.status_line}",
        )
      end
    end
end