diff options
Diffstat (limited to 'app/services')
-rw-r--r-- | app/services/notify_service.rb | 5 | ||||
-rw-r--r-- | app/services/send_push_notification_service.rb | 28 |
2 files changed, 33 insertions, 0 deletions
diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb index 1ec36637c..d1504cadf 100644 --- a/app/services/notify_service.rb +++ b/app/services/notify_service.rb @@ -10,6 +10,7 @@ class NotifyService < BaseService create_notification send_email if email_enabled? + send_push_notification rescue ActiveRecord::RecordInvalid return end @@ -57,6 +58,10 @@ class NotifyService < BaseService NotificationMailer.send(@notification.type, @recipient, @notification).deliver_later end + def send_push_notification + PushNotificationWorker.perform_async(@notification.id) + end + def email_enabled? @recipient.user.settings.notification_emails[@notification.type] end diff --git a/app/services/send_push_notification_service.rb b/app/services/send_push_notification_service.rb new file mode 100644 index 000000000..802614fce --- /dev/null +++ b/app/services/send_push_notification_service.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +class SendPushNotificationService < BaseService + def call(notification) + return if ENV['FCM_API_KEY'].blank? + + devices = Device.where(account: notification.account).pluck(:registration_id) + fcm = FCM.new(ENV['FCM_API_KEY']) + + response = fcm.send(devices, data: { notification_id: notification.id }, collapse_key: :notifications, priority: :high) + handle_response(response) + end + + private + + def handle_response(response) + update_canonical_ids(response[:canonical_ids]) if response[:canonical_ids] + remove_bad_ids(response[:not_registered_ids]) if response[:not_registered_ids] + end + + def update_canonical_ids(ids) + ids.each { |pair| Device.find_by(registration_id: pair[:old]).update(registration_id: pair[:new]) } + end + + def remove_bad_ids(bad_ids) + Device.where(registration_id: bad_ids).delete_all + end +end |