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
45
46
47
48
49
50
51
52
53
54
55
# File 'app/jobs/regular/push_notification.rb', line 5

def execute(args)
  user = User.find_by(id: args["user_id"])
  push_window = SiteSetting.push_notification_time_window_mins
  return if !user || (push_window > 0 && user.seen_since?(push_window.minutes.ago))

  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 if push_url.blank?

      uri = URI.parse(push_url)

      http = FinalDestination::HTTP.new(uri.host, uri.port)
      http.use_ssl = uri.scheme == "https"

      request =
        FinalDestination::HTTP::Post.new(
          uri.request_uri,
          { "Content-Type" => "application/json" },
        )
      request.body = payload.merge(notifications: notifications).to_json

      begin
        response = http.request(request)

        if response.code.to_i != 200
          Rails.logger.warn(
            "Failed to push a notification to #{push_url} Status: #{response.code}: #{response.body}",
          )
        end
      rescue => e
        Rails.logger.error("An error occurred while pushing a notification: #{e.message}")
      end
    end
end