diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2017-01-29 01:30:32 +0100 |
---|---|---|
committer | Eugen Rochko <eugen@zeonfederated.com> | 2017-01-29 01:30:32 +0100 |
commit | 3f075c7794ca7cc6e3c566591e9929859c6c325c (patch) | |
tree | fd649accdafbb57cf1ac5d7231dd44bd5dd447c8 /app/services | |
parent | 1992575d577bf5b4c408a0104ad310e17846466a (diff) |
API for apps to register for push notifications
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 |