Class: Jobs::PushNotification
- 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.}") end end end |