Class: Decidim::SendPushNotification

Inherits:
Object
  • Object
show all
Includes:
ActionView::Helpers::UrlHelper
Defined in:
app/services/decidim/send_push_notification.rb

Overview

This class generates a notification based on the given event, for the given resource/recipient couple. It is intended to be used by the ‘Decidim::NotificationGenerator` class, which schedules a job for each recipient of the event, so that we can easily control which jobs fail.

Instance Method Summary collapse

Instance Method Details

#perform(notification, title = nil) ⇒ Array<Net::HTTPCreated>?

Send the push notification. Returns ‘nil` if the user did not allowed push notifications or if the subscription to push notifications does not exist

Parameters:

Returns:

  • (Array<Net::HTTPCreated>, nil)

    the result of the dispatch or nil if user or subscription are empty

Raises:

  • (ArgumentError)


21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'app/services/decidim/send_push_notification.rb', line 21

def perform(notification, title = nil)
  return unless Rails.application.secrets.dig(:vapid, :enabled)
  raise ArgumentError, "Need to provide a title if the notification is a PushNotificationMessage" if notification.is_a?(Decidim::PushNotificationMessage) && title.nil?

  user = notification.user

  I18n.with_locale(user.locale || user.organization.default_locale) do
    user.notifications_subscriptions.values.map do |subscription|
      payload = build_payload(message_params(notification, title), subscription)
      # Capture webpush exceptions in order to avoid this call to be repeated by the background job runner
      # Webpush::Error class is the parent class of all defined errors
      begin
        WebPush.payload_send(**payload)
      rescue WebPush::Error => e
        Rails.logger.warn("[ERROR] Push notification delivery failed due to #{e.message}")
        nil
      end
    end.compact
  end
end